1
1

Fixes the ssh_log issue on ssh_bind handles.

Этот коммит содержится в:
Aris Adamantiadis 2011-07-19 22:16:28 +02:00
родитель dc9ac022f5
Коммит da954c2c5e
13 изменённых файлов: 97 добавлений и 64 удалений

Просмотреть файл

@ -23,11 +23,10 @@
#define BIND_H_ #define BIND_H_
#include "libssh/priv.h" #include "libssh/priv.h"
#include "libssh/session.h"
struct ssh_bind_struct { struct ssh_bind_struct {
struct error_struct error; struct ssh_common_struct common; /* stuff common to ssh_bind and ssh_session */
ssh_callbacks callbacks; /* Callbacks to user functions */
struct ssh_bind_callbacks_struct *bind_callbacks; struct ssh_bind_callbacks_struct *bind_callbacks;
void *bind_callbacks_userdata; void *bind_callbacks_userdata;
@ -40,8 +39,6 @@ struct ssh_bind_struct {
char *bindaddr; char *bindaddr;
socket_t bindfd; socket_t bindfd;
unsigned int bindport; unsigned int bindport;
unsigned int log_verbosity;
int blocking; int blocking;
int toaccept; int toaccept;
}; };

Просмотреть файл

@ -141,6 +141,7 @@ struct ssh_keys_struct {
}; };
struct ssh_message_struct; struct ssh_message_struct;
struct ssh_common_struct;
/* server data */ /* server data */
@ -216,6 +217,9 @@ int match_hostname(const char *host, const char *pattern, unsigned int len);
int message_handle(ssh_session session, void *user, uint8_t type, ssh_buffer packet); int message_handle(ssh_session session, void *user, uint8_t type, ssh_buffer packet);
/* log.c */ /* log.c */
void ssh_log_common(struct ssh_common_struct *common, int verbosity,
const char *format, ...) PRINTF_ATTRIBUTE(3, 4);
/* misc.c */ /* misc.c */
#ifdef _WIN32 #ifdef _WIN32
int gettimeofday(struct timeval *__p, void *__t); int gettimeofday(struct timeval *__p, void *__t);
@ -229,16 +233,16 @@ int gettimeofday(struct timeval *__p, void *__t);
#define _enter_function(sess) \ #define _enter_function(sess) \
do {\ do {\
if((sess)->log_verbosity >= SSH_LOG_FUNCTIONS){ \ if((sess)->common.log_verbosity >= SSH_LOG_FUNCTIONS){ \
ssh_log((sess),SSH_LOG_FUNCTIONS,"entering function %s line %d in " __FILE__ , __FUNCTION__,__LINE__);\ ssh_log((sess),SSH_LOG_FUNCTIONS,"entering function %s line %d in " __FILE__ , __FUNCTION__,__LINE__);\
(sess)->log_indent++; \ (sess)->common.log_indent++; \
} \ } \
} while(0) } while(0)
#define _leave_function(sess) \ #define _leave_function(sess) \
do { \ do { \
if((sess)->log_verbosity >= SSH_LOG_FUNCTIONS){ \ if((sess)->common.log_verbosity >= SSH_LOG_FUNCTIONS){ \
(sess)->log_indent--; \ (sess)->common.log_indent--; \
ssh_log((sess),SSH_LOG_FUNCTIONS,"leaving function %s line %d in " __FILE__ , __FUNCTION__,__LINE__);\ ssh_log((sess),SSH_LOG_FUNCTIONS,"leaving function %s line %d in " __FILE__ , __FUNCTION__,__LINE__);\
}\ }\
} while(0) } while(0)

Просмотреть файл

