diff options
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? +} |