aboutsummaryrefslogtreecommitdiff
path: root/user_data.c
diff options
context:
space:
mode:
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?
+}