--- /dev/null
+/*
+ * 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;
+}
+
+