diff options
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | src/client.c | 8 | ||||
| -rw-r--r-- | src/server.c | 38 | ||||
| -rw-r--r-- | src/server_reqs.c | 2 | ||||
| -rw-r--r-- | src/telnet.c | 12 | ||||
| -rw-r--r-- | src/userdb.c | 16 | ||||
| -rw-r--r-- | src/userdb.h | 1 | ||||
| -rw-r--r-- | worlds/test.c | 2 |
8 files changed, 43 insertions, 38 deletions
@@ -1,4 +1,4 @@ -CC = clang +CC = cc OUT = build PLATFORM = unix diff --git a/src/client.c b/src/client.c index 464fca8..0482b4b 100644 --- a/src/client.c +++ b/src/client.c @@ -325,7 +325,7 @@ bool poll_requests(void) } case REQ_ALLDONE: request_complete = 1; - break; + return true; default: sig_debugf("WARNING: client process received unknown code %d\n", cmd); break; @@ -457,8 +457,10 @@ auth: if(current_data) { - out("Access Granted.\n\n"); + out("Last login: %s", ctime(¤t_data->last_login)); + current_data->last_login = time(0); authlevel = current_data->priv; + userdb_request_add(current_data); break; } else @@ -466,7 +468,7 @@ auth: client_change_state(STATE_FAILED); free(current_user); current_user = NULL; - out("Access Denied.\n\n"); + out("Login incorrect\n\n"); if(++failures >= MAX_FAILURES) return; } diff --git a/src/server.c b/src/server.c index 90a313f..94cb709 100644 --- a/src/server.c +++ b/src/server.c @@ -91,6 +91,7 @@ volatile sig_atomic_t reap_children = 0; static void sigchld_handler(int sig) { + (void) sig; reap_children = 1; } @@ -106,20 +107,24 @@ static void __attribute__((noreturn)) serv_cleanup(void) /* kill all our children (usually init claims them and wait()'s for them, but not always) */ - struct sigaction sa; - sigfillset(&sa.sa_mask); - sigaddset(&sa.sa_mask, SIGCHLD); - sa.sa_handler = SIG_IGN; - sigaction(SIGCHLD, &sa, NULL); /* kill all children */ - void *ptr = child_map, *save; - do { - struct child_data *child = hash_iterate(ptr, &save, NULL); - if(!child) - break; - ptr = NULL; - //kill(child->pid, SIGKILL); - } while(1); - handle_disconnects(); + if(child_map) + { + struct sigaction sa; + sigfillset(&sa.sa_mask); + sigaddset(&sa.sa_mask, SIGCHLD); + sa.sa_handler = SIG_IGN; + sa.sa_flags = 0; + sigaction(SIGCHLD, &sa, NULL); /* kill all children */ + void *ptr = child_map, *save; + do { + struct child_data *child = hash_iterate(ptr, &save, NULL); + if(!child) + break; + ptr = NULL; + kill(child->pid, SIGKILL); + } while(1); + handle_disconnects(); + } if(shutdown(server_socket, SHUT_RDWR) > 0) error("shutdown"); @@ -210,8 +215,6 @@ static void childreq_cb(EV_P_ ev_io *w, int revents) { (void) EV_A; (void) w; - if(reap_children) - handle_disconnects(); /* data from a child's pipe */ if(revents & EV_READ) { @@ -220,6 +223,8 @@ static void childreq_cb(EV_P_ ev_io *w, int revents) handle_disconnects(); } } + if(reap_children) + handle_disconnects(); } static void new_connection_cb(EV_P_ ev_io *w, int revents) @@ -324,7 +329,6 @@ static void init_signals(void) /* libev's default SIGCHLD handler exhibits some really strange * behavior, which we don't like, so we use our own ;) */ - sigemptyset(&sa.sa_mask); sigaddset(&sa.sa_mask, SIGCHLD); sa.sa_handler = sigchld_handler; diff --git a/src/server_reqs.c b/src/server_reqs.c index 0aa8223..d461147 100644 --- a/src/server_reqs.c +++ b/src/server_reqs.c @@ -357,9 +357,7 @@ bool handle_child_req(int in_fd) finish: if(req) - { send_packet(sender, REQ_ALLDONE, NULL, 0); - } if(req && req->finalize) req->finalize(data, datalen, sender); diff --git a/src/telnet.c b/src/telnet.c index 9e664ea..12c9533 100644 --- a/src/telnet.c +++ b/src/telnet.c @@ -46,7 +46,8 @@ int telnet_handle_command(const unsigned char *buf) { ECHO, "ECHO" }, { SGA, "SGA" }, { STATUS, "STATUS" }, - { NAWS, "NAWS" } + { NAWS, "NAWS" }, + { IP, "IP" }, }; for(unsigned int i = 0; i < ARRAYLEN(commands); ++i) @@ -55,16 +56,11 @@ int telnet_handle_command(const unsigned char *buf) { debugf("%s ", commands[i].name); cmd = true; + if(c == IP) + return TELNET_EXIT; goto found; } } - switch(c) - { - case IP: - return TELNET_EXIT; - default: - break; - } debugf("???: %d ", c); found: diff --git a/src/userdb.c b/src/userdb.c index 9c7343a..79ba1f2 100644 --- a/src/userdb.c +++ b/src/userdb.c @@ -42,7 +42,7 @@ void userdb_init(const char *file) hash_setfreedata_cb(map, free); char *format; - asprintf(&format, "%%%d[a-z0-9 ]:%%%d[A-Z]:%%%ds:%%d\n", + asprintf(&format, "%%%d[a-z0-9 ]:%%%d[A-Z]:%%%ds:%%d:%%ld\n", MAX_NAME_LEN, SALT_LEN, AUTH_HASHLEN * 2); if(f) @@ -55,9 +55,10 @@ void userdb_init(const char *file) data->username, data->salt, data->passhash, - &data->priv); + &data->priv, + &data->last_login); - if(ret != 4) + if(ret != 5) { free(data); break; @@ -82,11 +83,12 @@ void userdb_write(const char *file) ptr = NULL; if(!user) break; - dprintf(fd, "%s:%*s:%*s:%d\n", + dprintf(fd, "%s:%*s:%*s:%d:%ld\n", user->username, SALT_LEN, user->salt, AUTH_HASHLEN*2, user->passhash, - user->priv); + user->priv, + user->last_login); } close(fd); } @@ -115,7 +117,7 @@ struct userdata_t *userdb_add(struct userdata_t *data) struct userdata_t *ret; - if((ret = hash_insert(map, new->username, new))) /* failure */ + if((ret = hash_insert(map, new->username, new))) /* already exists */ { hash_remove(map, new->username); ret = hash_insert(map, new->username, new); @@ -128,6 +130,8 @@ struct userdata_t *userdb_add(struct userdata_t *data) void userdb_shutdown(void) { + if(map && db_file) + userdb_write(db_file); if(map) { hash_free(map); diff --git a/src/userdb.h b/src/userdb.h index 36c4558..f499b78 100644 --- a/src/userdb.h +++ b/src/userdb.h @@ -35,6 +35,7 @@ struct userdata_t { priv_t priv; room_id room; + time_t last_login; }; /* call before using anything else */ diff --git a/worlds/test.c b/worlds/test.c index 770576e..b93b795 100644 --- a/worlds/test.c +++ b/worlds/test.c @@ -24,7 +24,7 @@ const struct roomdata_t netcosm_world[] = { { "beride_square_n_statue", "King Ajax IV Statue", - "Your path is blocked by an enormous bronze statue. A plaque on the pedestal reads,\n\nKing Ajax IV\n\n182 - 238 A.B.A.\nTo the south is the Beride Town Square.", + "Your path is blocked by an enormous bronze statue. A plaque on the pedestal reads,\n\nKing Ajax IV\n\n182 - 238 A.B.A.\n\nTo the south is the Beride Town Square.", { NONE_N, NONE_NE, NONE_E, NONE_SE, "world_start", NONE_SW, NONE_W, NONE_NW, NONE_UP, NONE_DN, NONE_IN, NONE_OT }, NULL, NULL, |