aboutsummaryrefslogtreecommitdiff
path: root/lobby.c
diff options
context:
space:
mode:
Diffstat (limited to 'lobby.c')
-rw-r--r--lobby.c76
1 files changed, 56 insertions, 20 deletions
diff --git a/lobby.c b/lobby.c
index 4004983..2007f2a 100644
--- a/lobby.c
+++ b/lobby.c
@@ -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);
}