diff options
author | rodri <rgl@antares-labs.eu> | 2021-07-25 20:59:58 +0000 |
---|---|---|
committer | rodri <rgl@antares-labs.eu> | 2021-07-25 20:59:58 +0000 |
commit | bdaa63a1a4604ada3539aeb50e4af144da3ba6f0 (patch) | |
tree | 6aa3d68f94d7756d45f78cce10af1796bdb744d2 /lobby.c | |
parent | f54a8666413d80db3bda3de6e17f795faf7790eb (diff) | |
download | musw-bdaa63a1a4604ada3539aeb50e4af144da3ba6f0.tar.gz musw-bdaa63a1a4604ada3539aeb50e4af144da3ba6f0.tar.bz2 musw-bdaa63a1a4604ada3539aeb50e4af144da3ba6f0.zip |
implemented parties to hold PvP match info.
started serializing game state through the wire.
made some major changes to the Lobby struct, plus the ability to check the health of every connection.
added some more debug statements, did some cleanup and put more checks.
Diffstat (limited to 'lobby.c')
-rw-r--r-- | lobby.c | 76 |
1 files changed, 56 insertions, 20 deletions
@@ -4,40 +4,75 @@ #include "fns.h" static int -lobby_takeseat(Lobby *l, int fd) +lobby_takeseat(Lobby *l, char *dir, int cfd, int dfd) { - if(l->seats.len >= l->seats.cap){ - l->seats.cap += 8; - l->seats.fds = erealloc(l->seats.fds, l->seats.cap*sizeof(*l->seats.fds)); + if(l->nseats >= l->cap){ + l->cap += 8; + l->seats = erealloc(l->seats, l->cap*sizeof(*l->seats)); } - l->seats.fds[l->seats.len] = fd; - return l->seats.len++; + l->seats[l->nseats].name = nil; + memmove(l->seats[l->nseats].conn.dir, dir, sizeof l->seats[l->nseats].conn.dir); + l->seats[l->nseats].conn.ctl = cfd; + l->seats[l->nseats].conn.data = dfd; + + return l->nseats++; +} + +static int +lobby_leaveseat(Lobby *l, ulong idx) +{ + if(idx >= l->cap) + return -1; + + if(idx < l->cap - 1) + memmove(&l->seats[idx], &l->seats[idx+1], l->cap*sizeof(*l->seats) - (idx + 1)*sizeof(*l->seats)); + + return --l->nseats; } static int -lobby_getcouple(Lobby *l, int *fds) +lobby_getcouple(Lobby *l, Player *couple) { - if(l->seats.len >= 2){ - fds[0] = l->seats.fds[l->seats.len-2]; - fds[1] = l->seats.fds[l->seats.len-1]; + if(l->nseats >= 2){ + couple[0] = l->seats[l->nseats-2]; + couple[1] = l->seats[l->nseats-1]; - if(l->seats.len < l->seats.cap-2) - memmove(&l->seats.fds[l->seats.len], &l->seats.fds[l->seats.len+2], l->seats.cap*sizeof(int) - (l->seats.len + 2)*sizeof(int)); + if(l->nseats < l->cap - 2) + memmove(&l->seats[l->nseats], &l->seats[l->nseats+2], l->cap*sizeof(*l->seats) - (l->nseats + 2)*sizeof(*l->seats)); + + l->nseats -= 2; - l->seats.len -= 2; return 0; } + return -1; } -static int -lobby_leaveseat(Lobby *l, ulong idx) +static void +lobby_healthcheck(Lobby *l) { - if(idx < l->seats.cap-1) - memmove(&l->seats.fds[idx], &l->seats.fds[idx+1], l->seats.cap*sizeof(int) - (idx + 1)*sizeof(int)); - l->seats.len--; - return 0; + char status[48], buf[16]; + int i, fd; + + for(i = 0; i < l->nseats; i++){ + snprint(status, sizeof status, "%s/status", l->seats[i].conn.dir); + + fd = open(status, OREAD); + if(fd < 0) + goto cleanup; + + if(read(fd, buf, sizeof buf) > 0) + if(strncmp(buf, "Close", 5) == 0) + goto cleanup; + else{ + close(fd); + continue; + } +cleanup: + close(fd); + l->leaveseat(l, i); + } } Lobby * @@ -50,6 +85,7 @@ newlobby(void) l->takeseat = lobby_takeseat; l->getcouple = lobby_getcouple; l->leaveseat = lobby_leaveseat; + l->healthcheck = lobby_healthcheck; return l; } @@ -57,6 +93,6 @@ newlobby(void) void dellobby(Lobby *l) { - free(l->seats.fds); + free(l->seats); free(l); } |