289bd710d4e5b75a70ce1070406cea144e01b685
[libcmdline.git] / src / event_server / main.c
1 /*
2  * Copyright (c) 2011, Olivier MATZ <zer0@droids-corp.org>
3  * All rights reserved.
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are met:
6  *
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.
15  *
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.
26  */
27
28
29 #include <stdio.h>
30 #include <string.h>
31 #include <stdint.h>
32 #include <math.h>
33 #include <stdlib.h>
34 #include <stdarg.h>
35 #include <inttypes.h>
36 #include <ctype.h>
37 #include <ctype.h>
38 #include <unistd.h>
39 #include <termios.h>
40 #include <netinet/in.h>
41
42 #include <cmdline_rdline.h>
43 #include <cmdline_parse.h>
44 #include <cmdline_socket.h>
45 #include <cmdline.h>
46
47 #include <event.h>
48
49 extern cmdline_parse_ctx_t main_ctx[];
50
51 /*** main */
52
53 static void
54 evt_server_input(int s, short event, void *arg)
55 {
56         struct cmdline *cl = arg;
57         struct event *evt = cl->opaque;
58         char buf[2048];
59         int n;
60
61         n = read(s, buf, sizeof(buf));
62         if (n < 0) {
63                 event_del(evt);
64                 free(evt);
65                 cmdline_free(cl);
66                 return;
67         }
68
69         if (cmdline_in(cl, buf, n) < 0) {
70                 event_del(evt);
71                 free(evt);
72                 cmdline_free(cl);
73                 return;
74         }
75 }
76
77 static void
78 evt_server_new_connection(int s, short event, void *arg)
79 {
80         struct cmdline *cl;
81         struct event *evt;
82
83         /* create a new cmdline instance for this connection */
84         cl = cmdline_accept(main_ctx, "example> ", s);
85
86         /* allocate a new event for this incomming connection */
87         evt = malloc(sizeof(struct event));
88         if (evt == NULL) {
89                 cmdline_free(cl);
90                 return;
91         }
92
93         cl->opaque = evt;
94         event_set(evt, cl->s_in, EV_READ | EV_PERSIST, evt_server_input, cl);
95         event_add(evt, NULL);
96 }
97
98
99 int main(void)
100 {
101         struct event listen_evt;
102         int s;
103
104         printf("Listening on port 1234\n");
105
106         /* initializa libevent */
107         event_init();
108
109         /* open a tcp server on port 1234 */
110         s = cmdline_tcpv4_listen(INADDR_ANY, 1234);
111         event_set(&listen_evt, s, EV_READ | EV_PERSIST,
112                   evt_server_new_connection, NULL);
113         event_add(&listen_evt, NULL);
114
115         /* libevent main loop */
116         event_dispatch();
117
118         return 0;
119 }
120
121