diff options
| author | Franklin Wei <git@fwei.tk> | 2015-12-28 13:23:56 -0500 |
|---|---|---|
| committer | Franklin Wei <git@fwei.tk> | 2015-12-28 13:23:56 -0500 |
| commit | 4ecc22f1fc1e902e4a6d98fdea51fda1a29d1904 (patch) | |
| tree | 33b601d5eb3e89c1455ada23c999b6ce4c43b65d | |
| parent | ab4708acd2d4cf0bd9271b9cd423b7458aee51d8 (diff) | |
| download | netcosm-4ecc22f1fc1e902e4a6d98fdea51fda1a29d1904.zip netcosm-4ecc22f1fc1e902e4a6d98fdea51fda1a29d1904.tar.gz netcosm-4ecc22f1fc1e902e4a6d98fdea51fda1a29d1904.tar.bz2 netcosm-4ecc22f1fc1e902e4a6d98fdea51fda1a29d1904.tar.xz | |
fix things
| -rw-r--r-- | src/netcosm.h | 1 | ||||
| -rw-r--r-- | src/server.c | 39 | ||||
| -rw-r--r-- | src/util.c | 17 |
3 files changed, 26 insertions, 31 deletions
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<b)?(a):(b)) typedef int room_id; diff --git a/src/server.c b/src/server.c index ff4a4d0..3badaec 100644 --- a/src/server.c +++ b/src/server.c @@ -36,6 +36,7 @@ void __attribute__((noreturn)) error(const char *fmt, ...) /* assume int is atomic */ volatile int num_clients = 0; void *child_map = NULL; +static fd_set read_fds, active_fds; static void free_child_data(void *ptr) { @@ -50,20 +51,22 @@ static void sigchld_handler(int s, siginfo_t *info, void *vp) (void) s; (void) info; (void) vp; - const char *msg = "Client disconnect.\n"; - write(STDOUT_FILENO, msg, strlen(msg)); // waitpid() might overwrite errno, so we save and restore it: int saved_errno = errno; pid_t pid; while((pid = waitpid(-1, NULL, WNOHANG)) > 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); @@ -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); +} |