From 4ecc22f1fc1e902e4a6d98fdea51fda1a29d1904 Mon Sep 17 00:00:00 2001 From: Franklin Wei Date: Mon, 28 Dec 2015 13:23:56 -0500 Subject: fix things --- src/netcosm.h | 1 + src/server.c | 39 ++++++++------------------------------- src/util.c | 17 +++++++++++++++++ 3 files changed, 26 insertions(+), 31 deletions(-) (limited to 'src') diff --git a/src/netcosm.h b/src/netcosm.h index d0d4dea..5c308b5 100644 --- a/src/netcosm.h +++ b/src/netcosm.h @@ -96,6 +96,7 @@ #define ARRAYLEN(x) (sizeof(x)/sizeof(x[0])) #define MAX(a,b) ((a>b)?(a):(b)) +#define MIN(a,b) ((a 0) { + sig_printf("Client disconnect.\n"); + struct child_data *child = hash_lookup(child_map, &pid); + FD_CLR(child->readpipe[0], &active_fds); + + --num_clients; + hash_remove(child_map, &pid); } errno = saved_errno; - - --num_clients; } int port; @@ -306,31 +309,6 @@ static void reqmap_init(void) hash_insert(request_map, &requests[i].code, requests + i); } -void sig_printf(const char *fmt, ...) -{ - va_list ap; - va_start(ap, fmt); - - char buf[128]; - int len = vsnprintf(buf, sizeof(buf), fmt, ap); - - write(STDOUT_FILENO, buf, len); - - va_end(ap); -} - -static void force_read(int fd, void *buf, size_t n) -{ - unsigned char *ptr = buf; - size_t n_read = 0; - while(n_read < n) - { - ssize_t ret = read(fd, ptr, n - n_read); - ptr += ret; - n_read += ret; - } -} - static void empty_pipe(int fd) { char buf[4096]; @@ -484,7 +462,7 @@ finish: sig_printf("Waiting for %d acks\n", num_acks_wanted); - while(num_acks_recvd < num_acks_wanted) + while(num_acks_recvd < MIN(num_clients,num_acks_wanted)) { sigsuspend(&old); sig_printf("Got %d total acks\n", num_acks_recvd); @@ -642,7 +620,6 @@ int main(int argc, char *argv[]) printf("Listening on port %d\n", port); - fd_set read_fds, active_fds; FD_ZERO(&active_fds); FD_SET(server_socket, &active_fds); diff --git a/src/util.c b/src/util.c index d69ed0a..8da1181 100644 --- a/src/util.c +++ b/src/util.c @@ -23,3 +23,20 @@ void remove_cruft(char *str) char *junk; strtok_r(str, "\r\n", &junk); } + +/** + * WARNING: not totally signal-safe + * TODO: rewrite to avoid calling *printf() + */ +void sig_printf(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + + char buf[128]; + int len = vsnprintf(buf, sizeof(buf), fmt, ap); + + write(STDOUT_FILENO, buf, len); + + va_end(ap); +} -- cgit v1.1