Author: bdonlan
Date: 2004-12-31 00:02:05 -0500 (Fri, 31 Dec 2004)
New Revision: 492

Modified:
   trunk/
   trunk/clients/havercurs/TODO
   trunk/clients/havercurs/event.c
   trunk/clients/havercurs/lineio.c
   trunk/clients/havercurs/lineio.h
   trunk/clients/havercurs/main.c
Log:
 [EMAIL PROTECTED]:  bdonlan | 2004-12-31T05:01:54.663552Z
 Line I/O mostly works now



Property changes on: trunk
___________________________________________________________________
Name: svk:merge
   - 1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk:10249
27e50396-46e3-0310-8b22-ae223a1f35ce:/local:212
edfcd8bd-4ce7-0310-a97e-bb1efd40edf3:/local:238
   + 1f59643a-e6e5-0310-bc24-f7d4c744f460:/haver/local/trunk:10252
27e50396-46e3-0310-8b22-ae223a1f35ce:/local:212
edfcd8bd-4ce7-0310-a97e-bb1efd40edf3:/local:238

Modified: trunk/clients/havercurs/TODO
===================================================================
--- trunk/clients/havercurs/TODO        2004-12-31 04:27:44 UTC (rev 491)
+++ trunk/clients/havercurs/TODO        2004-12-31 05:02:05 UTC (rev 492)
@@ -2,11 +2,9 @@
 * input line
 * basic display
 * event loop (fd polling, timers)
-
-Debugging:
 * Synchronous connection
 
-Partial implementation:
+Debugging:
 * Line-oriented buffered I/O
 
 TODO:

Modified: trunk/clients/havercurs/event.c
===================================================================
--- trunk/clients/havercurs/event.c     2004-12-31 04:27:44 UTC (rev 491)
+++ trunk/clients/havercurs/event.c     2004-12-31 05:02:05 UTC (rev 492)
@@ -200,7 +200,9 @@
                prev->next = cur->next;
        else
                fd_head = cur->next;
+    cur->mode = 0;
        recache_fd(cur, 0);
