1 /*
2 *
3 * C++ Portable Types Library (PTypes)
4 * Version 2.1.1 Released 27-Jun-2007
5 *
6 * Copyright (C) 2001-2007 Hovik Melikyan
7 *
8 * http://www.melikyan.com/ptypes/
9 *
10 */
11
12 #include <stdlib.h>
13 #include <stdio.h>
14
15 #include "ptypes.h"
16
17 #include "config.h"
18
19
20 USING_PTYPES
21
22
23 const char* SERVER_APP_NAME = "wshare/1.3"
24 #ifdef WIN32
25 " (Win32)";
26 #else
27 " (UNIX)";
28 #endif
29
30 const char* DEF_MIME_TYPE = "text/plain"; // no extension
31 const char* DEF_BINARY_TYPE = "application/octet-stream"; // for unix binaries with no extension
32
33
34 const char* STD_CSS =
35 "<style type=text/css>\n"
36 "<!--\n"
37 "body{font-family:Verdana,sans-serif;font-size:9pt}\n"
38 "h3{font-size:13pt}\n"
39 "pre{font-family:Courier New,cour}\n"
40 "-->\n"
41 "</style>\n";
42
43
44 const char* cfg_index_files[] =
45 {
46 "index.html",
47 "Index.html",
48 "default.htm",
49 // add your default index files here
50 NULL // terminator
51 };
52
53
54 // configurable parameters
55
56 string cfg_server_name;
57 string cfg_document_root;
58 int cfg_port = DEF_HTTP_PORT;
59 bool cfg_syslog = true;
60 bool cfg_dir_indexes = false;
61 bool cfg_def_index_files = true;
62 bool cfg_log_referer = true;
63 bool cfg_file_mtime = true;
64 bool cfg_daemonize = false;
65 string cfg_user;
66 string cfg_group;
67 string cfg_log_file;
68 int cfg_max_clients = DEF_MAX_CLIENTS;
69 int cfg_max_keep_alive = (DEF_MAX_CLIENTS * 2) / 3;
70
71 char* myname = "wshare";
72
73
usage()74 static void usage()
75 {
76 static const char* usage_str =
77 "%s, a simple HTTP daemon.\n\n"
78 "usage: %s [options] document-root\n\n"
79 " -D daemonize, UNIX only\n"
80 " -d allow directory indexes\n"
81 " -g group group ID to run as, UNIX only\n"
82 " -n num maximum number of simultaneous connections (default: %d)\n"
83 " -o file-name write HTTP access log to file-name\n"
84 " -p port-num port number to listen to\n"
85 " -u user user ID to run as, UNIX only\n"
86 " -x always show directory indexes (ignore default index files)\n"
87 "\n";
88
89 printf(usage_str, pconst(SERVER_APP_NAME), myname, DEF_MAX_CLIENTS);
90 exit(255);
91 }
92
93
94 static int arg_count;
95 static char** args;
96 static char* arg_ptr;
97 static int arg_num;
98
99
arg_param()100 static char* arg_param()
101 {
102 arg_ptr++;
103 if (*arg_ptr == 0)
104 {
105 if (++arg_num >= arg_count)
106 usage();
107 arg_ptr = args[arg_num];
108 }
109 char* res = arg_ptr;
110 arg_ptr += strlen(res);
111 return res;
112 }
113
114
config_init(int argc,char * argv[])115 void config_init(int argc, char* argv[])
116 {
117 arg_count = argc;
118 args = argv;
119
120 if (arg_count == 1)
121 usage();
122
123 arg_num = 1;
124 while (arg_num < arg_count)
125 {
126 arg_ptr = args[arg_num];
127 if (*arg_ptr != '-')
128 {
129 cfg_document_root = arg_ptr;
130 arg_num++;
131 continue;
132 }
133
134 arg_ptr++;
135
136 opt2:
137 switch(*arg_ptr)
138 {
139 case 'D': cfg_daemonize = true; arg_ptr++; break;
140 case 'd': cfg_dir_indexes = true; arg_ptr++; break;
141 case 'n':
142 cfg_max_clients = atoi(arg_param());
143 cfg_max_keep_alive = (cfg_max_clients * 2) / 3;
144 break;
145 case 'o': cfg_log_file = arg_param(); break;
146 case 'p': cfg_port = atoi(arg_param()); break;
147 case 'x': cfg_def_index_files = false; cfg_dir_indexes = true; arg_ptr++; break;
148 case 'u': cfg_user = arg_param(); break;
149 case 'g': cfg_group = arg_param(); break;
150 default: usage(); break;
151 }
152
153 if (*arg_ptr != 0)
154 goto opt2;
155
156 arg_num++;
157 }
158
159 if (isempty(cfg_document_root))
160 usage();
161 }
162
163
config_done()164 void config_done()
165 {
166 }
167
168