diff options
Diffstat (limited to 'src/server_reqs.c')
| -rw-r--r-- | src/server_reqs.c | 43 |
1 files changed, 23 insertions, 20 deletions
diff --git a/src/server_reqs.c b/src/server_reqs.c index 5a15812..d10acde 100644 --- a/src/server_reqs.c +++ b/src/server_reqs.c @@ -29,6 +29,13 @@ static void send_packet(struct child_data *child, unsigned char cmd, assert(datalen < MSG_MAX); unsigned char pkt[MSG_MAX]; pkt[0] = cmd; + + //if((data?datalen:0) + 1 > MSG_MAX && cmd == REQ_BCASTMSG) + //{ + // /* TODO: split long messages */ + // ; + //} + if(data && datalen) memcpy(pkt + 1, data, datalen); tryagain: @@ -46,6 +53,8 @@ static void req_pass_msg(unsigned char *data, size_t datalen, (void) sender; send_packet(child, REQ_BCASTMSG, data, datalen); + if(child->pid != sender->pid) + send_packet(child, REQ_ALLDONE, NULL, 0); } static void req_send_clientinfo(unsigned char *data, size_t datalen, @@ -84,8 +93,6 @@ static void req_change_state(unsigned char *data, size_t datalen, (void) data; (void) datalen; (void) child; (void) sender; if(datalen == sizeof(sender->state)) sender->state = *((int*)data); - else - debugf("State data is of the wrong size %*s\n", datalen, data); } static void req_change_user(unsigned char *data, size_t datalen, @@ -112,7 +119,7 @@ static void req_kick_client(unsigned char *data, size_t datalen, { pid_t kicked_pid = *((pid_t*)data); if(kicked_pid == child->pid) - send_packet(child, REQ_BCASTMSG, data + sizeof(pid_t), datalen - sizeof(pid_t)); + send_packet(child, REQ_KICK, data + sizeof(pid_t), datalen - sizeof(pid_t)); } } @@ -128,6 +135,7 @@ static void req_send_desc(unsigned char *data, size_t datalen, struct child_data struct room_t *room = room_get(sender->room); send_packet(sender, REQ_BCASTMSG, room->data.desc, strlen(room->data.desc)); + send_packet(sender, REQ_PRINTNEWLINE, NULL, 0); } @@ -189,10 +197,7 @@ static void req_send_user(unsigned char *data, size_t datalen, struct child_data } debugf("looking up user %s failed\n", data); - debugf("failure 2\n"); } - - debugf("failure 1\n"); } static void req_del_user(unsigned char *data, size_t datalen, struct child_data *sender) @@ -298,20 +303,23 @@ void reqmap_free(void) * 7. Parent spins until the needed number of signals is reached. */ +static unsigned char packet[MSG_MAX + 1]; + bool handle_child_req(int in_fd) { - unsigned char packet[MSG_MAX + 1]; - ssize_t packet_len = read(in_fd, packet, MSG_MAX); - struct child_data *sender = NULL; + if((size_t)packet_len < sizeof(pid_t) + 1) + { + /* the pipe is probably broken (i.e. disconnect), so we don't + * try to send a reply */ + return false; + } - if(packet_len <= 0) - goto fail; + struct child_data *sender = NULL; pid_t sender_pid; memcpy(&sender_pid, packet, sizeof(pid_t)); - debugf("servreq: Got request from PID %d\n", sender_pid); sender = hash_lookup(child_map, &sender_pid); @@ -328,6 +336,8 @@ bool handle_child_req(int in_fd) struct child_request *req = hash_lookup(request_map, &cmd); + debugf("Child %d sends request %d\n", sender_pid, cmd); + if(!req) { debugf("Unknown request.\n"); @@ -360,8 +370,6 @@ bool handle_child_req(int in_fd) if(child->pid == sender->pid) continue; - debugf("iterating over child %d\n", child->pid); - switch(req->which) { case CHILD_ALL: @@ -375,19 +383,14 @@ bool handle_child_req(int in_fd) finish: - debugf("finalizing request\n"); - if(req && req->finalize) req->finalize(data, datalen, sender); /* fall through */ fail: + if(sender) - { send_packet(sender, REQ_ALLDONE, NULL, 0); - debugf("sending all done code\n"); - } - return true; } |