aboutsummaryrefslogtreecommitdiff
path: root/user_data.c
diff options
context:
space:
mode:
authortomsmeding <tom.smeding@gmail.com>2017-03-16 21:06:11 +0100
committertomsmeding <tom.smeding@gmail.com>2017-03-16 21:06:57 +0100
commit047e1828901b5b08cd538a7b11c0de2149606797 (patch)
tree9249612fe9bb88bf3063733744a6c02c391e5739 /user_data.c
parenta441b302c2c11c291df60fe642ec0d51646218dd (diff)
Basic message sending
TODO: broadcast to all online fd's of a user? TODO: close users that aren't reachable in a broadcast?
Diffstat (limited to 'user_data.c')
-rw-r--r--user_data.c26
1 files changed, 22 insertions, 4 deletions
diff --git a/user_data.c b/user_data.c
index 5bd4a6d..77e09cc 100644
--- a/user_data.c
+++ b/user_data.c
@@ -1,3 +1,5 @@
+#include <string.h>
+#include <assert.h>
#include "user_data.h"
@@ -28,8 +30,7 @@ void userdata_register(i64 userid,int fd){
if(item){
for(i64 i=0;i<item->data.fds_len;i++){
if(item->data.fds[i]==fd){
- debug("userdata_register(%lld, %d) while pair already existed",userid,fd);
- return;
+ die("userdata_register(%lld, %d) while pair already existed",userid,fd);
}
}
if(item->data.fds_len==item->data.fds_cap){
@@ -49,6 +50,23 @@ void userdata_register(i64 userid,int fd){
}
}
-void userdata_unregister(i64 userid,int fd);
+void userdata_unregister(i64 userid,int fd){
+ struct hash_item *item=find_userdata(userid);
+ assert(item);
+ i64 i;
+ for(i=0;i<item->data.fds_len;i++){
+ if(item->data.fds[i]==fd)break;
+ }
+ if(i==item->data.fds_len){
+ die("userdata_unregister(%lld, %d) while nonexistent",userid,fd);
+ }
+ memmove(item->data.fds+i,item->data.fds+i+1,item->data.fds_len-i-1);
+ item->data.fds_len--;
+}
-bool userdata_online(i64 userid);
+int userdata_online(i64 userid){
+ struct hash_item *item=find_userdata(userid);
+ if(!item)return false;
+ assert(item->data.fds_len!=0);
+ return item->data.fds[0]; // TODO: return all fds in some way?
+}