diff options
| author | Franklin Wei <git@fwei.tk> | 2016-01-26 20:56:29 -0500 |
|---|---|---|
| committer | Franklin Wei <git@fwei.tk> | 2016-01-26 20:56:29 -0500 |
| commit | cb21d47e2f9bf52f887241301c7437a367cd79ef (patch) | |
| tree | 3c42f931c5d20ee2775b40438b0255634311034a | |
| parent | aac76c84d5c2c9f68c16ed1a7dfeb98d200e3a30 (diff) | |
| download | netcosm-cb21d47e2f9bf52f887241301c7437a367cd79ef.zip netcosm-cb21d47e2f9bf52f887241301c7437a367cd79ef.tar.gz netcosm-cb21d47e2f9bf52f887241301c7437a367cd79ef.tar.bz2 netcosm-cb21d47e2f9bf52f887241301c7437a367cd79ef.tar.xz | |
fix USER LIST command
| -rw-r--r-- | .travis.yml | 2 | ||||
| -rw-r--r-- | src/client.c | 7 | ||||
| -rw-r--r-- | src/server_reqs.c | 24 | ||||
| -rw-r--r-- | src/server_reqs.h | 1 | ||||
| -rw-r--r-- | src/userdb.c | 13 | ||||
| -rw-r--r-- | src/userdb.h | 3 |
6 files changed, 44 insertions, 6 deletions
diff --git a/.travis.yml b/.travis.yml index 17f814f..113ddeb 100644 --- a/.travis.yml +++ b/.travis.yml @@ -14,4 +14,4 @@ script: - make -j2 - sudo make install deploy: - - sudo netcosm 23 + - ./tests/all.sh 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); |