event_server: add an example that uses libevent
[libcmdline.git] / src / event_server / main.c
diff --git a/src/event_server/main.c b/src/event_server/main.c
new file mode 100644 (file)
index 0000000..289bd71
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2011, Olivier MATZ <zer0@droids-corp.org>
+ * All rights reserved.
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the University of California, Berkeley nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+
+#include <stdio.h>
+#include <string.h>
+#include <stdint.h>
+#include <math.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <inttypes.h>
+#include <ctype.h>
+#include <ctype.h>
+#include <unistd.h>
+#include <termios.h>
+#include <netinet/in.h>
+
+#include <cmdline_rdline.h>
+#include <cmdline_parse.h>
+#include <cmdline_socket.h>
+#include <cmdline.h>
+
+#include <event.h>
+
+extern cmdline_parse_ctx_t main_ctx[];
+
+/*** main */
+
+static void
+evt_server_input(int s, short event, void *arg)
+{
+       struct cmdline *cl = arg;
+       struct event *evt = cl->opaque;
+       char buf[2048];
+       int n;
+
+       n = read(s, buf, sizeof(buf));
+       if (n < 0) {
+               event_del(evt);
+               free(evt);
+               cmdline_free(cl);
+               return;
+       }
+
+       if (cmdline_in(cl, buf, n) < 0) {
+               event_del(evt);
+               free(evt);
+               cmdline_free(cl);
+               return;
+       }
+}
+
+static void
+evt_server_new_connection(int s, short event, void *arg)
+{
+       struct cmdline *cl;
+       struct event *evt;
+
+       /* create a new cmdline instance for this connection */
+       cl = cmdline_accept(main_ctx, "example> ", s);
+
+       /* allocate a new event for this incomming connection */
+       evt = malloc(sizeof(struct event));
+       if (evt == NULL) {
+               cmdline_free(cl);
+               return;
+       }
+
+       cl->opaque = evt;
+       event_set(evt, cl->s_in, EV_READ | EV_PERSIST, evt_server_input, cl);
+       event_add(evt, NULL);
+}
+
+
+int main(void)
+{
+       struct event listen_evt;
+       int s;
+
+       printf("Listening on port 1234\n");
+
+       /* initializa libevent */
+       event_init();
+
+       /* open a tcp server on port 1234 */
+       s = cmdline_tcpv4_listen(INADDR_ANY, 1234);
+       event_set(&listen_evt, s, EV_READ | EV_PERSIST,
+                 evt_server_new_connection, NULL);
+       event_add(&listen_evt, NULL);
+
+       /* libevent main loop */
+       event_dispatch();
+
+       return 0;
+}
+
+