aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2015-12-28 13:23:56 -0500
committerFranklin Wei <git@fwei.tk>2015-12-28 13:23:56 -0500
commit4ecc22f1fc1e902e4a6d98fdea51fda1a29d1904 (patch)
tree33b601d5eb3e89c1455ada23c999b6ce4c43b65d
parentab4708acd2d4cf0bd9271b9cd423b7458aee51d8 (diff)
downloadnetcosm-4ecc22f1fc1e902e4a6d98fdea51fda1a29d1904.zip
netcosm-4ecc22f1fc1e902e4a6d98fdea51fda1a29d1904.tar.gz
netcosm-4ecc22f1fc1e902e4a6d98fdea51fda1a29d1904.tar.bz2
netcosm-4ecc22f1fc1e902e4a6d98fdea51fda1a29d1904.tar.xz
fix things
-rw-r--r--src/netcosm.h1
-rw-r--r--src/server.c39
-rw-r--r--src/util.c17
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);
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);
+}