diff options
| author | Franklin Wei <git@fwei.tk> | 2015-12-27 12:13:02 -0500 |
|---|---|---|
| committer | Franklin Wei <git@fwei.tk> | 2015-12-27 12:13:02 -0500 |
| commit | 88c66d263b59147280d5dc1f1bdab8ba5031adee (patch) | |
| tree | 06b928c52d0a8431afb8630e2bf5adb91211fc83 /src | |
| parent | 0a2f9197058cc5248ec8e4bed7c361397c8d1c79 (diff) | |
| download | netcosm-88c66d263b59147280d5dc1f1bdab8ba5031adee.zip netcosm-88c66d263b59147280d5dc1f1bdab8ba5031adee.tar.gz netcosm-88c66d263b59147280d5dc1f1bdab8ba5031adee.tar.bz2 netcosm-88c66d263b59147280d5dc1f1bdab8ba5031adee.tar.xz | |
fix some things
Diffstat (limited to 'src')
| -rw-r--r-- | src/client.c | 19 | ||||
| -rw-r--r-- | src/server.c | 29 |
2 files changed, 39 insertions, 9 deletions
diff --git a/src/client.c b/src/client.c index 090ffa1..99b90e7 100644 --- a/src/client.c +++ b/src/client.c @@ -53,8 +53,23 @@ void __attribute__((format(printf,1,2))) out(const char *fmt, ...) static volatile sig_atomic_t request_complete; +static int reqs_since_ts; +static time_t ts = 0; + void send_master(unsigned char cmd, const void *data, size_t sz) { + time_t t = time(NULL); + if(ts != t) + { + ts = t; + reqs_since_ts = 0; + } + if(reqs_since_ts++ > 10) + { + out("Rate limit exceeded.\n"); + return; + } + request_complete = 0; sigset_t block, old; @@ -105,6 +120,8 @@ tryagain: goto tryagain; } + remove_cruft(buf); + return buf; } @@ -484,7 +501,7 @@ auth: { char buf[MSG_MAX]; char *what = strtok_r(NULL, "", &save); - int len = snprintf(buf, sizeof(buf), "%s says %s", current_user, what); + int len = snprintf(buf, sizeof(buf), "%s says %s\n", current_user, what); send_master(REQ_BCASTMSG, buf, len); } diff --git a/src/server.c b/src/server.c index 193f811..ad2502d 100644 --- a/src/server.c +++ b/src/server.c @@ -86,7 +86,10 @@ static void serv_cleanup(void) close(server_socket); world_free(); hash_free(request_map); + request_map = NULL; hash_free(child_map); + child_map = NULL; + _exit(0); } static void sigint_handler(int s) @@ -194,7 +197,6 @@ static void req_kick_client(unsigned char *data, size_t datalen, write(child->outpipe[1], data + sizeof(pid_t), datalen - sizeof(pid_t)); union sigval nothing; sigqueue(child->pid, SIGRTMIN, nothing); - ++num_acks_wanted; } } } @@ -448,6 +450,8 @@ finish: union sigval junk; sigqueue(sender->pid, SIGRTMIN, junk); + sig_printf("Waiting for %d acks\n", num_acks_wanted); + while(num_acks_recvd < num_acks_wanted) { sigsuspend(&old); @@ -465,6 +469,8 @@ finish: static void master_ack_handler(int s, siginfo_t *info, void *v) { + (void) s; + (void) v; sig_printf("Parent gets ACK\n"); if(inc_acks && hash_lookup(child_map, &info->si_pid)) { @@ -478,7 +484,6 @@ void init_signals(void) struct sigaction sa; sigemptyset(&sa.sa_mask); - sa.sa_sigaction = sigchld_handler; // reap all dead processes sa.sa_flags = SA_RESTART | SA_SIGINFO; if (sigaction(SIGCHLD, &sa, NULL) < 0) @@ -607,9 +612,18 @@ int main(int argc, char *argv[]) while(1) { read_fds = active_fds; - int num_events = select(FD_SETSIZE, &read_fds, NULL, NULL, NULL); - if(num_events < 0) - error("select"); + int num_events; + sigset_t all, old; + sigemptyset(&all); + sigaddset(&all, SIGPIPE); + sigprocmask(SIG_SETMASK, &all, &old); + do { + num_events = select(FD_SETSIZE, &read_fds, NULL, NULL, NULL); + } while (num_events < 0); + + sigprocmask(SIG_SETMASK, &old, NULL); + //if(num_events < 0) + // error("select"); for(int i = 0; i < FD_SETSIZE; ++i) { @@ -683,9 +697,8 @@ int main(int argc, char *argv[]) } else { - /* must be data from a child */ - if(!handle_child_req(i)) - FD_CLR(i, &active_fds); + /* data from a child's pipe */ + handle_child_req(i); } } } |