aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--src/client.c8
-rw-r--r--src/server.c38
-rw-r--r--src/server_reqs.c2
-rw-r--r--src/telnet.c12
-rw-r--r--src/userdb.c16
-rw-r--r--src/userdb.h1
-rw-r--r--worlds/test.c2
8 files changed, 43 insertions, 38 deletions
diff --git a/Makefile b/Makefile
index a1f591b..ebbbca0 100644
--- a/Makefile
+++ b/Makefile
@@ -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(&current_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,