+    free(cur);
 }
 
 static int io_poll(struct timeval *timeout) {

Modified: trunk/clients/havercurs/lineio.c
===================================================================
--- trunk/clients/havercurs/lineio.c    2004-12-31 04:27:44 UTC (rev 491)
+++ trunk/clients/havercurs/lineio.c    2004-12-31 05:02:05 UTC (rev 492)
@@ -1,10 +1,12 @@
 /* vim: set ts=4 sw=4 expandtab si ai sta tw=104: */
 #include <stdlib.h>
 #include <stdarg.h>
+#include <stddef.h>
 #include <unistd.h>
 #include <assert.h>
 #include <string.h>
 #include <stdio.h>
+#include <errno.h>
 #include "lineio.h"
 #include "mymalloc.h"
 #include "event.h"
@@ -30,7 +32,7 @@
 {
        lineio_conn *conn = mymalloc(sizeof *conn);
        conn->outbuf_used = conn->inbuf_used = 0;
-       conn->inbuf_len = conn->outbuf_len = 32;
+       conn->inbuf_len = conn->outbuf_len = 4096;
        conn->inbuf = mymalloc(conn->inbuf_len);
        conn->outbuf = mymalloc(conn->outbuf_len);
        
@@ -47,25 +49,50 @@
     return conn;
 }
 
+/* Only safe to call from LINEIO_ERROR events or outside callback for now */
+void lineio_detach(lineio_conn *conn) {
+    free(conn->inbuf);
+    free(conn->outbuf);
+    event_delfd(conn->fd);
+    free(conn);
+}
+
 static void lineio_evcallback(int fd, int mode, void *baton) {
        lineio_conn *conn = baton;
        assert(conn->fd == fd);
        if (mode & EVENT_FD_READABLE) {
-               /* FIXME: Line buffering. This is a test hack */
-               ssize_t dlen = read(fd, conn->inbuf, conn->inbuf_len - 1);
+        /* XXX: buffer should grow to an extent
+         * XXX: handle nuls in stream better
+         */
+        char *eol;
+               ssize_t dlen = read(fd, conn->inbuf + conn->inbuf_used,
+                            conn->inbuf_len - conn->inbuf_used - 1);
                if (dlen <= 0) {
-                       /* badness */
-                       abort();
+            conn->cb(conn, fd, conn->baton, LINEIO_ERROR, errno, 
strerror(errno));
+            return;
                }
                conn->inbuf[dlen] = 0;
-               conn->cb(conn, fd, conn->baton, LINEIO_GOTLINE, conn->inbuf);
+        conn->inbuf_used += dlen;
+        eol = strchr(conn->inbuf, '\n');
+        while (eol) {
+            ptrdiff_t linelen = eol - conn->inbuf;
+            *eol = '\0';
+            conn->cb(conn, fd, conn->baton, LINEIO_GOTLINE, linelen, 
conn->inbuf);
+            memmove(conn->inbuf, eol + 1, conn->inbuf_used - linelen - 1);
+            conn->inbuf_used -= linelen;
+            eol = strchr(conn->inbuf, '\n');
+        }
+        if (conn->inbuf_used == conn->inbuf_len - 1) {
+            conn->cb(conn, fd, conn->baton, LINEIO_ERROR, 0, "Input buffer 
overflow; discarding");
+            conn->inbuf_used = 0;
+        }
        }
        if (mode & EVENT_FD_WRITABLE) {
                if (conn->outbuf_used) {
                        ssize_t dlen = write(fd, conn->outbuf, 
conn->outbuf_used);
                        if (dlen <= 0) {
-                               /* badness */
-                               abort();
+                conn->cb(conn, fd, conn->baton, LINEIO_ERROR, errno, 
strerror(errno));
+                return;
                        }
                        assert((size_t)dlen <= conn->outbuf_used);
                        if (conn->outbuf_used > (size_t)dlen) {
@@ -74,14 +101,14 @@
                        }
                        conn->outbuf_used -= dlen;
                } else {
+            conn->cb(conn, fd, conn->baton, LINEIO_FLUSHED, 0, NULL);
                        event_addfd(
                                        fd, EVENT_FD_READABLE | EVENT_FD_ERROR,
                                        lineio_evcallback, conn);
                }
        }
        if (mode & EVENT_FD_ERROR) {
-               /* badness */
-               abort();
+        conn->cb(conn, fd, conn->baton, LINEIO_ERROR, errno, strerror(errno));
        }
 }
 

Modified: trunk/clients/havercurs/lineio.h
===================================================================
--- trunk/clients/havercurs/lineio.h    2004-12-31 04:27:44 UTC (rev 491)
+++ trunk/clients/havercurs/lineio.h    2004-12-31 05:02:05 UTC (rev 492)
@@ -13,11 +13,11 @@
 typedef struct lineio_conn lineio_conn;
 typedef void lineio_callback(
                struct lineio_conn *conn, int fd, void *baton,
-               enum lineio_events ev, void *data
+               enum lineio_events ev, int data_i, void *data_p
                );
 
 lineio_conn *lineio_attach(int fd, lineio_callback *cb, void *baton);
-void lineio_detatch(lineio_conn *conn);
+void lineio_detach(lineio_conn *conn);
 int lineio_printf(lineio_conn *conn, char *fmt, ...);
 
 #endif

Modified: trunk/clients/havercurs/main.c
===================================================================
--- trunk/clients/havercurs/main.c      2004-12-31 04:27:44 UTC (rev 491)
+++ trunk/clients/havercurs/main.c      2004-12-31 05:02:05 UTC (rev 492)
@@ -26,7 +26,7 @@
 
 void lio_cb(
                struct lineio_conn *conn, int fd, void *baton,
-               enum lineio_events ev, void *data);
+               enum lineio_events ev, int data_i, void *data_p);
 
 int main(void) {
        int i;
@@ -78,11 +78,20 @@
 }
 
 void lio_cb(
-               struct lineio_conn *conn, int fd, void *baton,
-               enum lineio_events ev, void *data)
+               struct lineio_conn *l_conn, int fd, void *baton,
+               enum lineio_events ev, int data_i, void *data_p)
 {
     if (ev == LINEIO_GOTLINE) {
-        display_print("INPUT:\n|%s|\n", (char *)data);
+        display_print("INPUT:\n|%s|\n", (char *)data_p);
+    } else if (ev == LINEIO_ERROR) {
+        display_print("ERROR: (%d) %s\n", data_i, (char *)data_p);
+        lineio_detach(conn);
+        close(fd);
+        conn = NULL;
+        return;
+    } else if (ev == LINEIO_FLUSHED) {
+        display_print("FLUSHED\n");
+        return;
     }
 }
 


Reply via email to