cleaning
[webserver.git] / webserver.c
CommitLineData
8512671a
LM
1/* depend: */
2/* cflags: */
00afbb65 3/* linker: color.o debug.o server.o */
8512671a 4
184be781 5#include <assert.h>
8512671a
LM
6#include <stdio.h>
7#include <stdlib.h>
8
9#include "debug.h"
00afbb65 10#include "server.h"
8512671a 11
184be781
LM
12/* types */
13
8512671a
LM
14/* constants */
15
16#define BUFFER_SIZE 4096
17
18/* macros */
19
20/* gobal variables */
21
22char *progname = NULL;
21ac031b 23int port = 8080;
8512671a
LM
24
25/* help function */
26
27int usage (int ret)
28{
29 FILE *fid = ret ? stderr : stdout;
30 fprintf (fid, "usage: %s\n", progname);
31 fprintf (fid, " -h : help message\n");
21ac031b 32 fprintf (fid, " -p : port number (%d)\n", port);
8512671a
LM
33 fprintf (fid, " -v : verbose level (%d)\n", verbose);
34
35 return ret;
36}
37
38/* main function */
39
40int 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) {
21ac031b 67 case 'p':
8512671a
LM
68 arg = (arg[2]) ? arg + 2 : (--argc > 0) ? *(++argv) : NULL;
69 if (arg == NULL) {
21ac031b
LM
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));
8512671a
LM
76 return 1;
77 }
8512671a 78 break;
8512671a
LM
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
184be781
LM
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
8512671a
LM
106 return ret;
107}
108
109// test: webserver.exe -h
110// test: webserver.exe -h | awk '/usage:/ { rc=1 } END { exit (1-rc) }'
21ac031b 111// test: webserver.exe -_ 2> /dev/null | wc -l | xargs test 0 =
8512671a
LM
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'
21ac031b
LM
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'
184be781
LM
117// test: webserver.exe | grep -q 'Listening socket on port 8080'
118// test: webserver.exe -p 8000 | grep -q 'Listening socket on port 8000'
8512671a
LM
119
120/* vim: set ts=4 sw=4 et: */