aboutsummaryrefslogtreecommitdiff
path: root/src/server_ssh.c
diff options
context:
space:
mode:
authorToni Uhlig <matzeton@googlemail.com>2018-04-21 20:36:42 +0200
committerToni Uhlig <matzeton@googlemail.com>2018-04-21 20:36:50 +0200
commit44bb4bb4c68724d52a014425b6bbcec1c0f45274 (patch)
tree3c4d4efcd0b08de09fcb0f75da8a430efb240a79 /src/server_ssh.c
parent658a987c28a6265bc1c80cfe649ed456cf49b42e (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.c59
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,