diff options
| author | Franklin Wei <git@fwei.tk> | 2015-12-07 22:19:18 -0500 |
|---|---|---|
| committer | Franklin Wei <git@fwei.tk> | 2015-12-07 22:19:18 -0500 |
| commit | 33e3462fb86a715e6f71e387233e36c7be255038 (patch) | |
| tree | 06560056c0777446288f377b2e125b07368d6f9a | |
| parent | 0f3bd99c40594c46b5b4bb0603085ec9cc111e0e (diff) | |
| download | netcosm-33e3462fb86a715e6f71e387233e36c7be255038.zip netcosm-33e3462fb86a715e6f71e387233e36c7be255038.tar.gz netcosm-33e3462fb86a715e6f71e387233e36c7be255038.tar.bz2 netcosm-33e3462fb86a715e6f71e387233e36c7be255038.tar.xz | |
refactor
| -rw-r--r-- | src/client.c | 20 | ||||
| -rw-r--r-- | src/server.c | 47 |
2 files changed, 41 insertions, 26 deletions
diff --git a/src/client.c b/src/client.c index 4ed944c..4835881 100644 --- a/src/client.c +++ b/src/client.c @@ -58,6 +58,8 @@ void all_upper(char *s) } } +volatile sig_atomic_t done_printing; + void sigusr2_handler(int s) { (void) s; @@ -65,6 +67,7 @@ void sigusr2_handler(int s) size_t len = read(from_parent, buf, MSG_MAX); buf[MSG_MAX] = '\0'; out_raw(buf, len); + done_printing = 1; } void client_change_state(int state) @@ -235,12 +238,19 @@ void client_main(int fd, struct sockaddr_in *addr, int total, int to, int from) auth_list_users(); } } - else if(!strcmp(tok, "CLIENTS")) + else if(!strcmp(tok, "CLIENT")) { - unsigned char cmd_code = REQ_LISTCLIENTS; - write(to_parent, &cmd_code, sizeof(cmd_code)); - kill(getppid(), SIGUSR1); - waitpid(-1, NULL, 0); + char *what = strtok_r(NULL, WSPACE, &save); + all_upper(what); + if(!strcmp(what, "LIST")) + { + done_printing = 0; + unsigned char cmd_code = REQ_LISTCLIENTS; + write(to_parent, &cmd_code, sizeof(cmd_code)); + kill(getppid(), SIGUSR1); + waitpid(-1, NULL, 0); + while(!done_printing); + } } } diff --git a/src/server.c b/src/server.c index 8e2c4a1..c680b37 100644 --- a/src/server.c +++ b/src/server.c @@ -141,7 +141,7 @@ void req_send_clientinfo(unsigned char *data, size_t datalen, "LOGGED IN AS ADMIN", "ACCESS DENIED", }; - if(sender->user) + if(child->user) len = snprintf(buf, sizeof(buf), "Client %s PID %d [%s] USER %s\n", inet_ntoa(child->addr), child->pid, state[child->state], child->user); else @@ -189,7 +189,7 @@ static const struct child_request { void (*finalize)(struct child_data *sender); } requests[] = { - { REQ_BCASTMSG, true, CHILD_ALL_BUT_SENDER, req_pass_msg, NULL }, + { REQ_BCASTMSG, true, CHILD_ALL, req_pass_msg, NULL }, { REQ_LISTCLIENTS, false, CHILD_ALL, req_send_clientinfo, req_signal_sender }, { REQ_CHANGESTATE, true, CHILD_SENDER, req_change_state, NULL }, { REQ_CHANGEUSER, true, CHILD_SENDER, req_change_user, NULL }, @@ -292,6 +292,29 @@ finish: req->finalize(sender); } +void init_signals(void) +{ + struct sigaction sa; + + sa.sa_sigaction = sigchld_handler; // reap all dead processes + sigemptyset(&sa.sa_mask); + sa.sa_flags = SA_RESTART | SA_SIGINFO; + if (sigaction(SIGCHLD, &sa, NULL) < 0) + error("sigaction"); + + sa.sa_handler = sigint_handler; + sa.sa_flags = SA_RESTART; + if(sigaction(SIGINT, &sa, NULL) < 0) + error("sigaction"); + if(sigaction(SIGTERM, &sa, NULL) < 0) + error("sigaction"); + + sa.sa_sigaction = sigusr1_handler; + sa.sa_flags = SA_RESTART | SA_SIGINFO; + if(sigaction(SIGUSR1, &sa, NULL) < 0) + error("sigaction"); +} + int main(int argc, char *argv[]) { if(argc != 2) @@ -325,25 +348,7 @@ int main(int argc, char *argv[]) /* set up signal handlers for SIGCHLD, SIGUSR1, and SIGINT */ /* SIGUSR1 is used for broadcast signalling */ - struct sigaction sa; - - sa.sa_sigaction = sigchld_handler; // reap all dead processes - sigemptyset(&sa.sa_mask); - sa.sa_flags = SA_RESTART | SA_SIGINFO; - if (sigaction(SIGCHLD, &sa, NULL) < 0) - error("sigaction"); - - sa.sa_handler = sigint_handler; - sa.sa_flags = SA_RESTART; - if(sigaction(SIGINT, &sa, NULL) < 0) - error("sigaction"); - if(sigaction(SIGTERM, &sa, NULL) < 0) - error("sigaction"); - - sa.sa_sigaction = sigusr1_handler; - sa.sa_flags = SA_RESTART | SA_SIGINFO; - if(sigaction(SIGUSR1, &sa, NULL) < 0) - error("sigaction"); + init_signals(); if(access(USERFILE, F_OK) < 0) first_run_setup(); |