From 24e1eb0b9782bb7cf13222b5432f5a0bc941ddfe Mon Sep 17 00:00:00 2001
From: Dan Egnor <egnor@ofb.net>
Date: Sat, 28 Oct 2000 16:38:46 +0000
Subject: [PATCH] oops oops oops

---
 sys.c | 32 +++++++++++++++++++-------------
 1 file changed, 19 insertions(+), 13 deletions(-)

diff --git a/sys.c b/sys.c
index 3ed0671..1406eee 100644
--- a/sys.c
+++ b/sys.c
@@ -263,8 +263,8 @@ oop_source_sys *oop_sys_new(void) {
 }
 
 static void *sys_time_run(oop_source_sys *sys) {
-	void *ret = NULL;
-	while (NULL == ret && NULL != sys->time_run) {
+	void *ret = OOP_CONTINUE;
+	while (OOP_CONTINUE == ret && NULL != sys->time_run) {
 		struct sys_time *p = sys->time_run;
 		sys->time_run = sys->time_run->next;
 		--sys->num_events;
@@ -275,14 +275,14 @@ static void *sys_time_run(oop_source_sys *sys) {
 }
 
 void *oop_sys_run(oop_source_sys *sys) {
-	void * volatile ret = NULL;
+	void * volatile ret = OOP_CONTINUE;
 	assert(!sys->in_run && "oop_sys_run is not reentrant");
 	sys->in_run = 1;
 
-	while (0 != sys->num_events && NULL == ret) {
+	while (0 != sys->num_events && OOP_CONTINUE == ret) {
 		struct timeval * volatile ptv = NULL;
 		struct timeval tv;
-		fd_set rfd,wfd;
+		fd_set rfd,wfd,xfd;
 		int i,rv;
 
 		if (NULL != sys->time_run) {
@@ -315,13 +315,15 @@ void *oop_sys_run(oop_source_sys *sys) {
 
 		FD_ZERO(&rfd);
 		FD_ZERO(&wfd);
+		FD_ZERO(&xfd);
 		for (i = 0; i < sys->num_files; ++i) {
 			if (NULL != sys->files[i][OOP_READ].f) FD_SET(i,&rfd);
 			if (NULL != sys->files[i][OOP_WRITE].f) FD_SET(i,&wfd);
+			if (NULL != sys->files[i][OOP_EXCEPTION].f) FD_SET(i,&xfd);
 		}
 
 		do
-			rv = select(sys->num_files,&rfd,&wfd,NULL,ptv);
+			rv = select(sys->num_files,&rfd,&wfd,&xfd,ptv);
 		while (0 > rv && EINTR == errno);
 
 		sys->do_jmp = 0;
@@ -330,39 +332,43 @@ void *oop_sys_run(oop_source_sys *sys) {
 
 		if (sys->sig_active) {
 			sys->sig_active = 0;
-			for (i = 0; NULL == ret && i < OOP_NUM_SIGNALS; ++i) {
+			for (i = 0; OOP_CONTINUE == ret && i < OOP_NUM_SIGNALS; ++i) {
 				if (sys->sig[i].active) {
 					sys->sig[i].active = 0;
 					sys->sig[i].ptr = sys->sig[i].list;
 				}
-				while (NULL == ret && NULL != sys->sig[i].ptr) {
+				while (OOP_CONTINUE == ret && NULL != sys->sig[i].ptr) {
 					struct sys_signal_handler *h;
 					h = sys->sig[i].ptr;
 					sys->sig[i].ptr = h->next;
 					ret = h->f(&sys->oop,i,h->v);
 				}
 			}
-			if (NULL != ret) {
+			if (OOP_CONTINUE != ret) {
 				sys->sig_active = 1; /* come back */
 				break;
 			}
 		}
 
 		if (0 < rv) {
-			for (i = 0; i < sys->num_files && NULL == ret; ++i)
+			for (i = 0; i < sys->num_files && OOP_CONTINUE == ret; ++i)
+				if (FD_ISSET(i,&xfd) && NULL != sys->files[i][OOP_EXCEPTION].f)
+					ret = sys->files[i][OOP_EXCEPTION].f(&sys->oop,i,OOP_EXCEPTION,
+					                          sys->files[i][OOP_EXCEPTION].v);
+			for (i = 0; i < sys->num_files && OOP_CONTINUE == ret; ++i)
 				if (FD_ISSET(i,&wfd) && NULL != sys->files[i][OOP_WRITE].f)
 					ret = sys->files[i][OOP_WRITE].f(&sys->oop,i,OOP_WRITE,
 					                           sys->files[i][OOP_WRITE].v);
-			for (i = 0; i < sys->num_files && NULL == ret; ++i)
+			for (i = 0; i < sys->num_files && OOP_CONTINUE == ret; ++i)
 				if (FD_ISSET(i,&rfd) && NULL != sys->files[i][OOP_READ].f)
 					ret = sys->files[i][OOP_READ].f(&sys->oop,i,OOP_READ,
 					                          sys->files[i][OOP_READ].v);
-			if (NULL != ret) break;
+			if (OOP_CONTINUE != ret) break;
 		}
 
 		/* Catch any leftover timeout events. */
 		ret = sys_time_run(sys);
-		if (NULL != ret) break;
+		if (OOP_CONTINUE != ret) break;
 
 		if (NULL != sys->time_queue) {
 			struct sys_time *p,**pp = &sys->time_queue;
-- 
GitLab