aboutsummaryrefslogtreecommitdiff
path: root/lobby.c
diff options
context:
space:
mode:
authorrodri <rgl@antares-labs.eu>2021-07-23 03:38:18 +0000
committerrodri <rgl@antares-labs.eu>2021-07-23 03:38:18 +0000
commit615575f7dca0e43ecb23c4ab1ea7fd2e93c4e3b4 (patch)
treef7c7052cbbac5b7af14f88adee1072352284d565 /lobby.c
parentdfb8bd8c95a5ff8633214f483f358d24071a7d8a (diff)
downloadmusw-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.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/lobby.c b/lobby.c
new file mode 100644
index 0000000..62322ad
--- /dev/null
+++ b/lobby.c
@@ -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);
+}