diff listener.c @ 62:20563735e8b5

just checkpointing
author Matt Johnston <matt@ucc.asn.au>
date Tue, 10 Aug 2004 17:09:52 +0000
parents db2c8e6fb284
children dcc43965928f
line wrap: on
line diff
--- a/listener.c	Mon Aug 09 08:18:37 2004 +0000
+++ b/listener.c	Tue Aug 10 17:09:52 2004 +0000
@@ -14,15 +14,16 @@
 
 void set_listener_fds(fd_set * readfds) {
 
-	unsigned int i;
+	unsigned int i, j;
 	struct Listener *listener;
 
 	/* check each in turn */
 	for (i = 0; i < ses.listensize; i++) {
 		listener = ses.listeners[i];
 		if (listener != NULL) {
-			TRACE(("set listener fd %d", listener->sock));
-			FD_SET(listener->sock, readfds);
+			for (j = 0; j < listener->nsocks; j++) {
+				FD_SET(listener->socks[j], readfds);
+			}
 		}
 	}
 }
@@ -30,16 +31,19 @@
 
 void handle_listeners(fd_set * readfds) {
 
-	unsigned int i;
+	unsigned int i, j;
 	struct Listener *listener;
+	int sock;
 
 	/* check each in turn */
 	for (i = 0; i < ses.listensize; i++) {
 		listener = ses.listeners[i];
 		if (listener != NULL) {
-		TRACE(("handle listener num %d fd %d", i, listener->sock));
-			if (FD_ISSET(listener->sock, readfds)) {
-				listener->accepter(listener);
+			for (j = 0; j < listener->nsocks; j++) {
+				sock = listener->socks[j];
+				if (FD_ISSET(sock, readfds)) {
+					listener->accepter(listener, sock);
+				}
 			}
 		}
 	}
@@ -48,8 +52,9 @@
 
 /* accepter(int fd, void* typedata) is a function to accept connections, 
  * cleanup(void* typedata) happens when cleaning up */
-struct Listener* new_listener(int sock, int type, void* typedata, 
-		void (*accepter)(struct Listener*), 
+struct Listener* new_listener(int socks[], unsigned int nsocks,
+		int type, void* typedata, 
+		void (*accepter)(struct Listener*, int sock), 
 		void (*cleanup)(struct Listener*)) {
 
 	unsigned int i, j;
@@ -65,7 +70,9 @@
 	if (i == ses.listensize) {
 		if (ses.listensize > MAX_LISTENERS) {
 			TRACE(("leave newlistener: too many already"));
-			close(sock);
+			for (j = 0; j < nsocks; j++) {
+				close(socks[i]);
+			}
 			return NULL;
 		}
 		
@@ -80,15 +87,18 @@
 		}
 	}
 
-	ses.maxfd = MAX(ses.maxfd, sock);
+	for (j = 0; j < nsocks; j++) {
+		ses.maxfd = MAX(ses.maxfd, socks[j]);
+	}
 
-	TRACE(("new listener num %d fd %d", i, sock));
+	TRACE(("new listener num %d ", i));
 
 	newlisten = (struct Listener*)m_malloc(sizeof(struct Listener));
 	newlisten->index = i;
 	newlisten->type = type;
 	newlisten->typedata = typedata;
-	newlisten->sock = sock;
+	newlisten->nsocks = nsocks;
+	memcpy(newlisten->socks, socks, nsocks * sizeof(int));
 	newlisten->accepter = accepter;
 	newlisten->cleanup = cleanup;
 
@@ -116,11 +126,15 @@
 
 void remove_listener(struct Listener* listener) {
 
+	unsigned int j;
+
 	if (listener->cleanup) {
 		listener->cleanup(listener);
 	}
 
-	close(listener->sock);
+	for (j = 0; j < listener->nsocks; j++) {
+		close(listener->socks[j]);
+	}
 	ses.listeners[listener->index] = NULL;
 	m_free(listener);