diff options
author | rodri <rgl@antares-labs.eu> | 2021-07-23 03:38:18 +0000 |
---|---|---|
committer | rodri <rgl@antares-labs.eu> | 2021-07-23 03:38:18 +0000 |
commit | 615575f7dca0e43ecb23c4ab1ea7fd2e93c4e3b4 (patch) | |
tree | f7c7052cbbac5b7af14f88adee1072352284d565 /lobby.c | |
parent | dfb8bd8c95a5ff8633214f483f358d24071a7d8a (diff) | |
download | musw-615575f7dca0e43ecb23c4ab1ea7fd2e93c4e3b4.tar.gz musw-615575f7dca0e43ecb23c4ab1ea7fd2e93c4e3b4.tar.bz2 musw-615575f7dca0e43ecb23c4ab1ea7fd2e93c4e3b4.zip |
implemented a lobby for users waiting to join a party.
brought the pack/unpack procedures from ssh(1).
Diffstat (limited to 'lobby.c')
-rw-r--r-- | lobby.c | 62 |
1 files changed, 62 insertions, 0 deletions
@@ -0,0 +1,62 @@ +#include <u.h> +#include <libc.h> +#include "dat.h" +#include "fns.h" + +static int +lobby_takeseat(Lobby *l, int fd) +{ + 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)); + } + + l->seats.fds[l->seats.len] = fd; + return l->seats.len++; +} + +static int +lobby_getcouple(Lobby *l, int *fds) +{ + 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->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)); + + l->seats.len -= 2; + return 0; + } + return -1; +} + +static int +lobby_leaveseat(Lobby *l, ulong idx) +{ + if(idx < l->seats.cap-1) + memmove(&l->seats.fds[idx], &l->seats.fds[idx+1], l->seats.cap*sizeof(int) - (l->seats.len + 1)*sizeof(int)); + l->seats.len--; + return 0; +} + +Lobby * +newlobby(void) +{ + Lobby *l; + + l = emalloc(sizeof(Lobby)); + memset(l, 0, sizeof(*l)); + l->takeseat = lobby_takeseat; + l->getcouple = lobby_getcouple; + l->leaveseat = lobby_leaveseat; + + return l; +} + +void +dellobby(Lobby *l) +{ + free(l->seats.fds); + free(l); +} |