From 84f5c3b6ff2592993a521a579fbe7efe890c758c Mon Sep 17 00:00:00 2001 From: "Fabio M. Di Nitto" Date: Wed, 1 Apr 2009 13:24:20 +0000 Subject: [PATCH] add fileline/function_name support in corosync git-svn-id: http://svn.fedorahosted.org/svn/corosync/trunk@1987 fd59a12c-fef9-0310-b244-a6a79926bd2f --- exec/mainconfig.c | 143 ++++++++++++++++++++++++++++++++++++-------- man/corosync.conf.5 | 8 ++- 2 files changed, 126 insertions(+), 25 deletions(-) diff --git a/exec/mainconfig.c b/exec/mainconfig.c index 5bf9dc26..2857b57d 100644 --- a/exec/mainconfig.c +++ b/exec/mainconfig.c @@ -105,6 +105,78 @@ static inline void objdb_get_int ( } } + +/** + * insert_into_buffer + * @target_buffer: a buffer where to write results + * @bufferlen: tell us the size of the buffer to avoid overflows + * @entry: entry that needs to be added to the buffer + * @after: can either be NULL or set to a string. + * if NULL, @entry is prependend to logsys_format_get buffer. + * if set, @entry is added immediately after @after. + * + * Since the function is specific to logsys_format_get handling, it is implicit + * that source is logsys_format_get(); + * + * In case of failure, target_buffer could be left dirty. So don't trust + * any data leftover in it. + * + * Searching for "after" assumes that there is only entry of "after" + * in the source. Afterall we control the string here and for logging format + * it makes little to no sense to have duplicate format entries. + * + * Returns: 0 on success, -1 on failure + **/ +static int insert_into_buffer( + char *target_buffer, + size_t bufferlen, + const char *entry, + const char *after) +{ + const char *current_format = NULL; + + current_format = logsys_format_get(); + + /* if the entry is already in the format we don't add it again */ + if (strstr(current_format, entry) != NULL) { + return -1; + } + + /* if there is no "after", simply prepend the requested entry + * otherwise go for beautiful string manipulation.... */ + if (!after) { + if (snprintf(target_buffer, bufferlen - 1, "%s%s", + entry, + current_format) >= bufferlen - 1) { + return -1; + } + } else { + const char *afterpos; + size_t afterlen; + size_t templen; + + /* check if after is contained in the format + * and afterlen has a meaning or return an error */ + afterpos = strstr(current_format, after); + afterlen = strlen(after); + if ((!afterpos) || (!afterlen)) { + return -1; + } + + templen = afterpos - current_format + afterlen; + if (snprintf(target_buffer, templen + 1, "%s", current_format) + >= bufferlen - 1) { + return -1; + } + if (snprintf(target_buffer + templen, bufferlen - ( templen + 1 ), + "%s%s", entry, current_format + templen) + >= bufferlen - ( templen + 1 )) { + return -1; + } + } + return 0; +} + static struct logsys_config_struct { char subsys[6]; unsigned int priority; @@ -122,6 +194,7 @@ int corosync_main_config_read_logging ( const char *error_reason = error_string_response; hdb_handle_t object_find_handle; hdb_handle_t object_find_logsys_handle; + char new_format_buffer[PATH_MAX]; objdb->object_find_create ( OBJECT_PARENT_HANDLE, @@ -158,20 +231,54 @@ int corosync_main_config_read_logging ( main_config->logmode &= ~LOG_MODE_OUTPUT_STDERR; } } - if (!objdb_get_string (objdb,object_service_handle, "timestamp", &value)) { - char new_format_buffer[PATH_MAX]; - - memset(&new_format_buffer, 0, sizeof(new_format_buffer)); - + if (!objdb_get_string (objdb,object_service_handle, "fileline", &value)) { if (strcmp (value, "on") == 0) { - snprintf(new_format_buffer, PATH_MAX-1, "%%t %s", logsys_format_get()); - logsys_format_set(new_format_buffer); - } else - if (strcmp (value, "off") == 0) { - if (!strncmp("%t ", logsys_format_get(), 3)) { - snprintf(new_format_buffer, PATH_MAX-1, "%s", logsys_format_get() + 3); + if (!insert_into_buffer(new_format_buffer, + sizeof(new_format_buffer), + " %f:%l", "s]")) { + logsys_format_set(new_format_buffer); + } else + if (!insert_into_buffer(new_format_buffer, + sizeof(new_format_buffer), + "%f:%l", NULL)) { logsys_format_set(new_format_buffer); } + } else + if (strcmp (value, "off") == 0) { + /* nothing to do here */ + } else { + goto parse_error; + } + } + if (!objdb_get_string (objdb,object_service_handle, "function_name", &value)) { + if (strcmp (value, "on") == 0) { + if (!insert_into_buffer(new_format_buffer, + sizeof(new_format_buffer), + "%n:", "f:")) { + logsys_format_set(new_format_buffer); + } else + if (!insert_into_buffer(new_format_buffer, + sizeof(new_format_buffer), + " %n", "s]")) { + logsys_format_set(new_format_buffer); + } + } else + if (strcmp (value, "off") == 0) { + /* nothing to do here */ + } else { + goto parse_error; + } + } + if (!objdb_get_string (objdb,object_service_handle, "timestamp", &value)) { + if (strcmp (value, "on") == 0) { + if(!insert_into_buffer(new_format_buffer, + sizeof(new_format_buffer), + "%t ", NULL)) { + logsys_format_set(new_format_buffer); + } + } else + if (strcmp (value, "off") == 0) { + /* nothing to do here */ } else { goto parse_error; } @@ -186,19 +293,6 @@ int corosync_main_config_read_logging ( main_config->logfile = strdup (value); } - if (!objdb_get_string (objdb,object_service_handle, "fileline", &value)) { -/* TODO - if (strcmp (value, "on") == 0) { - main_config->logmode |= LOG_MODE_DISPLAY_FILELINE; - } else - if (strcmp (value, "off") == 0) { - main_config->logmode &= ~LOG_MODE_DISPLAY_FILELINE; - } else { - goto parse_error; - } -*/ - } - if (!objdb_get_string (objdb,object_service_handle, "syslog_facility", &value)) { main_config->syslog_facility = logsys_facility_id_get(value); if (main_config->syslog_facility < 0) { @@ -392,6 +486,7 @@ static void main_objdb_reload_notify(objdb_reload_notify_type_t type, int flush, /* * Reload the logsys configuration */ + logsys_format_set(NULL); corosync_main_config_read_logging(global_objdb, &error_string, main_config); diff --git a/man/corosync.conf.5 b/man/corosync.conf.5 index c915b09d..a3b7ce13 100644 --- a/man/corosync.conf.5 +++ b/man/corosync.conf.5 @@ -442,7 +442,13 @@ The default is off. .TP fileline -This specifies that file and line should be printed instead of logger name. +This specifies that file and line should be printed. + +The default is off. + +.TP +function_name +This specifies that the code function name should be printed. The default is off.