aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2015-12-27 12:13:02 -0500
committerFranklin Wei <git@fwei.tk>2015-12-27 12:13:02 -0500
commit88c66d263b59147280d5dc1f1bdab8ba5031adee (patch)
tree06b928c52d0a8431afb8630e2bf5adb91211fc83 /src
parent0a2f9197058cc5248ec8e4bed7c361397c8d1c79 (diff)
downloadnetcosm-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.c19
-rw-r--r--src/server.c29
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);
}
}
}