extract server code into separared file
[webserver.git] / webserver.c
1 /* depend: */
2 /* cflags: */
3 /* linker: color.o debug.o server.o */
4
5 #include <assert.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8
9 #include "debug.h"
10 #include "server.h"
11
12 /* types */
13
14 /* constants */
15
16 #define BUFFER_SIZE 4096
17
18 /* macros */
19
20 /* gobal variables */
21
22 char *progname = NULL;
23 int port = 8080;
24
25 /* help function */
26
27 int usage (int ret)
28 {
29 FILE *fid = ret ? stderr : stdout;
30 fprintf (fid, "usage: %s\n", progname);
31 fprintf (fid, " -h : help message\n");
32 fprintf (fid, " -p : port number (%d)\n", port);
33 fprintf (fid, " -v : verbose level (%d)\n", verbose);
34
35 return ret;
36 }
37
38 /* main function */
39
40 int main (int argc, char *argv[])
41 {
42 int i = 0;
43 int ret = 0;
44
45 /* program name */
46
47 progname = argv[0];
48 while (progname[i] != '\0') {
49 if ((progname[i] == '/') || (progname[i] == '\\')) {
50 progname += i + 1;
51 i = 0;
52 } else {
53 i++;
54 }
55 }
56
57 /* argument processing */
58
59 while (argc-- > 1) {
60 char *arg = *(++argv);
61 if (arg[0] != '-') {
62 VERBOSE (ERROR, fprintf (stderr, "%s: invalid option -- '%s'\n", progname, arg); usage (1));
63 return 1;
64 }
65 char c = arg[1];
66 switch (c) {
67 case 'p':
68 arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
69 if (arg == NULL) {
70 VERBOSE (ERROR, fprintf (stderr, "%s: missing port number\n", progname); usage (1));
71 return 1;
72 }
73 port = atoi (arg);
74 if (port <= 0) {
75 VERBOSE (ERROR, fprintf (stderr, "%s: incorrect port number (%s)\n", progname, arg); usage (1));
76 return 1;
77 }
78 break;
79 case 'v':
80 arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
81 if (arg == NULL) {
82 VERBOSE (ERROR, fprintf (stderr, "%s: missing verbose level\n", progname); usage (1));
83 return 1;
84 }
85 verbose = atoi (arg);
86 break;
87 case 'h':
88 default:
89 return usage (c != 'h');
90 }
91 }
92
93 VERBOSE (DEBUG, fprintf (stdout, "Initializing socket\n"));
94 socket_t sock = open_listening_socket (port);
95 if (sock == (socket_t)-1) {
96 VERBOSE (ERROR, fprintf (stderr, "Can't open listening socket\n"));
97 return 1;
98 }
99
100 VERBOSE (INFO, fprintf (stdout, "Listening socket on port %d\n", port));
101 sleep (2);
102
103 VERBOSE (DEBUG, fprintf (stdout, "Closing socket\n"));
104 close_listening_socket (sock);
105
106 return ret;
107 }
108
109 // test: webserver.exe -h
110 // test: webserver.exe -h | awk '/usage:/ { rc=1 } END { exit (1-rc) }'
111 // test: webserver.exe -_ 2> /dev/null | wc -l | xargs test 0 =
112 // test: webserver.exe -_ 2>&1 | awk '/usage:/ { rc=1 } END { exit (1-rc) }'
113 // test: webserver.exe error 2>&1 | grep -q 'invalid option'
114 // test: webserver.exe -v 2>&1 | grep -q 'missing verbose level'
115 // test: webserver.exe -p 2>&1 | grep -q 'missing port number'
116 // test: webserver.exe -p -1 2>&1 | grep -q 'incorrect port number'
117 // test: webserver.exe | grep -q 'Listening socket on port 8080'
118 // test: webserver.exe -p 8000 | grep -q 'Listening socket on port 8000'
119
120 /* vim: set ts=4 sw=4 et: */