summaryrefslogtreecommitdiff
path: root/tabbed.c
diff options
context:
space:
mode:
authorEnno Boland (tox) <tox@s01.de>2009-09-08 00:56:21 +0200
committerEnno Boland (tox) <tox@s01.de>2009-09-08 00:56:21 +0200
commiteffedf8607c8cd46e82fef5ed9083eda727f608d (patch)
treef7215eaa3c7bc0975cca6fc56a149e23e264904d /tabbed.c
parent92571a0887b28bb17f40d3352a6b8f2526575298 (diff)
fixing run()
Diffstat (limited to 'tabbed.c')
-rw-r--r--tabbed.c29
1 files changed, 21 insertions, 8 deletions
diff --git a/tabbed.c b/tabbed.c
index 3d64ea5..2d7fd13 100644
--- a/tabbed.c
+++ b/tabbed.c
@@ -268,10 +268,10 @@ void
run(void) {
char buf[32], *p;
fd_set rd;
- int r, xfd;
- unsigned int offset;
+ int r, xfd, maxfd;
+ unsigned int offset = 0;
XEvent ev;
- Listener *l;
+ Listener *l, *pl;
/* main event loop, also reads status text from stdin */
XSync(dpy, False);
@@ -279,29 +279,42 @@ run(void) {
buf[LENGTH(buf) - 1] = '\0'; /* 0-terminator is never touched */
while(running) {
FD_ZERO(&rd);
+ maxfd = xfd;
+ FD_SET(xfd, &rd);
for(l = listeners; l; l = l->next) {
- printf("setting %i\n", l->fd);
+ maxfd = MAX(maxfd, l->fd);
FD_SET(l->fd, &rd);
}
- FD_SET(xfd, &rd);
- if(select(xfd + 1, &rd, NULL, NULL, NULL) == -1) {
+ if(select(maxfd + 1, &rd, NULL, NULL, NULL) == -1) {
if(errno == EINTR)
continue;
die("select failed\n");
}
for(l = listeners; l; l = l->next) {
- printf("testing %i\n", l->fd);
if(!FD_ISSET(l->fd, &rd))
continue;
switch((r = read(l->fd, buf + offset, LENGTH(buf) - 1 - offset))) {
case -1:
+ perror("tabbed: fd error");
case 0:
+ if(listeners == l)
+ listeners = l->next;
+ else {
+ for(pl = listeners; pl->next != l ; pl = pl->next);
+ pl->next = l->next;
+ }
+ free(l);
break;
default:
for(p = buf + offset; r > 0; p++, r--, offset++)
if(*p == '\n' || *p == '\0') {
- *p = '\0';
printf("Got somthing: %s\n", buf);
+ *p = '\0';
+ p += r - 1; /* p is buf + offset + r - 1 */
+ for(r = 0; *(p - r) && *(p - r) != '\n'; r++);
+ offset = r;
+ if(r)
+ memmove(buf, p - r + 1, r);
break;
}
break;