aboutsummaryrefslogtreecommitdiff
path: root/src/log.c
diff options
context:
space:
mode:
authorAndreas Schneider <asn@cryptomilk.org>2013-07-14 12:36:59 +0200
committerAndreas Schneider <asn@cryptomilk.org>2013-07-14 12:36:59 +0200
commit2c91efcc68d9a6aff9163e81df7a5024703084d4 (patch)
treeb9cadb84146bab8e7d2a27c4e153b5caf3f73bde /src/log.c
parent73309f19e582a712e78f54988fc51dbc5ab60bf4 (diff)
downloadlibssh-2c91efcc68d9a6aff9163e81df7a5024703084d4.tar.gz
libssh-2c91efcc68d9a6aff9163e81df7a5024703084d4.tar.xz
libssh-2c91efcc68d9a6aff9163e81df7a5024703084d4.zip
log: Implment new logging functions.
Diffstat (limited to 'src/log.c')
-rw-r--r--src/log.c103
1 files changed, 82 insertions, 21 deletions
diff --git a/src/log.c b/src/log.c
index 687afabc..ae546271 100644
--- a/src/log.c
+++ b/src/log.c
@@ -35,6 +35,10 @@
#include "libssh/misc.h"
#include "libssh/session.h"
+LIBSSH_THREAD int ssh_log_level;
+LIBSSH_THREAD ssh_logging_callback ssh_log_cb;
+LIBSSH_THREAD void *ssh_log_userdata;
+
/**
* @defgroup libssh_log The SSH logging functions.
* @ingroup libssh
@@ -70,46 +74,60 @@ static int current_timestring(int hires, char *buf, size_t len)
return 0;
}
-void ssh_log_function(int verbosity,
- const char *function,
- const char *buffer)
+static void ssh_log_stderr(int verbosity,
+ const char *function,
+ const char *buffer)
{
char date[64] = {0};
int rc;
rc = current_timestring(1, date, sizeof(date));
if (rc == 0) {
- fprintf(stderr, "[%s, %d] %s", date, verbosity, function);
+ fprintf(stderr, "[%s, %d] %s:", date, verbosity, function);
} else {
fprintf(stderr, "[%d] %s", verbosity, function);
}
+
fprintf(stderr, " %s\n", buffer);
}
-/** @internal
- * @brief do the actual work of logging an event
- */
-
-static void do_ssh_log(struct ssh_common_struct *common,
- int verbosity,
- const char *function,
- const char *buffer) {
- if (common->callbacks && common->callbacks->log_function) {
+static void ssh_log_function(int verbosity,
+ const char *function,
+ const char *buffer)
+{
+ ssh_logging_callback log_fn = ssh_get_log_callback();
+ if (log_fn) {
char buf[1024];
snprintf(buf, sizeof(buf), "%s: %s", function, buffer);
- common->callbacks->log_function((ssh_session)common,
- verbosity,
- buf,
- common->callbacks->userdata);
+ log_fn(verbosity,
+ function,
+ buf,
+ ssh_get_log_userdata());
return;
}
- ssh_log_function(verbosity, function, buffer);
+ ssh_log_stderr(verbosity, function, buffer);
}
-/* legacy function */
+void _ssh_log(int verbosity,
+ const char *function,
+ const char *format, ...)
+{
+ char buffer[1024];
+ va_list va;
+
+ if (verbosity <= ssh_get_log_level()) {
+ va_start(va, format);
+ vsnprintf(buffer, sizeof(buffer), format, va);
+ va_end(va);
+ ssh_log_function(verbosity, function, buffer);
+ }
+}
+
+/* LEGACY */
+
void ssh_log(ssh_session session,
int verbosity,
const char *format, ...)
@@ -121,7 +139,7 @@ void ssh_log(ssh_session session,
va_start(va, format);
vsnprintf(buffer, sizeof(buffer), format, va);
va_end(va);
- do_ssh_log(&session->common, verbosity, "", buffer);
+ ssh_log_function(verbosity, "", buffer);
}
}
@@ -143,10 +161,53 @@ void ssh_log_common(struct ssh_common_struct *common,
va_start(va, format);
vsnprintf(buffer, sizeof(buffer), format, va);
va_end(va);
- do_ssh_log(common, verbosity, function, buffer);
+ ssh_log_function(verbosity, function, buffer);
}
}
+
+/* PUBLIC */
+
+int ssh_set_log_level(int level) {
+ if (level < 0) {
+ return -1;
+ }
+
+ ssh_log_level = level;
+
+ return 0;
+}
+
+int ssh_get_log_level(void) {
+ return ssh_log_level;
+}
+
+int ssh_set_log_callback(ssh_logging_callback cb) {
+ if (cb == NULL) {
+ return -1;
+ }
+
+ ssh_log_cb = cb;
+
+ return 0;
+}
+
+ssh_logging_callback ssh_get_log_callback(void) {
+ return ssh_log_cb;
+}
+
+void *ssh_get_log_userdata(void)
+{
+ return ssh_log_userdata;
+}
+
+int ssh_set_log_userdata(void *data)
+{
+ ssh_log_userdata = data;
+
+ return 0;
+}
+
/** @} */
/* vim: set ts=4 sw=4 et cindent: */