2 * Copyright (c) 2009, Olivier MATZ <zer0@droids-corp.org>
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are met:
7 * * Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer.
9 * * Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the
11 * documentation and/or other materials provided with the distribution.
12 * * Neither the name of the University of California, Berkeley nor the
13 * names of its contributors may be used to endorse or promote products
14 * derived from this software without specific prior written permission.
16 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
17 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19 * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
20 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 #include <netinet/in.h>
38 #include <arpa/inet.h>
42 #include <cmdline_rdline.h>
43 #include <cmdline_parse.h>
44 #include <cmdline_socket.h>
47 extern cmdline_parse_ctx_t main_ctx[];
49 static struct sockaddr addr;
50 static uint16_t port = 1234;
53 usage(const char *prgname)
55 printf("%s [-a ADDRESS] [-p PORT]\n"
57 "Start a command line server on a TCP listen socket. Only\n"
58 "one connection is accepted, then the program exits.\n"
59 "The default behaviour is to listen on 0.0.0.0:1234\n"
61 " -a ADDR: IPv4 or IPv6 local address to listen on (default\n"
63 " -p PORT: port to listen on (default is 1234).\n",
67 /* Parse the argument given in the command line of the application */
69 parse_args(int argc, char **argv)
74 char *prgname = argv[0];
76 static struct option lgopts[] = {
82 while ((opt = getopt_long(argc, argvopt, "a:p:",
83 lgopts, &option_index)) != EOF) {
88 if (strchr(optarg, '.') != NULL) {
89 struct sockaddr_in *sin =
90 (struct sockaddr_in *)&addr;
91 addr.sa_family = AF_INET;
92 ret = inet_pton(AF_INET, optarg,
96 struct sockaddr_in6 *sin6 =
97 (struct sockaddr_in6 *)&addr;
98 addr.sa_family = AF_INET6;
99 ret = inet_pton(AF_INET6, optarg,
104 printf("Bad address\n");
111 port = strtoul(optarg, &end, 0);
112 if ((optarg[0] == '\0') ||
115 printf("Invalid port\n");
124 /* if (!strcmp(lgopts[option_index].name, "option")) */
133 if (argc != optind) {
134 printf("Invalid argument\n");
144 int main(int argc, char **argv)
146 struct sockaddr_in *sin = (struct sockaddr_in *)&addr;
147 struct sockaddr_in6 *sin6 = (struct sockaddr_in6 *)&addr;
151 if (parse_args(argc, argv) < 0)
154 printf("Listening on port %d\n", port);
156 /* open a tcp server on specified port */
157 if (addr.sa_family == AF_INET)
158 s = cmdline_tcpv4_listen(sin->sin_addr.s_addr, port);
160 s = cmdline_tcpv6_listen(sin6->sin6_addr, port);
162 cl = cmdline_accept(main_ctx, "example> ", s);
164 printf("accept() failed\n");
167 cmdline_interact(cl);