diff options
Diffstat (limited to 'src/server.c')
-rw-r--r-- | src/server.c | 34 |
1 files changed, 16 insertions, 18 deletions
diff --git a/src/server.c b/src/server.c index 0addcf2..bcca3a9 100644 --- a/src/server.c +++ b/src/server.c @@ -103,7 +103,7 @@ void map_load_node(map *m, uint32_t x, uint32_t y, uint32_t color) case 0xff9de2: n->type = N_VALLEY_FLOWER; break; // TODO: color case 0x016300: n->type = N_BIG_TREE; break; default: - fprintf(stderr, "invalid color in map %*s at %"PRIu32" %"PRIu32": %06x\n", + fprintf(stderr, "invalid color in map %.*s at %"PRIu32" %"PRIu32": %06x\n", PSTR(m->name), x, y, color); n->present = false; break; @@ -195,8 +195,8 @@ void ser_node(strbuf *w, node *n) void send_players(game *g) { for (size_t i = 0; i < g->players.len; i++) { - player *p = &g->players.data[i]; - if (p->auth) SEND_PKT(p->conn, CPKT_PLAYERS, + player *to = &g->players.data[i]; + if (to->auth) SEND_PKT(to->conn, CPKT_PLAYERS, ser_u16(&pkt, g->players.len); for (size_t i = 0; i < g->players.len; i++) { player *p = &g->players.data[i]; @@ -264,7 +264,7 @@ bool handle_hi(str pkt, player *p, game *g) return false; if (str_cmp(g->passphrase, pass) != 0) { - printf("wrong passphrase from %*s\n", PSTR(name)); // TODO: log ip ? + printf("wrong passphrase from %.*s\n", PSTR(name)); // TODO: log ip ? SEND_PKT(p->conn, CPKT_FAIL, ser_fail_reason(&pkt, FAIL_WRONG_PASS);) return true; // valid pkt, but invalid passphrase } @@ -277,7 +277,7 @@ bool handle_hi(str pkt, player *p, game *g) } } - printf("player authenticated as %*s\n", PSTR(name)); + printf("player authenticated as %.*s\n", PSTR(name)); p->auth = true; p->name = str_clone(name); @@ -342,16 +342,8 @@ int main() for (;;) { struct pollfd fds[g.players.len + 1]; - for (size_t i = 0; i < g.players.len;) { - player *p = &g.players.data[i]; - if (p->conn.disco) { - printf("player %*s disconnected\n", PSTR(p->name)); - player_remove(p, &g); - continue; - } - - fds[i++] = peer_prepare(&p->conn); - } + for (size_t i = 0; i < g.players.len; i++) + fds[i] = peer_prepare(&g.players.data[i].conn); fds[g.players.len].fd = g.accept_fd; fds[g.players.len].events = POLLIN; @@ -370,9 +362,13 @@ int main() player *p = &g.players.data[i]; str pkt = peer_recv(&p->conn, fds[i]); - if (p->conn.disco || pkt.len == 0) - continue; - if (!handle_pkt(pkt, p, &g)) + if (p->conn.disco) { + printf("player %.*s disconnected\n", PSTR(p->name)); + player_remove(p, &g); + goto cont; + } + + if (pkt.len > 0 && !handle_pkt(pkt, p, &g)) invalid_pkt(&p->conn, pkt); } @@ -388,5 +384,7 @@ int main() p->name = S("(unauthenticated)"); peer_init(&p->conn, socket, &p->name); } + + cont: continue; } } |