aboutsummaryrefslogtreecommitdiff
path: root/src/client.c
diff options
context:
space:
mode:
authorFranklin Wei <git@fwei.tk>2016-05-19 16:47:06 -0400
committerFranklin Wei <git@fwei.tk>2016-05-19 16:47:06 -0400
commitcb8af6e7bf5f6e70fc9722d36448213c719e83c8 (patch)
treeec9f93d6e1256d62a49fb628d8d7a3a931b58330 /src/client.c
parent7f3ba14388a586a946d721a71eb3a9862f7f6c02 (diff)
downloadnetcosm-cb8af6e7bf5f6e70fc9722d36448213c719e83c8.zip
netcosm-cb8af6e7bf5f6e70fc9722d36448213c719e83c8.tar.gz
netcosm-cb8af6e7bf5f6e70fc9722d36448213c719e83c8.tar.bz2
netcosm-cb8af6e7bf5f6e70fc9722d36448213c719e83c8.tar.xz
implement more of dunnet
Diffstat (limited to 'src/client.c')
-rw-r--r--src/client.c59
1 files changed, 33 insertions, 26 deletions
diff --git a/src/client.c b/src/client.c
index 7c69708..e06058d 100644
--- a/src/client.c
+++ b/src/client.c
@@ -38,6 +38,8 @@ static volatile sig_atomic_t output_locked = 0;
char *current_user = NULL;
+bool child_rawmode = false;
+
bool poll_requests(void);
void out_raw(const void *buf, size_t len)
@@ -160,6 +162,7 @@ tryagain:
if(len <= 0)
error("lost connection");
+ /* null-terminate */
buf[CLIENT_READ_SZ - 1] = '\0';
enum telnet_status ret = telnet_parse_data((unsigned char*)buf + bufidx, len);
@@ -609,43 +612,47 @@ auth:
while(1)
{
- out(">> ");
+ if(!child_rawmode)
+ out(">> ");
char *line = client_read();
char *orig = strdup(line);
char *save = NULL;
- char *tok = strtok_r(line, WSPACE, &save);
+ if(!child_rawmode)
+ {
+ char *tok = strtok_r(line, WSPACE, &save);
- if(!tok)
- goto next_cmd;
+ if(!tok)
+ goto next_cmd;
- all_upper(tok);
+ all_upper(tok);
- const struct client_cmd *cmd = hash_lookup(cmd_map, tok);
- if(cmd && cmd->cb && (!cmd->admin_only || (cmd->admin_only && are_admin)))
- {
- int ret = cmd->cb(&save);
- switch(ret)
+ const struct client_cmd *cmd = hash_lookup(cmd_map, tok);
+ if(cmd && cmd->cb && (!cmd->admin_only || (cmd->admin_only && are_admin)))
+ {
+ int ret = cmd->cb(&save);
+ switch(ret)
+ {
+ case CMD_OK:
+ goto next_cmd;
+ case CMD_LOGOUT:
+ free(line);
+ free(orig);
+ goto auth;
+ case CMD_QUIT:
+ free(line);
+ free(orig);
+ goto done;
+ default:
+ error("client: bad callback return value");
+ }
+ }
+ else if(cmd && cmd->admin_only && !are_admin)
{
- case CMD_OK:
+ out("You are not allowed to do that.\n");
goto next_cmd;
- case CMD_LOGOUT:
- free(line);
- free(orig);
- goto auth;
- case CMD_QUIT:
- free(line);
- free(orig);
- goto done;
- default:
- error("client: bad callback return value");
}
}
- else if(cmd && cmd->admin_only && !are_admin)
- {
- out("You are not allowed to do that.\n");
- goto next_cmd;
- }
/* if we can't handle it, let the master process try */
send_master(REQ_EXECVERB, orig, strlen(orig) + 1);