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;
}
}