diff options
Diffstat (limited to 'common/log.c')
-rw-r--r-- | common/log.c | 931 |
1 files changed, 485 insertions, 446 deletions
diff --git a/common/log.c b/common/log.c index 390b2bff..9b2e9289 100644 --- a/common/log.c +++ b/common/log.c @@ -1,25 +1,20 @@ -/* - Copyright (c) 2005-2012 Jay Sorg - - Permission is hereby granted, free of charge, to any person obtaining a - copy of this software and associated documentation files (the "Software"), - to deal in the Software without restriction, including without limitation - the rights to use, copy, modify, merge, publish, distribute, sublicense, - and/or sell copies of the Software, and to permit persons to whom the - Software is furnished to do so, subject to the following conditions: - - The above copyright notice and this permission notice shall be included - in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS - OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING - FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER - DEALINGS IN THE SOFTWARE. - -*/ +/** + * xrdp: A Remote Desktop Protocol server. + * + * Copyright (C) Jay Sorg 2004-2012 + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ #include <sys/types.h> #include <sys/stat.h> @@ -41,7 +36,7 @@ #include "log.h" /* Here we store the current state and configuration of the log */ -static struct log_config* staticLogConfig = NULL; +static struct log_config *staticLogConfig = NULL; /* This file first start with all private functions. In the end of the file the public functions is defined */ @@ -54,15 +49,17 @@ static struct log_config* staticLogConfig = NULL; * */ int DEFAULT_CC -internal_log_file_open(const char* fname) +internal_log_file_open(const char *fname) { - int ret = -1; - if (fname != NULL) - { - ret = open(fname, O_WRONLY | O_CREAT | O_APPEND | O_SYNC, - S_IRUSR | S_IWUSR); - } - return ret; + int ret = -1; + + if (fname != NULL) + { + ret = open(fname, O_WRONLY | O_CREAT | O_APPEND | O_SYNC, + S_IRUSR | S_IWUSR); + } + + return ret; } /** @@ -75,22 +72,22 @@ internal_log_file_open(const char* fname) int DEFAULT_CC internal_log_xrdp2syslog(const enum logLevels lvl) { - switch (lvl) - { - case LOG_LEVEL_ALWAYS: - return LOG_CRIT; - case LOG_LEVEL_ERROR: - return LOG_ERR; - case LOG_LEVEL_WARNING: - return LOG_WARNING; - case LOG_LEVEL_INFO: - return LOG_INFO; - case LOG_LEVEL_DEBUG: - return LOG_DEBUG; - default: - g_writeln("Undefined log level - programming error"); - return LOG_DEBUG; - } + switch (lvl) + { + case LOG_LEVEL_ALWAYS: + return LOG_CRIT; + case LOG_LEVEL_ERROR: + return LOG_ERR; + case LOG_LEVEL_WARNING: + return LOG_WARNING; + case LOG_LEVEL_INFO: + return LOG_INFO; + case LOG_LEVEL_DEBUG: + return LOG_DEBUG; + default: + g_writeln("Undefined log level - programming error"); + return LOG_DEBUG; + } } /** @@ -101,117 +98,121 @@ internal_log_xrdp2syslog(const enum logLevels lvl) * */ void DEFAULT_CC -internal_log_lvl2str(const enum logLevels lvl, char* str) +internal_log_lvl2str(const enum logLevels lvl, char *str) { - switch (lvl) - { - case LOG_LEVEL_ALWAYS: - snprintf(str, 9, "%s", "[CORE ] "); - break; - case LOG_LEVEL_ERROR: - snprintf(str, 9, "%s", "[ERROR] "); - break; - case LOG_LEVEL_WARNING: - snprintf(str, 9, "%s", "[WARN ] "); - break; - case LOG_LEVEL_INFO: - snprintf(str, 9, "%s", "[INFO ] "); - break; - case LOG_LEVEL_DEBUG: - snprintf(str, 9, "%s", "[DEBUG] "); - break; - default: - snprintf(str, 9, "%s", "PRG ERR!"); - g_writeln("Programming error - undefined log level!!!"); - } + switch (lvl) + { + case LOG_LEVEL_ALWAYS: + snprintf(str, 9, "%s", "[CORE ] "); + break; + case LOG_LEVEL_ERROR: + snprintf(str, 9, "%s", "[ERROR] "); + break; + case LOG_LEVEL_WARNING: + snprintf(str, 9, "%s", "[WARN ] "); + break; + case LOG_LEVEL_INFO: + snprintf(str, 9, "%s", "[INFO ] "); + break; + case LOG_LEVEL_DEBUG: + snprintf(str, 9, "%s", "[DEBUG] "); + break; + default: + snprintf(str, 9, "%s", "PRG ERR!"); + g_writeln("Programming error - undefined log level!!!"); + } } /******************************************************************************/ enum logReturns DEFAULT_CC -internal_log_start(struct log_config* l_cfg) +internal_log_start(struct log_config *l_cfg) { - enum logReturns ret = LOG_GENERAL_ERROR; - if (0 == l_cfg) - { - ret = LOG_ERROR_MALLOC; - return ret; - } + enum logReturns ret = LOG_GENERAL_ERROR; - /* if logfile is NULL, we return error */ - if (0 == l_cfg->log_file) - { - g_writeln("log_file not properly assigned"); - return ret; - } + if (0 == l_cfg) + { + ret = LOG_ERROR_MALLOC; + return ret; + } - /* if progname is NULL, we ureturn error */ - if (0 == l_cfg->program_name) - { - g_writeln("program_name not properly assigned"); - return ret; - } + /* if logfile is NULL, we return error */ + if (0 == l_cfg->log_file) + { + g_writeln("log_file not properly assigned"); + return ret; + } - /* open file */ - l_cfg->fd = internal_log_file_open(l_cfg->log_file); + /* if progname is NULL, we ureturn error */ + if (0 == l_cfg->program_name) + { + g_writeln("program_name not properly assigned"); + return ret; + } - if (-1 == l_cfg->fd) - { - return LOG_ERROR_FILE_OPEN; - } + /* open file */ + l_cfg->fd = internal_log_file_open(l_cfg->log_file); - /* if syslog is enabled, open it */ - if (l_cfg->enable_syslog) - { - openlog(l_cfg->program_name, LOG_CONS | LOG_PID, LOG_DAEMON); - } + if (-1 == l_cfg->fd) + { + return LOG_ERROR_FILE_OPEN; + } + + /* if syslog is enabled, open it */ + if (l_cfg->enable_syslog) + { + openlog(l_cfg->program_name, LOG_CONS | LOG_PID, LOG_DAEMON); + } #ifdef LOG_ENABLE_THREAD - pthread_mutexattr_init(&(l_cfg->log_lock_attr)); - pthread_mutex_init(&(l_cfg->log_lock), &(l_cfg->log_lock_attr)); + pthread_mutexattr_init(&(l_cfg->log_lock_attr)); + pthread_mutex_init(&(l_cfg->log_lock), &(l_cfg->log_lock_attr)); #endif - return LOG_STARTUP_OK; + return LOG_STARTUP_OK; } /******************************************************************************/ enum logReturns DEFAULT_CC -internal_log_end(struct log_config* l_cfg) +internal_log_end(struct log_config *l_cfg) { - enum logReturns ret = LOG_GENERAL_ERROR; - /* if log is closed, quit silently */ - if (0 == l_cfg) - { + enum logReturns ret = LOG_GENERAL_ERROR; + + /* if log is closed, quit silently */ + if (0 == l_cfg) + { + return ret; + } + + /* closing log file */ + log_message(LOG_LEVEL_ALWAYS, "shutting down log subsystem..."); + + if (0 > l_cfg->fd) + { + /* closing logfile... */ + g_file_close(l_cfg->fd); + } + + /* if syslog is enabled, close it */ + if (l_cfg->enable_syslog) + { + closelog(); + } + + /* freeing allocated memory */ + if (0 != l_cfg->log_file) + { + g_free(l_cfg->log_file); + l_cfg->log_file = 0; + } + + if (0 != l_cfg->program_name) + { + g_free(l_cfg->program_name); + l_cfg->program_name = 0; + } + + ret = LOG_STARTUP_OK; return ret; - } - - /* closing log file */ - log_message(LOG_LEVEL_ALWAYS, "shutting down log subsystem..."); - - if (0 > l_cfg->fd) - { - /* closing logfile... */ - g_file_close(l_cfg->fd); - } - - /* if syslog is enabled, close it */ - if (l_cfg->enable_syslog) - { - closelog(); - } - - /* freeing allocated memory */ - if (0 != l_cfg->log_file) - { - g_free(l_cfg->log_file); - l_cfg->log_file = 0; - } - if (0 != l_cfg->program_name) - { - g_free(l_cfg->program_name); - l_cfg->program_name = 0; - } - ret = LOG_STARTUP_OK; - return ret; } /** @@ -220,177 +221,192 @@ internal_log_end(struct log_config* l_cfg) * @return */ enum logLevels DEFAULT_CC -internal_log_text2level(char* buf) +internal_log_text2level(char *buf) { - if (0 == g_strcasecmp(buf, "0") || - 0 == g_strcasecmp(buf, "core")) - { - return LOG_LEVEL_ALWAYS; - } - else if (0 == g_strcasecmp(buf, "1") || - 0 == g_strcasecmp(buf, "error")) - { - return LOG_LEVEL_ERROR; - } - else if (0 == g_strcasecmp(buf, "2") || - 0 == g_strcasecmp(buf, "warn") || - 0 == g_strcasecmp(buf, "warning")) - { - return LOG_LEVEL_WARNING; - } - else if (0 == g_strcasecmp(buf, "3") || - 0 == g_strcasecmp(buf, "info")) - { - return LOG_LEVEL_INFO; - } - else if (0 == g_strcasecmp(buf, "4") || - 0 == g_strcasecmp(buf, "debug")) - { + if (0 == g_strcasecmp(buf, "0") || + 0 == g_strcasecmp(buf, "core")) + { + return LOG_LEVEL_ALWAYS; + } + else if (0 == g_strcasecmp(buf, "1") || + 0 == g_strcasecmp(buf, "error")) + { + return LOG_LEVEL_ERROR; + } + else if (0 == g_strcasecmp(buf, "2") || + 0 == g_strcasecmp(buf, "warn") || + 0 == g_strcasecmp(buf, "warning")) + { + return LOG_LEVEL_WARNING; + } + else if (0 == g_strcasecmp(buf, "3") || + 0 == g_strcasecmp(buf, "info")) + { + return LOG_LEVEL_INFO; + } + else if (0 == g_strcasecmp(buf, "4") || + 0 == g_strcasecmp(buf, "debug")) + { + return LOG_LEVEL_DEBUG; + } + + g_writeln("Your configured log level is corrupt - we use debug log level"); return LOG_LEVEL_DEBUG; - } - g_writeln("Your configured log level is corrupt - we use debug log level"); - return LOG_LEVEL_DEBUG; } enum logReturns DEFAULT_CC -internalReadConfiguration(const char* inFilename, const char* applicationName) +internalReadConfiguration(const char *inFilename, const char *applicationName) { - int fd; - enum logReturns ret = LOG_GENERAL_ERROR; - struct list* sec; - struct list* param_n; - struct list* param_v; - - if (inFilename == NULL) - { - g_writeln("The inifile is null to readConfiguration!"); - return ret; - } - fd = g_file_open(inFilename); - if (-1 == fd) - { - ret = LOG_ERROR_NO_CFG; - g_writeln("We could not open the configuration file to read log parameters"); - return ret; - } - /* we initialize the memory for the configuration and set all content - to zero. */ - ret = internalInitAndAllocStruct(); - if (ret != LOG_STARTUP_OK) - { - return ret; - } - - sec = list_create(); - sec->auto_free = 1; - file_read_sections(fd, sec); - param_n = list_create(); - param_n->auto_free = 1; - param_v = list_create(); - param_v->auto_free = 1; - - /* read logging config */ - ret = internal_config_read_logging(fd, staticLogConfig, param_n, - param_v, applicationName); - if (ret != LOG_STARTUP_OK) - { + int fd; + enum logReturns ret = LOG_GENERAL_ERROR; + struct list *sec; + struct list *param_n; + struct list *param_v; + + if (inFilename == NULL) + { + g_writeln("The inifile is null to readConfiguration!"); + return ret; + } + + fd = g_file_open(inFilename); + + if (-1 == fd) + { + ret = LOG_ERROR_NO_CFG; + g_writeln("We could not open the configuration file to read log parameters"); + return ret; + } + + /* we initialize the memory for the configuration and set all content + to zero. */ + ret = internalInitAndAllocStruct(); + + if (ret != LOG_STARTUP_OK) + { + return ret; + } + + sec = list_create(); + sec->auto_free = 1; + file_read_sections(fd, sec); + param_n = list_create(); + param_n->auto_free = 1; + param_v = list_create(); + param_v->auto_free = 1; + + /* read logging config */ + ret = internal_config_read_logging(fd, staticLogConfig, param_n, + param_v, applicationName); + + if (ret != LOG_STARTUP_OK) + { + return ret; + } + + /* cleanup */ + list_delete(sec); + list_delete(param_v); + list_delete(param_n); + g_file_close(fd); return ret; - } - /* cleanup */ - list_delete(sec); - list_delete(param_v); - list_delete(param_n); - g_file_close(fd); - return ret; } /******************************************************************************/ enum logReturns DEFAULT_CC -internal_config_read_logging(int file, struct log_config* lc, - struct list* param_n, - struct list* param_v, - const char* applicationName) +internal_config_read_logging(int file, struct log_config *lc, + struct list *param_n, + struct list *param_v, + const char *applicationName) { - int i; - char* buf; - char* temp_buf; - - list_clear(param_v); - list_clear(param_n); - - /* setting defaults */ - lc->program_name = g_strdup(applicationName); - lc->log_file = 0; - lc->fd = 0; - lc->log_level = LOG_LEVEL_DEBUG; - lc->enable_syslog = 0; - lc->syslog_level = LOG_LEVEL_DEBUG; - - file_read_section(file, SESMAN_CFG_LOGGING, param_n, param_v); - for (i = 0; i < param_n->count; i++) - { - buf = (char*)list_get_item(param_n, i); - if (0 == g_strcasecmp(buf, SESMAN_CFG_LOG_FILE)) - { - lc->log_file = g_strdup((char*)list_get_item(param_v, i)); - if (lc->log_file != NULL) - { - if (lc->log_file[0] != '/') + int i; + char *buf; + char *temp_buf; + + list_clear(param_v); + list_clear(param_n); + + /* setting defaults */ + lc->program_name = g_strdup(applicationName); + lc->log_file = 0; + lc->fd = 0; + lc->log_level = LOG_LEVEL_DEBUG; + lc->enable_syslog = 0; + lc->syslog_level = LOG_LEVEL_DEBUG; + + file_read_section(file, SESMAN_CFG_LOGGING, param_n, param_v); + + for (i = 0; i < param_n->count; i++) + { + buf = (char *)list_get_item(param_n, i); + + if (0 == g_strcasecmp(buf, SESMAN_CFG_LOG_FILE)) { - temp_buf = (char*)g_malloc(512, 0); - g_snprintf(temp_buf, 511, "%s/%s", XRDP_LOG_PATH, lc->log_file); - g_free(lc->log_file); - lc->log_file = temp_buf; + lc->log_file = g_strdup((char *)list_get_item(param_v, i)); + + if (lc->log_file != NULL) + { + if (lc->log_file[0] != '/') + { + temp_buf = (char *)g_malloc(512, 0); + g_snprintf(temp_buf, 511, "%s/%s", XRDP_LOG_PATH, lc->log_file); + g_free(lc->log_file); + lc->log_file = temp_buf; + } + } + } + + if (0 == g_strcasecmp(buf, SESMAN_CFG_LOG_LEVEL)) + { + lc->log_level = internal_log_text2level((char *)list_get_item(param_v, i)); + } + + if (0 == g_strcasecmp(buf, SESMAN_CFG_LOG_ENABLE_SYSLOG)) + { + lc->enable_syslog = text2bool((char *)list_get_item(param_v, i)); + } + + if (0 == g_strcasecmp(buf, SESMAN_CFG_LOG_SYSLOG_LEVEL)) + { + lc->syslog_level = internal_log_text2level((char *)list_get_item(param_v, i)); } - } - } - if (0 == g_strcasecmp(buf, SESMAN_CFG_LOG_LEVEL)) - { - lc->log_level = internal_log_text2level((char*)list_get_item(param_v, i)); - } - if (0 == g_strcasecmp(buf, SESMAN_CFG_LOG_ENABLE_SYSLOG)) - { - lc->enable_syslog = text2bool((char*)list_get_item(param_v, i)); } - if (0 == g_strcasecmp(buf, SESMAN_CFG_LOG_SYSLOG_LEVEL)) + + if (0 == lc->log_file) { - lc->syslog_level = internal_log_text2level((char*)list_get_item(param_v, i)); + lc->log_file = g_strdup("./sesman.log"); } - } - if (0 == lc->log_file) - { - lc->log_file = g_strdup("./sesman.log"); - } + /* try to create path if not exist */ + g_create_path(lc->log_file); - /* try to create path if not exist */ - g_create_path(lc->log_file); - - g_printf("logging configuration:\r\n"); - g_printf("\tLogFile: %s\r\n", lc->log_file); - g_printf("\tLogLevel: %i\r\n", lc->log_level); - g_printf("\tEnableSyslog: %i\r\n", lc->enable_syslog); - g_printf("\tSyslogLevel: %i\r\n", lc->syslog_level); - return LOG_STARTUP_OK; + g_printf("logging configuration:\r\n"); + g_printf("\tLogFile: %s\r\n", lc->log_file); + g_printf("\tLogLevel: %i\r\n", lc->log_level); + g_printf("\tEnableSyslog: %i\r\n", lc->enable_syslog); + g_printf("\tSyslogLevel: %i\r\n", lc->syslog_level); + return LOG_STARTUP_OK; } enum logReturns DEFAULT_CC internalInitAndAllocStruct(void) { - enum logReturns ret = LOG_GENERAL_ERROR; - staticLogConfig = g_malloc(sizeof(struct log_config), 1); - if (staticLogConfig != NULL) - { - staticLogConfig->fd = -1; - staticLogConfig->enable_syslog = 0; - ret = LOG_STARTUP_OK; - } - else - { - g_writeln("could not allocate memory for log struct"); - ret = LOG_ERROR_MALLOC; - } - return ret; + enum logReturns ret = LOG_GENERAL_ERROR; + staticLogConfig = g_malloc(sizeof(struct log_config), 1); + + if (staticLogConfig != NULL) + { + staticLogConfig->fd = -1; + staticLogConfig->enable_syslog = 0; + ret = LOG_STARTUP_OK; + } + else + { + g_writeln("could not allocate memory for log struct"); + ret = LOG_ERROR_MALLOC; + } + + return ret; } /* @@ -406,60 +422,68 @@ internalInitAndAllocStruct(void) * */ int APP_CC -text2bool(char* s) +text2bool(char *s) { - if (0 == g_strcasecmp(s, "1") || - 0 == g_strcasecmp(s, "true") || - 0 == g_strcasecmp(s, "yes")) - { - return 1; - } - return 0; + if (0 == g_strcasecmp(s, "1") || + 0 == g_strcasecmp(s, "true") || + 0 == g_strcasecmp(s, "yes")) + { + return 1; + } + + return 0; } enum logReturns DEFAULT_CC -log_start_from_param(const struct log_config* iniParams) +log_start_from_param(const struct log_config *iniParams) { - enum logReturns ret = LOG_GENERAL_ERROR; - if (staticLogConfig != NULL) - { - log_message(LOG_LEVEL_ALWAYS, "Log already initialized"); - return ret; - } - if (iniParams == NULL) - { - g_writeln("inparam to log_start_from_param is NULL"); - return ret; - } - else - { - /*Copy the struct information*/ - ret = internalInitAndAllocStruct(); - if (ret != LOG_STARTUP_OK) + enum logReturns ret = LOG_GENERAL_ERROR; + + if (staticLogConfig != NULL) { - g_writeln("internalInitAndAllocStruct failed"); - return ret; - } - staticLogConfig->enable_syslog = iniParams->enable_syslog; - staticLogConfig->fd = iniParams->fd; - staticLogConfig->log_file = g_strdup(iniParams->log_file); - staticLogConfig->log_level = iniParams->log_level; - staticLogConfig->log_lock = iniParams->log_lock; - staticLogConfig->log_lock_attr = iniParams->log_lock_attr; - staticLogConfig->program_name = g_strdup(iniParams->program_name); - staticLogConfig->syslog_level = iniParams->syslog_level; - ret = internal_log_start(staticLogConfig); - if (ret != LOG_STARTUP_OK) + log_message(LOG_LEVEL_ALWAYS, "Log already initialized"); + return ret; + } + + if (iniParams == NULL) { - g_writeln("Could not start log"); - if (staticLogConfig != NULL) - { - g_free(staticLogConfig); - staticLogConfig = NULL; - } + g_writeln("inparam to log_start_from_param is NULL"); + return ret; + } + else + { + /*Copy the struct information*/ + ret = internalInitAndAllocStruct(); + + if (ret != LOG_STARTUP_OK) + { + g_writeln("internalInitAndAllocStruct failed"); + return ret; + } + + staticLogConfig->enable_syslog = iniParams->enable_syslog; + staticLogConfig->fd = iniParams->fd; + staticLogConfig->log_file = g_strdup(iniParams->log_file); + staticLogConfig->log_level = iniParams->log_level; + staticLogConfig->log_lock = iniParams->log_lock; + staticLogConfig->log_lock_attr = iniParams->log_lock_attr; + staticLogConfig->program_name = g_strdup(iniParams->program_name); + staticLogConfig->syslog_level = iniParams->syslog_level; + ret = internal_log_start(staticLogConfig); + + if (ret != LOG_STARTUP_OK) + { + g_writeln("Could not start log"); + + if (staticLogConfig != NULL) + { + g_free(staticLogConfig); + staticLogConfig = NULL; + } + } } - } - return ret; + + return ret; } /** @@ -470,34 +494,40 @@ log_start_from_param(const struct log_config* iniParams) * @return 0 on success */ enum logReturns DEFAULT_CC -log_start(const char* iniFile, const char* applicationName) +log_start(const char *iniFile, const char *applicationName) { - enum logReturns ret = LOG_GENERAL_ERROR; - if (applicationName == NULL) - { - g_writeln("Programming error your application name cannot be null"); - return ret; - } - ret = internalReadConfiguration(iniFile, applicationName); - if (ret == LOG_STARTUP_OK) - { - ret = internal_log_start(staticLogConfig); - if (ret != LOG_STARTUP_OK) + enum logReturns ret = LOG_GENERAL_ERROR; + + if (applicationName == NULL) { - g_writeln("Could not start log"); - if (staticLogConfig != NULL) - { - g_free(staticLogConfig); - staticLogConfig = NULL; - } - } - } - else - { - g_writeln("Error reading configuration for log based on config: %s", - iniFile); - } - return ret; + g_writeln("Programming error your application name cannot be null"); + return ret; + } + + ret = internalReadConfiguration(iniFile, applicationName); + + if (ret == LOG_STARTUP_OK) + { + ret = internal_log_start(staticLogConfig); + + if (ret != LOG_STARTUP_OK) + { + g_writeln("Could not start log"); + + if (staticLogConfig != NULL) + { + g_free(staticLogConfig); + staticLogConfig = NULL; + } + } + } + else + { + g_writeln("Error reading configuration for log based on config: %s", + iniFile); + } + + return ret; } /** @@ -507,123 +537,132 @@ log_start(const char* iniFile, const char* applicationName) enum logReturns DEFAULT_CC log_end(void) { - enum logReturns ret = LOG_GENERAL_ERROR; - ret = internal_log_end(staticLogConfig); - if (staticLogConfig != NULL) - { - g_free(staticLogConfig); - staticLogConfig = NULL; - } - return ret; + enum logReturns ret = LOG_GENERAL_ERROR; + ret = internal_log_end(staticLogConfig); + + if (staticLogConfig != NULL) + { + g_free(staticLogConfig); + staticLogConfig = NULL; + } + + return ret; } enum logReturns DEFAULT_CC -log_message(const enum logLevels lvl, const char* msg, ...) +log_message(const enum logLevels lvl, const char *msg, ...) { - char buff[LOG_BUFFER_SIZE + 31]; /* 19 (datetime) 4 (space+cr+lf+\0) */ - va_list ap; - int len = 0; - enum logReturns rv = LOG_STARTUP_OK; - int writereply = 0; - time_t now_t; - struct tm* now; - if (staticLogConfig == NULL) - { - g_writeln("The log reference is NULL - log not initialized properly"); - return LOG_ERROR_NO_CFG; - } - if (0 > staticLogConfig->fd && staticLogConfig->enable_syslog == 0) - { - return LOG_ERROR_FILE_NOT_OPEN; - } - - now_t = time(&now_t); - now = localtime(&now_t); - - snprintf(buff, 21, "[%.4d%.2d%.2d-%.2d:%.2d:%.2d] ", now->tm_year + 1900, - now->tm_mon + 1, now->tm_mday, now->tm_hour, now->tm_min, - now->tm_sec); - - internal_log_lvl2str(lvl, buff + 20); - - va_start(ap, msg); - len = vsnprintf(buff + 28, LOG_BUFFER_SIZE, msg, ap); - va_end(ap); - - /* checking for truncated messages */ - if (len > LOG_BUFFER_SIZE) - { - log_message(LOG_LEVEL_WARNING, "next message will be truncated"); - } - - /* forcing the end of message string */ + char buff[LOG_BUFFER_SIZE + 31]; /* 19 (datetime) 4 (space+cr+lf+\0) */ + va_list ap; + int len = 0; + enum logReturns rv = LOG_STARTUP_OK; + int writereply = 0; + time_t now_t; + struct tm *now; + + if (staticLogConfig == NULL) + { + g_writeln("The log reference is NULL - log not initialized properly"); + return LOG_ERROR_NO_CFG; + } + + if (0 > staticLogConfig->fd && staticLogConfig->enable_syslog == 0) + { + return LOG_ERROR_FILE_NOT_OPEN; + } + + now_t = time(&now_t); + now = localtime(&now_t); + + snprintf(buff, 21, "[%.4d%.2d%.2d-%.2d:%.2d:%.2d] ", now->tm_year + 1900, + now->tm_mon + 1, now->tm_mday, now->tm_hour, now->tm_min, + now->tm_sec); + + internal_log_lvl2str(lvl, buff + 20); + + va_start(ap, msg); + len = vsnprintf(buff + 28, LOG_BUFFER_SIZE, msg, ap); + va_end(ap); + + /* checking for truncated messages */ + if (len > LOG_BUFFER_SIZE) + { + log_message(LOG_LEVEL_WARNING, "next message will be truncated"); + } + + /* forcing the end of message string */ #ifdef _WIN32 - buff[len + 28] = '\r'; - buff[len + 29] = '\n'; - buff[len + 30] = '\0'; + buff[len + 28] = '\r'; + buff[len + 29] = '\n'; + buff[len + 30] = '\0'; #else #ifdef _MACOS - buff[len + 28] = '\r'; - buff[len + 29] = '\0'; + buff[len + 28] = '\r'; + buff[len + 29] = '\0'; #else - buff[len + 28] = '\n'; - buff[len + 29] = '\0'; + buff[len + 28] = '\n'; + buff[len + 29] = '\0'; #endif #endif - if (staticLogConfig->enable_syslog && (lvl <= staticLogConfig->syslog_level)) - { - /* log to syslog*/ - /* %s fix compiler warning 'not a string literal' */ - syslog(internal_log_xrdp2syslog(lvl), "(%d)(%ld)%s", g_getpid(), - tc_get_threadid(), buff + 20); - } + if (staticLogConfig->enable_syslog && (lvl <= staticLogConfig->syslog_level)) + { + /* log to syslog*/ + /* %s fix compiler warning 'not a string literal' */ + syslog(internal_log_xrdp2syslog(lvl), "(%d)(%ld)%s", g_getpid(), + tc_get_threadid(), buff + 20); + } - if (lvl <= staticLogConfig->log_level) - { - /* log to console */ - g_printf(buff); + if (lvl <= staticLogConfig->log_level) + { + /* log to console */ + g_printf(buff); - /* log to application logfile */ + /* log to application logfile */ #ifdef LOG_ENABLE_THREAD - pthread_mutex_lock(&(staticLogConfig->log_lock)); + pthread_mutex_lock(&(staticLogConfig->log_lock)); #endif - if (staticLogConfig->fd > 0) - { - writereply = g_file_write(staticLogConfig->fd, buff, g_strlen(buff)); - if (writereply <= 0) - { - rv = LOG_ERROR_NULL_FILE; - } - } + + if (staticLogConfig->fd > 0) + { + writereply = g_file_write(staticLogConfig->fd, buff, g_strlen(buff)); + + if (writereply <= 0) + { + rv = LOG_ERROR_NULL_FILE; + } + } + #ifdef LOG_ENABLE_THREAD - pthread_mutex_unlock(&(staticLogConfig->log_lock)); + pthread_mutex_unlock(&(staticLogConfig->log_lock)); #endif - } - return rv; + } + + return rv; } /** * Return the configured log file name * @return */ -char* DEFAULT_CC -getLogFile(char* replybuf, int bufsize) +char *DEFAULT_CC +getLogFile(char *replybuf, int bufsize) { - if (staticLogConfig) - { - if (staticLogConfig->log_file) + if (staticLogConfig) { - g_strncpy(replybuf, staticLogConfig->log_file, bufsize); + if (staticLogConfig->log_file) + { + g_strncpy(replybuf, staticLogConfig->log_file, bufsize); + } + else + { + g_sprintf(replybuf, "The log_file name is NULL"); + } } else { - g_sprintf(replybuf, "The log_file name is NULL"); + g_snprintf(replybuf, bufsize, "The log is not properly started"); } - } - else - { - g_snprintf(replybuf, bufsize, "The log is not properly started"); - } - return replybuf; + + return replybuf; } |