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