aboutsummaryrefslogtreecommitdiff
path: root/src/server_reqs.c
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2016-01-17 20:15:31 -0500
committerFranklin Wei <git@fwei.tk>2016-01-17 20:15:31 -0500
commit7c98d81dafd9b8bc8745d897603a424aee328c1c (patch)
tree01986b70644af5a80f963fcfc8d99b5239d6718d /src/server_reqs.c
parent9a98c157ebdc6e400f076485a4d78e9026ea1a16 (diff)
downloadnetcosm-7c98d81dafd9b8bc8745d897603a424aee328c1c.zip
netcosm-7c98d81dafd9b8bc8745d897603a424aee328c1c.tar.gz
netcosm-7c98d81dafd9b8bc8745d897603a424aee328c1c.tar.bz2
netcosm-7c98d81dafd9b8bc8745d897603a424aee328c1c.tar.xz
rewrite message-passing, no signals needed!
Diffstat (limited to 'src/server_reqs.c')
-rw-r--r--src/server_reqs.c94
1 files changed, 20 insertions, 74 deletions
diff --git a/src/server_reqs.c b/src/server_reqs.c
index 01e8e16..a17f333 100644
--- a/src/server_reqs.c
+++ b/src/server_reqs.c
@@ -27,6 +27,7 @@ static volatile sig_atomic_t num_acks_wanted, num_acks_recvd, inc_acks = 0;
static void send_packet(struct child_data *child, unsigned char cmd,
void *data, size_t datalen)
{
+ assert(datalen < MSG_MAX);
unsigned char pkt[MSG_MAX];
pkt[0] = cmd;
if(datalen)
@@ -40,10 +41,6 @@ static void req_pass_msg(unsigned char *data, size_t datalen,
(void) sender;
send_packet(child, REQ_BCASTMSG, data, datalen);
-
- union sigval nothing = { 0 };
- sigqueue(child->pid, SIGRTMIN, nothing);
- ++num_acks_wanted;
}
static void req_send_clientinfo(unsigned char *data, size_t datalen,
@@ -81,14 +78,9 @@ 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);
- debugf("State changed to %d\n", sender->state);
- }
else
- {
debugf("State data is of the wrong size %*s\n", datalen, data);
- }
}
static void req_change_user(unsigned char *data, size_t datalen,
@@ -115,11 +107,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));
- union sigval nothing = { 0 };
- sigqueue(child->pid, SIGRTMIN, nothing);
- }
}
}
@@ -172,16 +160,14 @@ static void req_move_room(unsigned char *data, size_t datalen, struct child_data
/* TODO: checking */
sig_debugf("Moving in direction %d\n", dir);
room_id new = current->adjacent[dir];
- bool status;
+ int status = 0;
if(new != ROOM_NONE)
{
child_set_room(sender, new);
- status = true;
- }
- else
- {
- status = false;
+ status = 1;
}
+ sig_debugf("server status: %d\n", status);
+
send_packet(sender, REQ_MOVE, &status, sizeof(status));
}
@@ -251,19 +237,19 @@ static const struct child_request {
unsigned char cmd_to_send;
} requests[] = {
{ REQ_NOP, false, CHILD_NONE, NULL, NULL, REQ_NOP },
- { REQ_BCASTMSG, true, CHILD_ALL, req_pass_msg, NULL, REQ_BCASTMSG },
- { REQ_LISTCLIENTS, false, CHILD_ALL, req_send_clientinfo, req_send_geninfo, REQ_BCASTMSG },
+ { REQ_BCASTMSG, true, CHILD_ALL, req_pass_msg, NULL, REQ_NOP },
+ { REQ_LISTCLIENTS, false, CHILD_ALL, req_send_clientinfo, req_send_geninfo, REQ_NOP },
{ REQ_CHANGESTATE, true, CHILD_SENDER, req_change_state, NULL, REQ_NOP },
{ REQ_CHANGEUSER, true, CHILD_SENDER, req_change_user, NULL, REQ_NOP },
{ REQ_KICK, true, CHILD_ALL, req_kick_client, NULL, REQ_NOP },
{ REQ_WAIT, false, CHILD_NONE, NULL, req_wait, REQ_NOP },
- { REQ_GETROOMDESC, false, CHILD_NONE, NULL, req_send_desc, REQ_BCASTMSG },
- { REQ_GETROOMNAME, false, CHILD_NONE, NULL, req_send_roomname, REQ_BCASTMSG },
+ { REQ_GETROOMDESC, false, CHILD_NONE, NULL, req_send_desc, REQ_NOP },
+ { REQ_GETROOMNAME, false, CHILD_NONE, NULL, req_send_roomname, REQ_NOP },
{ REQ_SETROOM, true, CHILD_NONE, NULL, req_set_room, REQ_NOP },
- { REQ_MOVE, true, CHILD_NONE, NULL, req_move_room, REQ_MOVE },
- { REQ_GETUSERDATA, true, CHILD_NONE, NULL, req_send_user, REQ_GETUSERDATA },
- { REQ_DELUSERDATA, true, CHILD_NONE, NULL, req_del_user, REQ_DELUSERDATA },
- { REQ_ADDUSERDATA, true, CHILD_NONE, NULL, req_add_user, REQ_ADDUSERDATA },
+ { REQ_MOVE, true, CHILD_NONE, NULL, req_move_room, REQ_NOP },
+ { REQ_GETUSERDATA, true, CHILD_NONE, NULL, req_send_user, REQ_NOP },
+ { REQ_DELUSERDATA, true, CHILD_NONE, NULL, req_del_user, REQ_NOP },
+ { REQ_ADDUSERDATA, true, CHILD_NONE, NULL, req_add_user, REQ_NOP },
//{ REQ_ROOMMSG, true, CHILD_ALL, req_send_room_msg, NULL, REQ_BCASTMSG },
};
@@ -308,6 +294,9 @@ bool handle_child_req(int in_fd)
ssize_t packet_len = read(in_fd, packet, MSG_MAX);
+ if(packet_len <= 0)
+ goto fail;
+
pid_t sender_pid;
memcpy(&sender_pid, packet, sizeof(pid_t));
sig_debugf("Got request from PID %d\n", sender_pid);
@@ -327,16 +316,6 @@ bool handle_child_req(int in_fd)
struct child_request *req = hash_lookup(request_map, &cmd);
- sigset_t old, block;
-
- sigemptyset(&block);
- sigaddset(&block, SIGRTMIN+1);
- sigprocmask(SIG_BLOCK, &block, &old);
-
- num_acks_wanted = 1;
- num_acks_recvd = 0;
- inc_acks = 1;
-
if(!req)
{
sig_debugf("Unknown request.\n");
@@ -382,47 +361,14 @@ bool handle_child_req(int in_fd)
finish:
- //if(req)
- //{
- // send_packet(sender, req->cmd_to_send, NULL, 0);
- //}
-
- if(req && req->finalize)
- req->finalize(data, datalen, sender);
-
- union sigval junk = { 0 };
- if(sender)
- sigqueue(sender->pid, SIGRTMIN, junk);
- else
- sig_debugf("Unknown PID sent request.\n");
-
- /* 5 ms */
-#define ACK_TIMEOUT 5000
-
- struct timespec timeout;
- timeout.tv_sec = 0;
- timeout.tv_nsec = ACK_TIMEOUT;
-
- while(num_acks_recvd < MIN(num_clients,num_acks_wanted))
+ if(req)
{
- if(sigtimedwait(&old, NULL, &timeout) < 0 && errno == EAGAIN)
- break;
+ send_packet(sender, req->cmd_to_send, NULL, 0);
}
- inc_acks = 0;
-
- sigprocmask(SIG_SETMASK, &old, NULL);
+ if(req && req->finalize)
+ req->finalize(data, datalen, sender);
fail:
return true;
}
-
-void master_ack_handler(int s, siginfo_t *info, void *v)
-{
- (void) s;
- (void) v;
- if(inc_acks && hash_lookup(child_map, &info->si_pid))
- {
- ++num_acks_recvd;
- }
-}