@ -62,8 +62,16 @@ enum ssh_pending_call_e {
/* libssh calls may block an undefined amount of time */ /* libssh calls may block an undefined amount of time */
#define SSH_SESSION_FLAG_BLOCKING 1 #define SSH_SESSION_FLAG_BLOCKING 1
struct ssh_session_struct { /* members that are common to ssh_session and ssh_bind */
struct ssh_common_struct {
struct error_struct error; struct error_struct error;
ssh_callbacks callbacks; /* Callbacks to user functions */
int log_verbosity; /* verbosity of the log functions */
int log_indent; /* indentation level in enter_function logs */
};
struct ssh_session_struct {
struct ssh_common_struct common;
struct ssh_socket_struct *socket; struct ssh_socket_struct *socket;
char *serverbanner; char *serverbanner;
char *clientbanner; char *clientbanner;
@ -129,11 +137,8 @@ struct ssh_session_struct {
struct ssh_list *ssh_message_list; /* list of delayed SSH messages */ struct ssh_list *ssh_message_list; /* list of delayed SSH messages */
int (*ssh_message_callback)( struct ssh_session_struct *session, ssh_message msg, void *userdata); int (*ssh_message_callback)( struct ssh_session_struct *session, ssh_message msg, void *userdata);
void *ssh_message_callback_data; void *ssh_message_callback_data;
int log_verbosity; /*cached copy of the option structure */
int log_indent; /* indentation level in enter_function logs */
void (*ssh_connection_callback)( struct ssh_session_struct *session); void (*ssh_connection_callback)( struct ssh_session_struct *session);
ssh_callbacks callbacks; /* Callbacks to user functions */
struct ssh_packet_callbacks_struct default_packet_callbacks; struct ssh_packet_callbacks_struct default_packet_callbacks;
struct ssh_list *packet_callbacks; struct ssh_list *packet_callbacks;
struct ssh_socket_callbacks_struct socket_callbacks; struct ssh_socket_callbacks_struct socket_callbacks;

Просмотреть файл

@ -150,7 +150,7 @@ ssh_bind ssh_bind_new(void) {
ZERO_STRUCTP(ptr); ZERO_STRUCTP(ptr);
ptr->bindfd = SSH_INVALID_SOCKET; ptr->bindfd = SSH_INVALID_SOCKET;
ptr->bindport= 22; ptr->bindport= 22;
ptr->log_verbosity = 0; ptr->common.log_verbosity = 0;
return ptr; 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); ssh_socket_free(session->socket);
session->socket = ssh_socket_new(session); session->socket = ssh_socket_new(session);

Просмотреть файл

@ -37,7 +37,7 @@ int ssh_set_callbacks(ssh_session session, ssh_callbacks cb) {
leave_function(); leave_function();
return SSH_ERROR; return SSH_ERROR;
} }
session->callbacks = cb; session->common.callbacks = cb;
leave_function(); leave_function();
return 0; return 0;
} }

Просмотреть файл

@ -41,8 +41,8 @@
#include "libssh/misc.h" #include "libssh/misc.h"
#define set_status(session, status) do {\ #define set_status(session, status) do {\
if (session->callbacks && session->callbacks->connect_status_function) \ if (session->common.callbacks && session->common.callbacks->connect_status_function) \
session->callbacks->connect_status_function(session->callbacks->userdata, status); \ session->common.callbacks->connect_status_function(session->common.callbacks->userdata, status); \
} while (0) } while (0)
/** /**

Просмотреть файл

@ -24,6 +24,7 @@
#include <stdio.h> #include <stdio.h>
#include <stdarg.h> #include <stdarg.h>
#include "libssh/priv.h" #include "libssh/priv.h"
#include "libssh/session.h"
/** /**
* @defgroup libssh_error The SSH error functions. * @defgroup libssh_error The SSH error functions.
@ -48,13 +49,13 @@
* @param ... The arguments for the format string. * @param ... The arguments for the format string.
*/ */
void ssh_set_error(void *error, int code, const char *descr, ...) { 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_list va;
va_start(va, descr); va_start(va, descr);
vsnprintf(err->error_buffer, ERROR_BUFFERLEN, descr, va); vsnprintf(err->error.error_buffer, ERROR_BUFFERLEN, descr, va);
va_end(va); va_end(va);
err->error_code = code; err->error.error_code = code;
ssh_log(error,SSH_LOG_RARE,"Error : %s",err->error_buffer); ssh_log_common(err,SSH_LOG_RARE,"Error : %s",err->error.error_buffer);
} }
/** /**

Просмотреть файл

@ -995,7 +995,7 @@ ssh_private_key privatekey_from_base64(ssh_session session, const char *b64_pkey
ssh_log(session, SSH_LOG_RARE, "Trying to read privkey type=%s, passphase=%s, authcb=%s", ssh_log(session, SSH_LOG_RARE, "Trying to read privkey type=%s, passphase=%s, authcb=%s",
type ? type == SSH_KEYTYPE_DSS ? "ssh-dss" : "ssh-rsa": "unknown", type ? type == SSH_KEYTYPE_DSS ? "ssh-dss" : "ssh-rsa": "unknown",
passphrase ? "true" : "false", passphrase ? "true" : "false",
session->callbacks && session->callbacks->auth_function ? "true" : "false"); session->common.callbacks && session->common.callbacks->auth_function ? "true" : "false");
if (type == 0) { if (type == 0) {
type = privatekey_type_from_string(b64_pkey); type = privatekey_type_from_string(b64_pkey);
@ -1008,9 +1008,9 @@ ssh_private_key privatekey_from_base64(ssh_session session, const char *b64_pkey
case SSH_KEYTYPE_DSS: case SSH_KEYTYPE_DSS:
#ifdef HAVE_LIBGCRYPT #ifdef HAVE_LIBGCRYPT
if (passphrase == NULL) { if (passphrase == NULL) {
if (session->callbacks && session->callbacks->auth_function) { if (session->common.callbacks && session->common.callbacks->auth_function) {
auth_cb = session->callbacks->auth_function; auth_cb = session->common.callbacks->auth_function;
auth_ud = session->callbacks->userdata; auth_ud = session->common.callbacks->userdata;
valid = b64decode_dsa_privatekey(b64_pkey, &dsa, auth_cb, auth_ud, valid = b64decode_dsa_privatekey(b64_pkey, &dsa, auth_cb, auth_ud,
"Passphrase for private key:"); "Passphrase for private key:");
@ -1052,9 +1052,9 @@ ssh_private_key privatekey_from_base64(ssh_session session, const char *b64_pkey
case SSH_KEYTYPE_RSA: case SSH_KEYTYPE_RSA:
#ifdef HAVE_LIBGCRYPT #ifdef HAVE_LIBGCRYPT
if (passphrase == NULL) { if (passphrase == NULL) {
if (session->callbacks && session->callbacks->auth_function) { if (session->common.callbacks && session->common.callbacks->auth_function) {
auth_cb = session->callbacks->auth_function; auth_cb = session->common.callbacks->auth_function;
auth_ud = session->callbacks->userdata; auth_ud = session->common.callbacks->userdata;
valid = b64decode_rsa_privatekey(b64_pkey, &rsa, auth_cb, auth_ud, valid = b64decode_rsa_privatekey(b64_pkey, &rsa, auth_cb, auth_ud,
"Passphrase for private key:"); "Passphrase for private key:");
} else { /* authcb */ } 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. * @brief Log a SSH event.
* *
@ -48,32 +75,31 @@
*/ */
void ssh_log(ssh_session session, int verbosity, const char *format, ...) { void ssh_log(ssh_session session, int verbosity, const char *format, ...) {
char buffer[1024]; char buffer[1024];
char indent[256];
int min;
va_list va; va_list va;
if (verbosity <= session->log_verbosity) { if (verbosity <= session->common.log_verbosity) {
va_start(va, format); va_start(va, format);
vsnprintf(buffer, sizeof(buffer), format, va); vsnprintf(buffer, sizeof(buffer), format, va);
va_end(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); /** @internal
indent[min] = '\0'; * @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); if (verbosity <= common->log_verbosity) {
} else { va_start(va, format);
fprintf(stderr, "[%d] %s\n", verbosity, buffer); vsnprintf(buffer, sizeof(buffer), format, va);
} va_end(va);
do_ssh_log(common, verbosity, buffer);
} }
} }

Просмотреть файл

@ -1156,9 +1156,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); 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); 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 { } else {
ssh_message_reply_default(msg); ssh_message_reply_default(msg);
} }
@ -1178,8 +1178,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); 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)) {
session->callbacks->global_request_function(session, msg, session->callbacks->userdata); session->common.callbacks->global_request_function(session, msg, session->common.callbacks->userdata);
} else { } else {
ssh_message_reply_default(msg); ssh_message_reply_default(msg);
} }

Просмотреть файл

@ -139,12 +139,12 @@ int ssh_options_copy(ssh_session src, ssh_session *dest) {
} }
new->fd = src->fd; new->fd = src->fd;
new->port = src->port; new->port = src->port;
new->callbacks = src->callbacks; new->common.callbacks = src->common.callbacks;
new->timeout = src->timeout; new->timeout = src->timeout;
new->timeout_usec = src->timeout_usec; new->timeout_usec = src->timeout_usec;
new->ssh2 = src->ssh2; new->ssh2 = src->ssh2;
new->ssh1 = src->ssh1; new->ssh1 = src->ssh1;
new->log_verbosity = src->log_verbosity; new->common.log_verbosity = src->common.log_verbosity;
new->compressionlevel = src->compressionlevel; new->compressionlevel = src->compressionlevel;
return 0; return 0;
@ -549,12 +549,12 @@ int ssh_options_set(ssh_session session, enum ssh_options_e type,
} else { } else {
int *x = (int *) value; int *x = (int *) value;
session->log_verbosity = *x & 0xffff; session->common.log_verbosity = *x & 0xffff;
} }
break; break;
case SSH_OPTIONS_LOG_VERBOSITY_STR: case SSH_OPTIONS_LOG_VERBOSITY_STR:
if (value == NULL) { if (value == NULL) {
session->log_verbosity = 0 & 0xffff; session->common.log_verbosity = 0 & 0xffff;
} else { } else {
q = strdup(value); q = strdup(value);
if (q == NULL) { if (q == NULL) {
@ -567,7 +567,7 @@ int ssh_options_set(ssh_session session, enum ssh_options_e type,
} }
SAFE_FREE(q); SAFE_FREE(q);
session->log_verbosity = i & 0xffff; session->common.log_verbosity = i & 0xffff;
} }
break; break;
case SSH_OPTIONS_CIPHERS_C_S: case SSH_OPTIONS_CIPHERS_C_S:
@ -1120,12 +1120,12 @@ int ssh_bind_options_set(ssh_bind sshbind, enum ssh_bind_options_e type,
return -1; return -1;
} else { } else {
int *x = (int *) value; int *x = (int *) value;
sshbind->log_verbosity = *x & 0xffff; sshbind->common.log_verbosity = *x & 0xffff;
} }
break; break;
case SSH_BIND_OPTIONS_LOG_VERBOSITY_STR: case SSH_BIND_OPTIONS_LOG_VERBOSITY_STR:
if (value == NULL) { if (value == NULL) {
sshbind->log_verbosity = 0; sshbind->common.log_verbosity = 0;
} else { } else {
q = strdup(value); q = strdup(value);
if (q == NULL) { if (q == NULL) {
@ -1138,7 +1138,7 @@ int ssh_bind_options_set(ssh_bind sshbind, enum ssh_bind_options_e type,
} }
SAFE_FREE(q); SAFE_FREE(q);
sshbind->log_verbosity = i & 0xffff; sshbind->common.log_verbosity = i & 0xffff;
} }
break; break;
case SSH_BIND_OPTIONS_DSAKEY: case SSH_BIND_OPTIONS_DSAKEY:

Просмотреть файл

@ -59,8 +59,8 @@
#include "libssh/messages.h" #include "libssh/messages.h"
#define set_status(session, status) do {\ #define set_status(session, status) do {\
if (session->callbacks && session->callbacks->connect_status_function) \ if (session->common.callbacks && session->common.callbacks->connect_status_function) \
session->callbacks->connect_status_function(session->callbacks->userdata, status); \ session->common.callbacks->connect_status_function(session->common.callbacks->userdata, status); \
} while (0) } while (0)
static int dh_handshake_server(ssh_session session); static int dh_handshake_server(ssh_session session);

Просмотреть файл

@ -86,7 +86,7 @@ ssh_session ssh_new(void) {
session->alive = 0; session->alive = 0;
session->auth_methods = 0; session->auth_methods = 0;
ssh_set_blocking(session, 1); ssh_set_blocking(session, 1);
session->log_indent = 0; session->common.log_indent = 0;
session->maxchannel = FIRST_CHANNEL; session->maxchannel = FIRST_CHANNEL;
/* options */ /* options */