aboutsummaryrefslogtreecommitdiff
path: root/src/client.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/client.c')
-rw-r--r--src/client.c58
1 files changed, 29 insertions, 29 deletions
diff --git a/src/client.c b/src/client.c
index 8006154..7639273 100644
--- a/src/client.c
+++ b/src/client.c
@@ -2,7 +2,7 @@
static int client_fd, to_parent, from_parent;
-static room_id client_room;
+static room_id current_room = 0;
static volatile sig_atomic_t output_locked = 0;
@@ -59,9 +59,11 @@ static void signal_master(void)
printf("Request completely done.\n");
}
-void send_master(unsigned char cmd)
+void send_master(unsigned char cmd, const void *data, size_t sz)
{
write(to_parent, &cmd, 1);
+ if(data)
+ write(to_parent, data, sz);
signal_master();
}
@@ -154,22 +156,21 @@ void sigusr2_handler(int s, siginfo_t *info, void *vp)
request_complete = 1;
}
-void client_change_state(int state)
+static void client_change_state(int state)
{
printf("Client requesting state transition\n");
- unsigned char cmdcode = REQ_CHANGESTATE;
- write(to_parent, &cmdcode, sizeof(cmdcode));
- write(to_parent, &state, sizeof(state));
- signal_master();
+ send_master(REQ_CHANGESTATE, &state, sizeof(state));
printf("State transition completed.\n");
}
-void client_change_user(const char *user)
+static void client_change_user(const char *user)
{
- unsigned char cmdcode = REQ_CHANGEUSER;
- write(to_parent, &cmdcode, sizeof(cmdcode));
- write(to_parent, user, strlen(user) + 1);
- signal_master();
+ send_master(REQ_CHANGEUSER, user, strlen(user) + 1);
+}
+
+static void client_change_room(room_id id)
+{
+ send_master(REQ_CHANGEROOM, &id, sizeof(id));
}
#define WSPACE " \t\r\n"
@@ -257,6 +258,7 @@ auth:
/* authenticated */
printf("Authenticated as %s\n", current_user);
client_change_user(current_user);
+ client_change_room(current_room);
while(1)
{
out(">> ");
@@ -362,23 +364,22 @@ auth:
if(!strcmp(what, "LIST"))
{
- unsigned char cmd_code = REQ_LISTCLIENTS;
- write(to_parent, &cmd_code, sizeof(cmd_code));
- signal_master();
+ send_master(REQ_LISTCLIENTS, NULL, 0);
}
else if(!strcmp(what, "KICK"))
{
char *pid_s = strtok_r(NULL, WSPACE, &save);
if(pid_s)
{
- unsigned char cmd_code = REQ_KICK;
- write(to_parent, &cmd_code, sizeof(cmd_code));
+ /* weird pointer voodoo */
+ /* TODO: simplify */
+ char buf[MSG_MAX];
pid_t pid = strtol(pid_s, NULL, 0);
- write(to_parent, &pid, sizeof(pid));
- char buf[128];
- int len = snprintf(buf, sizeof(buf), "You were kicked.\n");
- write(to_parent, buf, len);
- signal_master();
+ *((pid_t*)buf) = pid;
+ int len = sizeof(pid_t) + snprintf(buf + sizeof(pid_t),
+ sizeof(buf) - sizeof(pid_t),
+ "You were kicked.\n");
+ send_master(REQ_KICK, buf, len);
printf("Success.\n");
}
else
@@ -398,11 +399,11 @@ auth:
}
else if(!strcmp(tok, "SAY"))
{
+ char buf[MSG_MAX];
char *what = strtok_r(NULL, "", &save);
- unsigned char cmd_code = REQ_BCASTMSG;
- write(to_parent, &cmd_code, sizeof(cmd_code));
- dprintf(to_parent, "%s says %s", current_user, what);
- signal_master();
+ int len = snprintf(buf, sizeof(buf), "%s says %s", current_user, what);
+
+ send_master(REQ_BCASTMSG, buf, len);
}
else if(!strcmp(tok, "DATE"))
{
@@ -416,12 +417,11 @@ auth:
}
else if(!strcmp(tok, "LOOK"))
{
- //out(room_get(client_room)->data.desc);
- //out("\n");
+ send_master(REQ_LOOK, NULL, 0);
}
else if(!strcmp(tok, "WAIT"))
{
- send_master(REQ_WAIT);
+ send_master(REQ_WAIT, NULL, 0);
}
next_cmd: