X-Git-Url: http://git.droids-corp.org/?p=libcmdline.git;a=blobdiff_plain;f=src%2Fevent_server%2Fmain.c;fp=src%2Fevent_server%2Fmain.c;h=eb88dbb929e40d2497cc37b029c97fb0c394829c;hp=289bd710d4e5b75a70ce1070406cea144e01b685;hb=f95c37e3cf4d9ed5cb4ad1899e80d19fca888118;hpb=42d8264dd0ef02b7764c0cce18231eafc1062257 diff --git a/src/event_server/main.c b/src/event_server/main.c index 289bd71..eb88dbb 100644 --- a/src/event_server/main.c +++ b/src/event_server/main.c @@ -29,15 +29,15 @@ #include #include #include -#include #include #include #include #include -#include #include -#include #include +#include + +#include #include #include @@ -46,9 +46,10 @@ #include -extern cmdline_parse_ctx_t main_ctx[]; +static struct sockaddr addr; +static uint16_t port = 1234; -/*** main */ +extern cmdline_parse_ctx_t main_ctx[]; static void evt_server_input(int s, short event, void *arg) @@ -95,19 +96,118 @@ evt_server_new_connection(int s, short event, void *arg) event_add(evt, NULL); } +static void +usage(const char *prgname) +{ + printf("%s [-a ADDRESS] [-p PORT]\n" + "\n" + "Start a command line server on a TCP listen socket. This example\n" + "uses the libevent to support several simultaneous connections.\n" + "The default behaviour is to listen on 0.0.0.0:1234\n" + "\n" + " -a ADDR: IPv4 or IPv6 local address to listen on (default\n" + " is 0.0.0.0).\n" + " -p PORT: port to listen on (default is 1234).\n", + prgname); +} + +/* Parse the argument given in the command line of the application */ +static int +parse_args(int argc, char **argv) +{ + int opt, ret; + char **argvopt; + int option_index; + char *prgname = argv[0]; + char *end = NULL; + static struct option lgopts[] = { + {0, 0, 0, 0} + }; + + argvopt = argv; + + while ((opt = getopt_long(argc, argvopt, "a:p:", + lgopts, &option_index)) != EOF) { + + switch (opt) { + + case 'a': + if (strchr(optarg, '.') != NULL) { + struct sockaddr_in *sin = + (struct sockaddr_in *)&addr; + addr.sa_family = AF_INET; + ret = inet_pton(AF_INET, optarg, + &sin->sin_addr); + } + else { + struct sockaddr_in6 *sin6 = + (struct sockaddr_in6 *)&addr; + addr.sa_family = AF_INET6; + ret = inet_pton(AF_INET6, optarg, + &sin6->sin6_addr); + } + + if (ret != 1) { + printf("Bad address\n"); + usage(prgname); + return -1; + } + break; + + case 'p': + port = strtoul(optarg, &end, 0); + if ((optarg[0] == '\0') || + (end == NULL) || + (*end != '\0')) { + printf("Invalid port\n"); + usage(prgname); + return -1; + } + + break; + + /* long options */ + case 0: + /* if (!strcmp(lgopts[option_index].name, "option")) */ + break; + + default: + usage(prgname); + return -1; + } + } + + if (argc != optind) { + printf("Invalid argument\n"); + usage(prgname); + return -1; + } -int main(void) + ret = optind-1; + + return ret; +} + +int main(int argc, char **argv) { + struct sockaddr_in *sin = (struct sockaddr_in *)&addr; + struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&addr; struct event listen_evt; int s; - printf("Listening on port 1234\n"); + if (parse_args(argc, argv) < 0) + exit(1); + + printf("Listening on port %d\n", port); /* initializa libevent */ event_init(); - /* open a tcp server on port 1234 */ - s = cmdline_tcpv4_listen(INADDR_ANY, 1234); + /* open a tcp server on specified port */ + if (addr.sa_family == AF_INET) + s = cmdline_tcpv4_listen(sin->sin_addr.s_addr, port); + else + s = cmdline_tcpv6_listen(sin6->sin6_addr, port); event_set(&listen_evt, s, EV_READ | EV_PERSIST, evt_server_new_connection, NULL); event_add(&listen_evt, NULL); @@ -117,5 +217,3 @@ int main(void) return 0; } - -