diff options
| author | Franklin Wei <git@fwei.tk> | 2016-05-19 16:47:06 -0400 |
|---|---|---|
| committer | Franklin Wei <git@fwei.tk> | 2016-05-19 16:47:06 -0400 |
| commit | cb8af6e7bf5f6e70fc9722d36448213c719e83c8 (patch) | |
| tree | ec9f93d6e1256d62a49fb628d8d7a3a931b58330 /src/client.c | |
| parent | 7f3ba14388a586a946d721a71eb3a9862f7f6c02 (diff) | |
| download | netcosm-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.c | 59 |
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); |