aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2016-01-26 20:56:29 -0500
committerFranklin Wei <git@fwei.tk>2016-01-26 20:56:29 -0500
commitcb21d47e2f9bf52f887241301c7437a367cd79ef (patch)
tree3c42f931c5d20ee2775b40438b0255634311034a /src
parentaac76c84d5c2c9f68c16ed1a7dfeb98d200e3a30 (diff)
downloadnetcosm-cb21d47e2f9bf52f887241301c7437a367cd79ef.zip
netcosm-cb21d47e2f9bf52f887241301c7437a367cd79ef.tar.gz
netcosm-cb21d47e2f9bf52f887241301c7437a367cd79ef.tar.bz2
netcosm-cb21d47e2f9bf52f887241301c7437a367cd79ef.tar.xz
fix USER LIST command
Diffstat (limited to 'src')
-rw-r--r--src/client.c7
-rw-r--r--src/server_reqs.c24
-rw-r--r--src/server_reqs.h1
-rw-r--r--src/userdb.c13
-rw-r--r--src/userdb.h3
5 files changed, 43 insertions, 5 deletions
diff --git a/src/client.c b/src/client.c
index 6812702..e67cfb6 100644
--- a/src/client.c
+++ b/src/client.c
@@ -441,6 +441,11 @@ void client_drop(char *what)
send_master(REQ_DROP, what, strlen(what) + 1);
}
+void client_user_list(void)
+{
+ send_master(REQ_LISTUSERS, NULL, 0);
+}
+
#define WSPACE " \t\r\n"
void client_main(int fd, struct sockaddr_in *addr, int total, int to, int from)
@@ -619,7 +624,7 @@ auth:
}
else if(!strcmp(what, "LIST"))
{
- auth_user_list();
+ client_user_list();
}
else
{
diff --git a/src/server_reqs.c b/src/server_reqs.c
index f02ed1c..7767027 100644
--- a/src/server_reqs.c
+++ b/src/server_reqs.c
@@ -362,6 +362,25 @@ static void req_drop(unsigned char *data, size_t datalen, struct child_data *sen
userdb_write(USERFILE);
}
+static void req_listusers(unsigned char *data, size_t datalen, struct child_data *sender)
+{
+ (void) data;
+ (void) datalen;
+
+ void *save = NULL;
+ while(1)
+ {
+ struct userdata_t *user = userdb_iterate(&save);
+ if(!user)
+ break;
+
+ send_msg(sender, "%s: priv: %d room: %d last: %s", user->username,
+ user->priv,
+ user->room,
+ ctime(&user->last_login));
+ }
+}
+
static const struct child_request {
unsigned char code;
@@ -378,10 +397,11 @@ static const struct child_request {
} requests[] = {
{ REQ_NOP, false, CHILD_NONE, NULL, NULL, },
{ REQ_BCASTMSG, true, CHILD_ALL, req_pass_msg, NULL, },
- { REQ_LISTCLIENTS, false, CHILD_ALL, req_send_clientinfo, req_send_geninfo, },
{ REQ_CHANGESTATE, true, CHILD_SENDER, req_change_state, NULL, },
{ REQ_CHANGEUSER, true, CHILD_SENDER, req_change_user, NULL, },
{ REQ_KICK, true, CHILD_ALL, req_kick_client, NULL, },
+ { REQ_KICKALL, true, CHILD_ALL_BUT_SENDER, req_kick_always, NULL, },
+ { REQ_LISTCLIENTS, false, CHILD_ALL, req_send_clientinfo, req_send_geninfo, },
{ REQ_WAIT, false, CHILD_NONE, NULL, req_wait, },
{ REQ_GETROOMDESC, false, CHILD_NONE, NULL, req_send_desc, },
{ REQ_GETROOMNAME, false, CHILD_NONE, NULL, req_send_roomname, },
@@ -390,11 +410,11 @@ static const struct child_request {
{ REQ_GETUSERDATA, true, CHILD_NONE, NULL, req_send_user, },
{ REQ_DELUSERDATA, true, CHILD_NONE, NULL, req_del_user, },
{ REQ_ADDUSERDATA, true, CHILD_NONE, NULL, req_add_user, },
- { REQ_KICKALL, true, CHILD_ALL_BUT_SENDER, req_kick_always, NULL, },
{ REQ_LOOKAT, true, CHILD_NONE, NULL, req_look_at, },
{ REQ_TAKE, true, CHILD_NONE, NULL, req_take, },
{ REQ_PRINTINVENTORY, false, CHILD_NONE, NULL, req_inventory, },
{ REQ_DROP, true, CHILD_NONE, NULL, req_drop, },
+ { REQ_LISTUSERS, false, CHILD_NONE, NULL, req_listusers },
//{ REQ_ROOMMSG, true, CHILD_ALL, req_send_room_msg, NULL, },
};
diff --git a/src/server_reqs.h b/src/server_reqs.h
index 2b3d08f..3401ba2 100644
--- a/src/server_reqs.h
+++ b/src/server_reqs.h
@@ -42,6 +42,7 @@
#define REQ_TAKE 20 /* server: add object to user inventory */
#define REQ_PRINTINVENTORY 21 /* server: print user inventory */
#define REQ_DROP 22 /* server: drop user object if allowed */
+#define REQ_LISTUSERS 23 /* server: list users in USERFILE */
/* child states, sent as an int to the master */
#define STATE_INIT 0 /* initial state */
diff --git a/src/userdb.c b/src/userdb.c
index 5c80581..3d42133 100644
--- a/src/userdb.c
+++ b/src/userdb.c
@@ -204,8 +204,17 @@ size_t userdb_size(void)
return hash_size(map);
}
-/* child request wrappers */
-/* NOTE: also works from the master, but it's better to use the userdb_* funcs instead */
+struct userdata_t *userdb_iterate(void **save)
+{
+ if(*save)
+ return hash_iterate(NULL, save, NULL);
+ else
+ return hash_iterate(map, save, NULL);
+}
+
+/*** child request wrappers ***/
+/* NOTE: these also work from the master, but it's better to use the
+ * userdb_* funcs instead */
struct userdata_t *userdb_request_lookup(const char *name)
{
diff --git a/src/userdb.h b/src/userdb.h
index 2f122a9..1d1d6e2 100644
--- a/src/userdb.h
+++ b/src/userdb.h
@@ -65,6 +65,9 @@ void userdb_shutdown(void);
/* save the DB to disk */
void userdb_write(const char*);
+/* *save should be set to NULL on the first run */
+struct userdata_t *userdb_iterate(void **save);
+
/*** child-only functions ***/
struct userdata_t *userdb_request_lookup(const char *name);
bool userdb_request_add(struct userdata_t *data);