X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Flog.c;h=7a4839bf4434b52b0dbe2087ac2446f761126516;hb=7ef7e96fc2f3eb620fffb6f277339214efe83747;hp=2805c3e4d4b372be34d96eefd8a7193ae5e23431;hpb=dfe721e9b055249518b3d2e97773605e236b617a;p=platform%2Fupstream%2Fconnman.git diff --git a/src/log.c b/src/log.c index 2805c3e..7a4839b 100755 --- a/src/log.c +++ b/src/log.c @@ -23,15 +23,14 @@ #include #endif -#define _GNU_SOURCE #include #include #include #include #include #include -#include #include +#include #include "connman.h" @@ -41,10 +40,15 @@ static const char *program_path; #if defined TIZEN_EXT #include #include +#include +#include + +#undef LOG_TAG +#define LOG_TAG "CONNMAN" #define LOG_FILE_PATH "/opt/usr/data/network/connman.log" #define MAX_LOG_SIZE 1 * 1024 * 1024 -#define MAX_LOG_COUNT 1 +#define MAX_LOG_COUNT 15 #define openlog __connman_log_open #define closelog __connman_log_close @@ -52,7 +56,29 @@ static const char *program_path; #define syslog __connman_log_s static FILE *log_file = NULL; -void __connman_log_s(int log_priority, const char *format, ...); +static bool dlog_logging = true; +static bool file_logging = true; +static bool simple_log = true; + +bool get_simple_log_option(void) +{ + return simple_log; +} + +void set_simple_log_option(bool option) +{ + simple_log = option; +} + +void set_dlog_logging_option(bool option) +{ + dlog_logging = option; +} + +void set_file_logging_option(bool option) +{ + file_logging = option; +} void __connman_log_open(const char *ident, int option, int facility) { @@ -78,7 +104,8 @@ static void __connman_log_update_file_revision(int rev) next_log_file = g_strdup_printf("%s.%d", LOG_FILE_PATH, next_log_rev); if (next_log_rev >= MAX_LOG_COUNT) - remove(next_log_file); + if (remove(next_log_file) != 0) + goto error; if (access(next_log_file, F_OK) == 0) __connman_log_update_file_revision(next_log_rev); @@ -86,14 +113,16 @@ static void __connman_log_update_file_revision(int rev) if (rename(log_file, next_log_file) != 0) remove(log_file); +error: g_free(log_file); g_free(next_log_file); } -static void __connman_log_make_backup(void) +static int __connman_log_make_backup(void) { const int rev = 0; char *backup = NULL; + int ret = 0; backup = g_strdup_printf("%s.%d", LOG_FILE_PATH, rev); @@ -101,9 +130,11 @@ static void __connman_log_make_backup(void) __connman_log_update_file_revision(rev); if (rename(LOG_FILE_PATH, backup) != 0) - remove(LOG_FILE_PATH); + if (remove(LOG_FILE_PATH) != 0) + ret = -1; g_free(backup); + return ret; } static void __connman_log_get_local_time(char *strtime, const int size) @@ -124,7 +155,7 @@ void __connman_log(const int log_priority, const char *format, va_list ap) int log_size = 0; struct stat buf; char str[256]; - char strtime[40]; + char strtime[64]; if (!log_file) log_file = (FILE *)fopen(LOG_FILE_PATH, "a+"); @@ -132,14 +163,20 @@ void __connman_log(const int log_priority, const char *format, va_list ap) if (!log_file) return; - fstat(fileno(log_file), &buf); + if (fstat(fileno(log_file), &buf) < 0) { + fclose(log_file); + log_file = NULL; + return; + } + log_size = buf.st_size; if (log_size >= MAX_LOG_SIZE) { fclose(log_file); log_file = NULL; - __connman_log_make_backup(); + if (__connman_log_make_backup() != 0) + return; log_file = (FILE *)fopen(LOG_FILE_PATH, "a+"); @@ -159,12 +196,19 @@ void __connman_log_s(int log_priority, const char *format, ...) va_start(ap, format); - vsyslog(LOG_DEBUG, format, ap); + if (dlog_logging) + dlog_vprint(DLOG_DEBUG, LOG_TAG, format, ap); + + if (file_logging) + vsyslog(LOG_DEBUG, format, ap); va_end(ap); } #endif +/* This makes sure we always have a __debug section. */ +CONNMAN_DEBUG_DEFINE(dummy); + /** * connman_info: * @format: format string @@ -177,7 +221,12 @@ void connman_info(const char *format, ...) va_list ap; va_start(ap, format); +#if defined TIZEN_EXT + if (dlog_logging) + dlog_vprint(DLOG_INFO, LOG_TAG, format, ap); + if (file_logging) +#endif vsyslog(LOG_INFO, format, ap); va_end(ap); @@ -195,7 +244,12 @@ void connman_warn(const char *format, ...) va_list ap; va_start(ap, format); +#if defined TIZEN_EXT + if (dlog_logging) + dlog_vprint(DLOG_WARN, LOG_TAG, format, ap); + if (file_logging) +#endif vsyslog(LOG_WARNING, format, ap); va_end(ap); @@ -213,7 +267,12 @@ void connman_error(const char *format, ...) va_list ap; va_start(ap, format); +#if defined TIZEN_EXT + if (dlog_logging) + dlog_vprint(DLOG_ERROR, LOG_TAG, format, ap); + if (file_logging) +#endif vsyslog(LOG_ERR, format, ap); va_end(ap); @@ -231,119 +290,22 @@ void connman_debug(const char *format, ...) va_list ap; va_start(ap, format); +#if defined TIZEN_EXT + if (dlog_logging) + dlog_vprint(DLOG_DEBUG, LOG_TAG, format, ap); + if (file_logging) +#endif vsyslog(LOG_DEBUG, format, ap); va_end(ap); } -static void print_backtrace(unsigned int offset) -{ - void *frames[99]; - size_t n_ptrs; - unsigned int i; - int outfd[2], infd[2]; - int pathlen; - pid_t pid; - - if (!program_exec) - return; - - pathlen = strlen(program_path); - - n_ptrs = backtrace(frames, G_N_ELEMENTS(frames)); - if (n_ptrs < offset) - return; - - if (pipe(outfd) < 0) - return; - - if (pipe(infd) < 0) { - close(outfd[0]); - close(outfd[1]); - return; - } - - pid = fork(); - if (pid < 0) { - close(outfd[0]); - close(outfd[1]); - close(infd[0]); - close(infd[1]); - return; - } - - if (pid == 0) { - close(outfd[1]); - close(infd[0]); - - dup2(outfd[0], STDIN_FILENO); - dup2(infd[1], STDOUT_FILENO); - - execlp("addr2line", "-C", "-f", "-e", program_exec, NULL); - - exit(EXIT_FAILURE); - } - - close(outfd[0]); - close(infd[1]); - - connman_error("++++++++ backtrace ++++++++"); - - for (i = offset; i < n_ptrs - 1; i++) { - Dl_info info; - char addr[20], buf[PATH_MAX * 2]; - int len, written; - char *ptr, *pos; - - dladdr(frames[i], &info); - - len = snprintf(addr, sizeof(addr), "%p\n", frames[i]); - if (len < 0) - break; - - written = write(outfd[1], addr, len); - if (written < 0) - break; - - len = read(infd[0], buf, sizeof(buf) - 1); - if (len < 0) - break; - - buf[len] = '\0'; - - pos = strchr(buf, '\n'); - *pos++ = '\0'; - - if (strcmp(buf, "??") == 0) { - connman_error("#%-2u %p in %s", i - offset, - frames[i], info.dli_fname); - continue; - } - - ptr = strchr(pos, '\n'); - *ptr++ = '\0'; - - if (strncmp(pos, program_path, pathlen) == 0) - pos += pathlen + 1; - - connman_error("#%-2u %p in %s() at %s", i - offset, - frames[i], buf, pos); - } - - connman_error("+++++++++++++++++++++++++++"); - - kill(pid, SIGTERM); - - close(outfd[1]); - close(infd[0]); -} - static void signal_handler(int signo) { connman_error("Aborting (signal %d) [%s]", signo, program_exec); - print_backtrace(2); + print_backtrace(program_path, program_exec, 2); exit(EXIT_FAILURE); }