commit effedf8607c8cd46e82fef5ed9083eda727f608d
parent 92571a0887b28bb17f40d3352a6b8f2526575298
Author: Enno Boland (tox) <tox@s01.de>
Date:   Tue,  8 Sep 2009 00:56:21 +0200
fixing run()
Diffstat:
| M | tabbed.c | | | 29 | +++++++++++++++++++++-------- | 
1 file changed, 21 insertions(+), 8 deletions(-)
diff --git 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;