diff options
author | tomsmeding <tom.smeding@gmail.com> | 2017-03-16 21:06:11 +0100 |
---|---|---|
committer | tomsmeding <tom.smeding@gmail.com> | 2017-03-16 21:06:57 +0100 |
commit | 047e1828901b5b08cd538a7b11c0de2149606797 (patch) | |
tree | 9249612fe9bb88bf3063733744a6c02c391e5739 /user_data.c | |
parent | a441b302c2c11c291df60fe642ec0d51646218dd (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.c | 26 |
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? +} |