diff options
author | Toni Uhlig <matzeton@googlemail.com> | 2018-04-21 20:36:42 +0200 |
---|---|---|
committer | Toni Uhlig <matzeton@googlemail.com> | 2018-04-21 20:36:50 +0200 |
commit | 44bb4bb4c68724d52a014425b6bbcec1c0f45274 (patch) | |
tree | 3c4d4efcd0b08de09fcb0f75da8a430efb240a79 /src/server_ssh.c | |
parent | 658a987c28a6265bc1c80cfe649ed456cf49b42e (diff) |
POTD skeleton #20.
Signed-off-by: Toni Uhlig <matzeton@googlemail.com>
Diffstat (limited to 'src/server_ssh.c')
-rw-r--r-- | src/server_ssh.c | 59 |
1 files changed, 57 insertions, 2 deletions
diff --git a/src/server_ssh.c b/src/server_ssh.c index 81dddc6..7082f70 100644 --- a/src/server_ssh.c +++ b/src/server_ssh.c @@ -228,8 +228,10 @@ static void ssh_log_cb(int priority, const char *function, static void * ssh_thread_mainloop(void *arg) { - int s, auth = 0; + int s, auth = 0, shell = 0; ssh_session ses; + ssh_message message; + ssh_channel chan = NULL; assert(arg); ssh_data *d = (ssh_data *) arg; @@ -258,6 +260,59 @@ ssh_thread_mainloop(void *arg) goto failed; } + /* wait for a channel session */ + do { + message = ssh_message_get(ses); + if (message) { + if (ssh_message_type(message) == SSH_REQUEST_CHANNEL_OPEN && + ssh_message_subtype(message) == SSH_CHANNEL_SESSION) + { + chan = ssh_message_channel_request_open_reply_accept(message); + ssh_message_free(message); + break; + } else { + ssh_message_reply_default(message); + ssh_message_free(message); + } + } else { + break; + } + } while (!chan); + + if (!chan) { + W("SSH client did not ask for a channel session: %s", + ssh_get_error(ses)); + goto failed; + } + + /* wait for a shell */ + do { + message = ssh_message_get(ses); + if (message != NULL) { + if (ssh_message_type(message) == SSH_REQUEST_CHANNEL) { + if (ssh_message_subtype(message) == SSH_CHANNEL_REQUEST_SHELL) { + shell = 1; + ssh_message_channel_request_reply_success(message); + ssh_message_free(message); + break; + } else if (ssh_message_subtype(message) == SSH_CHANNEL_REQUEST_PTY) { + ssh_message_channel_request_reply_success(message); + ssh_message_free(message); + continue; + } + } + ssh_message_reply_default(message); + ssh_message_free(message); + } else { + break; + } + } while (!shell); + + if (!shell) { + W("SSH client had no shell requested: %s", ssh_get_error(ses)); + goto failed; + } + failed: ssh_disconnect(ses); ssh_free(ses); @@ -299,7 +354,7 @@ static int authenticate(ssh_session session) case SSH_AUTH_METHOD_NONE: default: - N("SSH: User '%s' wants to auth with unknown auth '%d'\n", + N("SSH: User '%s' wants to auth with unknown auth '%d'", ssh_message_auth_user(message), ssh_message_subtype(message)); ssh_message_auth_set_methods(message, |