diff options
author | Aris Adamantiadis <aris@0xbadc0de.be> | 2010-01-07 22:02:21 +0100 |
---|---|---|
committer | Aris Adamantiadis <aris@0xbadc0de.be> | 2010-01-07 22:02:21 +0100 |
commit | 228ac783977dd577c6d9272b4c3dccf06b8726db (patch) | |
tree | a074157496a72bc44204cdc958bf164db3abc772 /libssh | |
parent | b6656a1525c925bccc2c22b84fea37102ee10bfa (diff) | |
download | libssh-228ac783977dd577c6d9272b4c3dccf06b8726db.tar.gz libssh-228ac783977dd577c6d9272b4c3dccf06b8726db.tar.xz libssh-228ac783977dd577c6d9272b4c3dccf06b8726db.zip |
Changes to messages for async message handling
Diffstat (limited to 'libssh')
-rw-r--r-- | libssh/messages.c | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/libssh/messages.c b/libssh/messages.c index 6d0d62d8..365109f3 100644 --- a/libssh/messages.c +++ b/libssh/messages.c @@ -772,20 +772,22 @@ ssh_message ssh_message_retrieve(ssh_session session, uint32_t packettype){ return msg; } -/* \brief blocking message retrieval - * \bug does anything that is not a message, like a channel read/write +/** @brief Retrieves a SSH message from SSH session + * @param session SSH session + * @return The SSH message received, NULL in case of error. + * @warning This function blocks until a message has been received. Better + * set up a callback if this behavior is unwanted. */ ssh_message ssh_message_get(ssh_session session) { ssh_message msg = NULL; enter_function(); do { - if ((packet_read(session) != SSH_OK) || - (packet_translate(session) != SSH_OK)) { + if (ssh_handle_packets(session) == SSH_ERROR) { leave_function(); return NULL; } - } while(session->in_packet.type==SSH2_MSG_IGNORE || session->in_packet.type==SSH2_MSG_DEBUG); - msg=ssh_message_retrieve(session,session->in_packet.type); + msg=ssh_list_get_head(ssh_message, session->ssh_message_list); + } while(msg==NULL); leave_function(); return msg; } @@ -866,16 +868,27 @@ int message_handle(ssh_session session, void *user, uint8_t type, ssh_buffer pac (void)user; (void)packet; if(msg){ - if(!session->ssh_message_list){ - session->ssh_message_list=ssh_list_new(); - } - ssh_list_add(session->ssh_message_list,msg); + message_queue(session,msg); return SSH_PACKET_USED; } else { return SSH_PACKET_NOT_USED; } } +/** @internal + * @brief adds the message to the current queue of messages to be parsed + * @param session SSH session + * @param message message to add to the queue + */ +void message_queue(ssh_session session, ssh_message message){ + if(message){ + if(session->ssh_message_list == NULL){ + session->ssh_message_list=ssh_list_new(); + } + ssh_list_add(session->ssh_message_list,message); + } +} + /** * @} */ |