aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAris Adamantiadis <aris@0xbadc0de.be>2009-06-17 23:53:00 +0200
committerAris Adamantiadis <aris@0xbadc0de.be>2009-06-17 23:53:00 +0200
commitcf482ae3bfb8492d996cfc9e036f5086ff69eed4 (patch)
tree6f9ef588bdcaa8834006efea72d1cbe197a1ff6e
parent916958a2bb4be50f8562719119c143ba74fb803c (diff)
downloadlibssh-cf482ae3bfb8492d996cfc9e036f5086ff69eed4.tar.gz
libssh-cf482ae3bfb8492d996cfc9e036f5086ff69eed4.tar.xz
libssh-cf482ae3bfb8492d996cfc9e036f5086ff69eed4.zip
Begin of asynchronous SSH message parsing
-rw-r--r--include/libssh/priv.h4
-rw-r--r--libssh/channels.c2
-rw-r--r--libssh/messages.c12
-rw-r--r--libssh/packet.c8
4 files changed, 25 insertions, 1 deletions
diff --git a/include/libssh/priv.h b/include/libssh/priv.h
index 68f0e183..f344cedd 100644
--- a/include/libssh/priv.h
+++ b/include/libssh/priv.h
@@ -722,6 +722,10 @@ int ssh_handle_packets(SSH_SESSION *session);
/* match.c */
int match_hostname(const char *host, const char *pattern, unsigned int len);
+/* messages.c */
+
+void message_handle(SSH_SESSION *session, u32 type);
+
/* log.c */
#define _enter_function(sess) \
diff --git a/libssh/channels.c b/libssh/channels.c
index d637ee1c..3b36299d 100644
--- a/libssh/channels.c
+++ b/libssh/channels.c
@@ -542,6 +542,8 @@ static void channel_rcv_request(SSH_SESSION *session) {
leave_function();
return;
}
+ /* TODO call message_handle since it handles channel requests as messages */
+ /* *but* reset buffer before !! */
ssh_log(session, SSH_LOG_PACKET, "Unknown request %s", request);
SAFE_FREE(request);
diff --git a/libssh/messages.c b/libssh/messages.c
index 18946805..425829bb 100644
--- a/libssh/messages.c
+++ b/libssh/messages.c
@@ -806,6 +806,18 @@ void ssh_message_free(SSH_MESSAGE *msg){
SAFE_FREE(msg);
}
+/** \internal
+ * \brief handle various SSH request messages and stack them for callback
+ * \param session SSH session
+ * \param type packet type
+ * \returns nothing
+ */
+void message_handle(SSH_SESSION *session, u32 type){
+ SSH_MESSAGE *msg=ssh_message_retrieve(session,type);
+ if(msg){
+ /* TODO store msg somewhere */
+ }
+}
/**
* @}
*/
diff --git a/libssh/packet.c b/libssh/packet.c
index 4feca067..870efd4a 100644
--- a/libssh/packet.c
+++ b/libssh/packet.c
@@ -594,7 +594,7 @@ int packet_send(SSH_SESSION *session) {
void packet_parse(SSH_SESSION *session) {
STRING *error_s = NULL;
char *error = NULL;
- int type = session->in_packet.type;
+ u32 type = session->in_packet.type;
u32 tmp;
#ifdef HAVE_SSH1
@@ -652,9 +652,15 @@ void packet_parse(SSH_SESSION *session) {
case SSH2_MSG_CHANNEL_EOF:
case SSH2_MSG_CHANNEL_CLOSE:
channel_handle(session,type);
+ return;
case SSH2_MSG_IGNORE:
case SSH2_MSG_DEBUG:
return;
+ case SSH2_MSG_SERVICE_REQUEST:
+ case SSH2_MSG_USERAUTH_REQUEST:
+ case SSH2_MSG_CHANNEL_OPEN:
+ message_handle(session,type);
+ return;
default:
ssh_log(session, SSH_LOG_RARE, "Received unhandled packet %d", type);
}