summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAris Adamantiadis <aris@0xbadc0de.be>2011-07-19 22:16:28 +0200
committerAndreas Schneider <asn@cryptomilk.org>2011-09-17 22:01:43 +0200
commit0dc57fdcf17fd9e5c000e2a07380ec6878d3afcf (patch)
treef15352f0ddd948e9e9ba1ed1c5103d3333220bef /src
parent3799670d01f4faa68b6ab8055250bc042d707b29 (diff)
downloadlibssh-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.c6
-rw-r--r--src/callbacks.c2
-rw-r--r--src/client.c4
-rw-r--r--src/error.c9
-rw-r--r--src/keyfiles.c14
-rw-r--r--src/log.c64
-rw-r--r--src/messages.c8
-rw-r--r--src/options.c16
-rw-r--r--src/server.c4
-rw-r--r--src/session.c2
10 files changed, 78 insertions, 51 deletions
diff --git a/src/bind.c b/src/bind.c
index 54dbb23d..cc79f8eb 100644
--- a/src/bind.c
+++ b/src/bind.c
@@ -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 */
diff --git a/src/log.c b/src/log.c
index 6ec5a8ea..509b8abc 100644
--- a/src/log.c
+++ b/src/log.c
@@ -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 */