From 24b524040be4af9204f9d509ef6b8153aa6dc2cc Mon Sep 17 00:00:00 2001 From: Milo Jhoran Date: Sun, 8 Aug 2010 02:27:51 +0200 Subject: server: Added an API entry for the message callback. Signed-off-by: Andreas Schneider --- include/libssh/messages.h | 1 - include/libssh/server.h | 4 +++- include/libssh/session.h | 3 ++- libssh/server.c | 13 +++++++------ 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/include/libssh/messages.h b/include/libssh/messages.h index 6c753c4e..3029ae88 100644 --- a/include/libssh/messages.h +++ b/include/libssh/messages.h @@ -83,7 +83,6 @@ SSH_PACKET_CALLBACK(ssh_packet_userauth_request); int ssh_message_handle_channel_request(ssh_session session, ssh_channel channel, ssh_buffer packet, const char *request, uint8_t want_reply); -int ssh_execute_message_callbacks(ssh_session session); void ssh_message_queue(ssh_session session, ssh_message message); ssh_message ssh_message_pop_head(ssh_session session); diff --git a/include/libssh/server.h b/include/libssh/server.h index 70b4bd60..6d1d706f 100644 --- a/include/libssh/server.h +++ b/include/libssh/server.h @@ -159,7 +159,9 @@ LIBSSH_API int ssh_message_service_reply_success(ssh_message msg); LIBSSH_API char *ssh_message_service_service(ssh_message msg); LIBSSH_API void ssh_set_message_callback(ssh_session session, - int(*ssh_message_callback)(ssh_session session, ssh_message msg)); + int(*ssh_message_callback)(ssh_session session, ssh_message msg, void *data), + void *data); +LIBSSH_API int ssh_execute_message_callbacks(ssh_session session); LIBSSH_API char *ssh_message_channel_request_open_originator(ssh_message msg); LIBSSH_API int ssh_message_channel_request_open_originator_port(ssh_message msg); diff --git a/include/libssh/session.h b/include/libssh/session.h index 1d6830c3..86188fa8 100644 --- a/include/libssh/session.h +++ b/include/libssh/session.h @@ -115,7 +115,8 @@ struct ssh_session_struct { int auth_methods; int hostkeys; /* contains type of host key wanted by client, in server impl */ struct ssh_list *ssh_message_list; /* list of delayed SSH messages */ - int (*ssh_message_callback)( struct ssh_session_struct *session, ssh_message msg); + int (*ssh_message_callback)( struct ssh_session_struct *session, ssh_message msg, void *userdata); + void *ssh_message_callback_data; int log_verbosity; /*cached copy of the option structure */ int log_indent; /* indentation level in enter_function logs */ diff --git a/libssh/server.c b/libssh/server.c index 3e73ab9d..7f6ecf0b 100644 --- a/libssh/server.c +++ b/libssh/server.c @@ -1132,19 +1132,21 @@ char *ssh_message_channel_request_subsystem(ssh_message msg){ * must take care of the response). */ void ssh_set_message_callback(ssh_session session, - int(*ssh_message_callback_)(ssh_session session, ssh_message msg)){ + int(*ssh_message_callback_)(ssh_session session, ssh_message msg, void *data), void *data){ session->ssh_message_callback=ssh_message_callback_; + session->ssh_message_callback_data=data; } int ssh_execute_message_callbacks(ssh_session session){ ssh_message msg=NULL; int ret; + ssh_handle_packets(session, 0); if(!session->ssh_message_list) return SSH_OK; if(session->ssh_message_callback){ - while(ssh_list_pop_head(ssh_message , session->ssh_message_list) != NULL){ - msg=ssh_message_pop_head(session); - ret=session->ssh_message_callback(session,msg); + while((msg=ssh_message_pop_head(session)) != NULL) { + ret=session->ssh_message_callback(session,msg, + session->ssh_message_callback_data); if(ret==1){ ret = ssh_message_reply_default(msg); ssh_message_free(msg); @@ -1155,8 +1157,7 @@ int ssh_execute_message_callbacks(ssh_session session){ } } } else { - while(ssh_list_pop_head(ssh_message , session->ssh_message_list) != NULL){ - msg=ssh_message_pop_head(session); + while((msg=ssh_message_pop_head(session)) != NULL) { ret = ssh_message_reply_default(msg); ssh_message_free(msg); if(ret != SSH_OK) -- cgit v1.2.3