diff options
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); } |