diff options
author | Aris Adamantiadis <aris@0xbadc0de.be> | 2011-07-19 22:16:28 +0200 |
---|---|---|
committer | Andreas Schneider <asn@cryptomilk.org> | 2011-09-17 22:01:43 +0200 |
commit | 0dc57fdcf17fd9e5c000e2a07380ec6878d3afcf (patch) | |
tree | f15352f0ddd948e9e9ba1ed1c5103d3333220bef /src | |
parent | 3799670d01f4faa68b6ab8055250bc042d707b29 (diff) | |
download | libssh-0dc57fdcf17fd9e5c000e2a07380ec6878d3afcf.tar.gz libssh-0dc57fdcf17fd9e5c000e2a07380ec6878d3afcf.tar.xz libssh-0dc57fdcf17fd9e5c000e2a07380ec6878d3afcf.zip |
Fixes the ssh_log issue on ssh_bind handles.
(cherry picked from commit da954c2c5ee85bcbe2f5ad9f507a6306b0f5f8b9)
Conflicts:
src/keyfiles.c
Diffstat (limited to 'src')
-rw-r--r-- | src/bind.c | 6 | ||||
-rw-r--r-- | src/callbacks.c | 2 | ||||
-rw-r--r-- | src/client.c | 4 | ||||
-rw-r--r-- | src/error.c | 9 | ||||
-rw-r--r-- | src/keyfiles.c | 14 | ||||
-rw-r--r-- | src/log.c | 64 | ||||
-rw-r--r-- | src/messages.c | 8 | ||||
-rw-r--r-- | src/options.c | 16 | ||||
-rw-r--r-- | src/server.c | 4 | ||||
-rw-r--r-- | src/session.c | 2 |
10 files changed, 78 insertions, 51 deletions
@@ -150,7 +150,7 @@ ssh_bind ssh_bind_new(void) { ZERO_STRUCTP(ptr); ptr->bindfd = SSH_INVALID_SOCKET; ptr->bindport= 22; - ptr->log_verbosity = 0; + ptr->common.log_verbosity = 0; return ptr; } @@ -359,7 +359,7 @@ int ssh_bind_accept(ssh_bind sshbind, ssh_session session) { } } - session->log_verbosity = sshbind->log_verbosity; + session->common.log_verbosity = sshbind->common.log_verbosity; ssh_socket_free(session->socket); session->socket = ssh_socket_new(session); @@ -375,7 +375,7 @@ int ssh_bind_accept(ssh_bind sshbind, ssh_session session) { session->dsa_key = dsa; session->rsa_key = rsa; -return SSH_OK; + return SSH_OK; } diff --git a/src/callbacks.c b/src/callbacks.c index bb42b4be..5a61180d 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -37,7 +37,7 @@ int ssh_set_callbacks(ssh_session session, ssh_callbacks cb) { leave_function(); return SSH_ERROR; } - session->callbacks = cb; + session->common.callbacks = cb; leave_function(); return 0; } diff --git a/src/client.c b/src/client.c index 060f20aa..829c70d5 100644 --- a/src/client.c +++ b/src/client.c @@ -40,8 +40,8 @@ #include "libssh/misc.h" #define set_status(session, status) do {\ - if (session->callbacks && session->callbacks->connect_status_function) \ - session->callbacks->connect_status_function(session->callbacks->userdata, status); \ + if (session->common.callbacks && session->common.callbacks->connect_status_function) \ + session->common.callbacks->connect_status_function(session->common.callbacks->userdata, status); \ } while (0) /** diff --git a/src/error.c b/src/error.c index e2d02ce7..46d6382d 100644 --- a/src/error.c +++ b/src/error.c @@ -24,6 +24,7 @@ #include <stdio.h> #include <stdarg.h> #include "libssh/priv.h" +#include "libssh/session.h" /** * @defgroup libssh_error The SSH error functions. @@ -48,13 +49,13 @@ * @param ... The arguments for the format string. */ void ssh_set_error(void *error, int code, const char *descr, ...) { - struct error_struct *err = error; + struct ssh_common_struct *err = error; va_list va; va_start(va, descr); - vsnprintf(err->error_buffer, ERROR_BUFFERLEN, descr, va); + vsnprintf(err->error.error_buffer, ERROR_BUFFERLEN, descr, va); va_end(va); - err->error_code = code; - ssh_log(error,SSH_LOG_RARE,"Error : %s",err->error_buffer); + err->error.error_code = code; + ssh_log_common(err,SSH_LOG_RARE,"Error : %s",err->error.error_buffer); } /** diff --git a/src/keyfiles.c b/src/keyfiles.c index e160f71f..58f2a464 100644 --- a/src/keyfiles.c +++ b/src/keyfiles.c @@ -705,7 +705,7 @@ ssh_private_key privatekey_from_file(ssh_session session, const char *filename, ssh_log(session, SSH_LOG_RARE, "Trying to read %s, passphase=%s, authcb=%s", filename, passphrase ? "true" : "false", - session->callbacks && session->callbacks->auth_function ? "true" : "false"); + session->common.callbacks && session->common.callbacks->auth_function ? "true" : "false"); if (type == 0) { type = privatekey_type_from_file(file); @@ -719,9 +719,9 @@ ssh_private_key privatekey_from_file(ssh_session session, const char *filename, case SSH_KEYTYPE_DSS: if (passphrase == NULL) { #ifdef HAVE_LIBGCRYPT - if (session->callbacks && session->callbacks->auth_function) { - auth_cb = session->callbacks->auth_function; - auth_ud = session->callbacks->userdata; + if (session->common.callbacks && session->common.callbacks->auth_function) { + auth_cb = session->common.callbacks->auth_function; + auth_ud = session->common.callbacks->userdata; valid = read_dsa_privatekey(file, &dsa, auth_cb, auth_ud, "Passphrase for private key:"); @@ -761,9 +761,9 @@ ssh_private_key privatekey_from_file(ssh_session session, const char *filename, case SSH_KEYTYPE_RSA: if (passphrase == NULL) { #ifdef HAVE_LIBGCRYPT - if (session->callbacks && session->callbacks->auth_function) { - auth_cb = session->callbacks->auth_function; - auth_ud = session->callbacks->userdata; + if (session->common.callbacks && session->common.callbacks->auth_function) { + auth_cb = session->common.callbacks->auth_function; + auth_ud = session->common.callbacks->userdata; valid = read_rsa_privatekey(file, &rsa, auth_cb, auth_ud, "Passphrase for private key:"); } else { /* authcb */ @@ -37,6 +37,33 @@ * @{ */ +/** @internal + * @brief do the actual work of logging an event + */ + +static void do_ssh_log(struct ssh_common_struct *common, int verbosity, + const char *buffer){ + char indent[256]; + int min; + if (common->callbacks && common->callbacks->log_function) { + common->callbacks->log_function((ssh_session)common, verbosity, buffer, + common->callbacks->userdata); + } else if (verbosity == SSH_LOG_FUNCTIONS) { + if (common->log_indent > 255) { + min = 255; + } else { + min = common->log_indent; + } + + memset(indent, ' ', min); + indent[min] = '\0'; + + fprintf(stderr, "[func] %s%s\n", indent, buffer); + } else { + fprintf(stderr, "[%d] %s\n", verbosity, buffer); + } +} + /** * @brief Log a SSH event. * @@ -48,32 +75,31 @@ */ void ssh_log(ssh_session session, int verbosity, const char *format, ...) { char buffer[1024]; - char indent[256]; - int min; va_list va; - if (verbosity <= session->log_verbosity) { + if (verbosity <= session->common.log_verbosity) { va_start(va, format); vsnprintf(buffer, sizeof(buffer), format, va); va_end(va); + do_ssh_log(&session->common, verbosity, buffer); + } +} - if (session->callbacks && session->callbacks->log_function) { - session->callbacks->log_function(session, verbosity, buffer, - session->callbacks->userdata); - } else if (verbosity == SSH_LOG_FUNCTIONS) { - if (session->log_indent > 255) { - min = 255; - } else { - min = session->log_indent; - } - - memset(indent, ' ', min); - indent[min] = '\0'; +/** @internal + * @brief log a SSH event with a common pointer + * @param common The SSH/bind session. + * @param verbosity The verbosity of the event. + * @param format The format string of the log entry. + */ +void ssh_log_common(struct ssh_common_struct *common, int verbosity, const char *format, ...){ + char buffer[1024]; + va_list va; - fprintf(stderr, "[func] %s%s\n", indent, buffer); - } else { - fprintf(stderr, "[%d] %s\n", verbosity, buffer); - } + if (verbosity <= common->log_verbosity) { + va_start(va, format); + vsnprintf(buffer, sizeof(buffer), format, va); + va_end(va); + do_ssh_log(common, verbosity, buffer); } } diff --git a/src/messages.c b/src/messages.c index dfe04a14..ff8c1c17 100644 --- a/src/messages.c +++ b/src/messages.c @@ -945,9 +945,9 @@ SSH_PACKET_CALLBACK(ssh_packet_global_request){ ssh_log(session, SSH_LOG_PROTOCOL, "Received SSH_MSG_GLOBAL_REQUEST %s %d %s:%d", request, want_reply, bind_addr, bind_port); - if(ssh_callbacks_exists(session->callbacks, global_request_function)) { + if(ssh_callbacks_exists(session->common.callbacks, global_request_function)) { ssh_log(session, SSH_LOG_PROTOCOL, "Calling callback for SSH_MSG_GLOBAL_REQUEST %s %d %s:%d", request, want_reply, bind_addr, bind_port); - session->callbacks->global_request_function(session, msg, session->callbacks->userdata); + session->common.callbacks->global_request_function(session, msg, session->common.callbacks->userdata); } else { ssh_message_reply_default(msg); } @@ -967,8 +967,8 @@ SSH_PACKET_CALLBACK(ssh_packet_global_request){ ssh_log(session, SSH_LOG_PROTOCOL, "Received SSH_MSG_GLOBAL_REQUEST %s %d %s:%d", request, want_reply, bind_addr, bind_port); - if(ssh_callbacks_exists(session->callbacks, global_request_function)) { - session->callbacks->global_request_function(session, msg, session->callbacks->userdata); + if(ssh_callbacks_exists(session->common.callbacks, global_request_function)) { + session->common.callbacks->global_request_function(session, msg, session->common.callbacks->userdata); } else { ssh_message_reply_default(msg); } diff --git a/src/options.c b/src/options.c index 5a9c5bf5..2233ac0a 100644 --- a/src/options.c +++ b/src/options.c @@ -139,12 +139,12 @@ int ssh_options_copy(ssh_session src, ssh_session *dest) { } new->fd = src->fd; new->port = src->port; - new->callbacks = src->callbacks; + new->common.callbacks = src->common.callbacks; new->timeout = src->timeout; new->timeout_usec = src->timeout_usec; new->ssh2 = src->ssh2; new->ssh1 = src->ssh1; - new->log_verbosity = src->log_verbosity; + new->common.log_verbosity = src->common.log_verbosity; new->compressionlevel = src->compressionlevel; return 0; @@ -544,12 +544,12 @@ int ssh_options_set(ssh_session session, enum ssh_options_e type, } else { int *x = (int *) value; - session->log_verbosity = *x & 0xffff; + session->common.log_verbosity = *x & 0xffff; } break; case SSH_OPTIONS_LOG_VERBOSITY_STR: if (value == NULL) { - session->log_verbosity = 0 & 0xffff; + session->common.log_verbosity = 0 & 0xffff; } else { q = strdup(value); if (q == NULL) { @@ -562,7 +562,7 @@ int ssh_options_set(ssh_session session, enum ssh_options_e type, } SAFE_FREE(q); - session->log_verbosity = i & 0xffff; + session->common.log_verbosity = i & 0xffff; } break; case SSH_OPTIONS_CIPHERS_C_S: @@ -1106,12 +1106,12 @@ int ssh_bind_options_set(ssh_bind sshbind, enum ssh_bind_options_e type, return -1; } else { int *x = (int *) value; - sshbind->log_verbosity = *x & 0xffff; + sshbind->common.log_verbosity = *x & 0xffff; } break; case SSH_BIND_OPTIONS_LOG_VERBOSITY_STR: if (value == NULL) { - sshbind->log_verbosity = 0; + sshbind->common.log_verbosity = 0; } else { q = strdup(value); if (q == NULL) { @@ -1124,7 +1124,7 @@ int ssh_bind_options_set(ssh_bind sshbind, enum ssh_bind_options_e type, } SAFE_FREE(q); - sshbind->log_verbosity = i & 0xffff; + sshbind->common.log_verbosity = i & 0xffff; } break; case SSH_BIND_OPTIONS_DSAKEY: diff --git a/src/server.c b/src/server.c index aed9e4da..131a2bcd 100644 --- a/src/server.c +++ b/src/server.c @@ -59,8 +59,8 @@ #include "libssh/messages.h" #define set_status(session, status) do {\ - if (session->callbacks && session->callbacks->connect_status_function) \ - session->callbacks->connect_status_function(session->callbacks->userdata, status); \ + if (session->common.callbacks && session->common.callbacks->connect_status_function) \ + session->common.callbacks->connect_status_function(session->common.callbacks->userdata, status); \ } while (0) static int dh_handshake_server(ssh_session session); diff --git a/src/session.c b/src/session.c index 214e17a1..121a6299 100644 --- a/src/session.c +++ b/src/session.c @@ -86,7 +86,7 @@ ssh_session ssh_new(void) { session->alive = 0; session->auth_methods = 0; ssh_set_blocking(session, 1); - session->log_indent = 0; + session->common.log_indent = 0; session->maxchannel = FIRST_CHANNEL; /* options */ |