Hi guys,
changes compared to take2:
- move SUBSYS_MAX and SUBSYS_MAXLEN in logsys.h. The former is required
to assert within DECLARE_* and the latter is good to have visibile as
it's part of the public API limit for subsystem name.
- make DECLARE_* macros assert on error.
- fix error handling in _logsys_rec_init by returning instead of
asserting and remove duplicated assertion (there are a few more of
those, but as noted in take2, now we can handle everything internally).
- fix LOG_MODE_THREADED to not fire wthread when working in non-threaded
mode.
This version has been tested with a full corosync run and it seems to
handle properly.
As soon as this one is ACK, I'll post the rest of corosync port to the
new API.
Fabio
--- include/corosync/engine/logsys.h (revision 2058)
+++ include/corosync/engine/logsys.h (working copy)
@@ -46,9 +46,9 @@
#define LOG_MODE_OUTPUT_FILE (1<<0)
#define LOG_MODE_OUTPUT_STDERR (1<<1)
#define LOG_MODE_OUTPUT_SYSLOG (1<<3)
-#define LOG_MODE_NOSUBSYS (1<<4)
-#define LOG_MODE_FORK (1<<5)
-#define LOG_MODE_THREADED (1<<6)
+/* FORK and THREADED are ignored for SUBSYSTEMS */
+#define LOG_MODE_FORK (1<<4)
+#define LOG_MODE_THREADED (1<<5)
/*
* Log priorities, compliant with syslog and SA Forum Log spec.
@@ -65,7 +65,10 @@
/*
* The tag masks are all mutually exclusive
- */
+ *
+ * LOG is mandatory, but enforced, for subsystems.
+ * Be careful if/when changing tags at runtime.
+ */
#define LOGSYS_TAG_LOG (0xff<<28)
#define LOGSYS_TAG_ENTER (1<<27)
#define LOGSYS_TAG_LEAVE (1<<26)
@@ -79,36 +82,141 @@
#define LOGSYS_TAG_TRACE8 (1<<18)
/*
- * External API
+ * Internal APIs that must be globally exported
+ * (External API below)
*/
-extern void logsys_config_mode_set (
- unsigned int mode);
-extern unsigned int logsys_config_mode_get (void);
+/* logsys_logger bits */
+#define SUBSYS_MAX 63 /* maximum number of subsystems */
+#define SUBSYS_MAXLEN 64 /* max len of a subsystem name */
-extern int logsys_config_file_set (
- const char **error_string,
- const char *file);
+extern int _logsys_system_setup(
+ const char *system,
+ unsigned int mode,
+ unsigned int debug,
+ const char *logfile,
+ int logfile_priority,
+ int syslog_facility,
+ int syslog_priority,
+ unsigned int tags);
-extern void logsys_config_facility_set (
- const char *name,
- unsigned int facility);
+extern int _logsys_config_subsys_get (
+ const char *subsys);
+extern unsigned int _logsys_subsys_create (const char *subsys);
+
+extern int _logsys_rec_init (unsigned int size);
+
+extern void _logsys_log_printf (
+ int subsysid,
+ const char *function_name,
+ const char *file_name,
+ int file_line,
+ unsigned int level,
+ const char *format,
+ ...) __attribute__((format(printf, 6, 7)));
+
+extern void _logsys_log_rec (
+ int subsysid,
+ const char *function_name,
+ const char *file_name,
+ int file_line,
+ unsigned int rec_ident,
+ ...);
+
+extern int _logsys_wthread_create (void);
+
+static unsigned int logsys_subsys_id __attribute__((unused)) = -1;
+
+/*
+ * External API - init
+ * See below:
+ *
+ * LOGSYS_DECLARE_SYSTEM
+ * LOGSYS_DECLARE_SUBSYS
+ *
+ */
+extern void logsys_fork_completed (void);
+
+extern void logsys_atexit (void);
+
+/*
+ * External API - misc
+ */
+extern int logsys_log_rec_store (const char *filename);
+
+/*
+ * External API - configuration
+ */
+
+/*
+ * configuration bits that can only be done for the whole system
+ */
extern int logsys_format_set (
const char *format);
extern char *logsys_format_get (void);
-extern unsigned int logsys_config_subsys_set (
+/*
+ * per system/subsystem settings.
+ *
+ * NOTE: once a subsystem is created and configured, changing
+ * the default does NOT affect the subsystems.
+ *
+ * Pass a NULL subsystem to change the defaults (or what was initialized
+ * via DECLARE_SYSTEM or equivalent).
+ */
+extern unsigned int logsys_config_syslog_facility_set (
const char *subsys,
- unsigned int tags,
+ unsigned int facility);
+
+extern unsigned int logsys_config_syslog_priority_set (
+ const char *subsys,
unsigned int priority);
-extern int logsys_config_subsys_get (
+extern unsigned int logsys_config_mode_set (
const char *subsys,
- unsigned int *tags,
- unsigned int *priority);
+ unsigned int mode);
+extern unsigned int logsys_config_mode_get (
+ const char *subsys);
+
+extern unsigned int logsys_config_tags_set (
+ const char *subsys,
+ unsigned int tags);
+
+extern unsigned int logsys_config_tags_get (
+ const char *subsys);
+
+/*
+ * to close a logfile, just invoke this function with a NULL
+ * file or if you want to change logfile, the old one will
+ * be closed for you.
+ */
+extern int logsys_config_file_set (
+ const char *subsys,
+ const char **error_string,
+ const char *file);
+
+extern unsigned int logsys_config_logfile_priority_set (
+ const char *subsys,
+ unsigned int priority);
+
+/*
+ * enabling debug, disable message priority filtering.
+ * everything is sent everywhere. priority values
+ * for file and syslog are not overwritten.
+ */
+extern unsigned int logsys_config_debug_set (
+ const char *subsys,
+ unsigned int value);
+
+/*
+ * External API - helpers
+ *
+ * convert facility/priority/tag to/from name/values
+ */
+
extern int logsys_facility_id_get (
const char *name);
@@ -127,92 +235,41 @@
extern const char *logsys_tag_name_get (
unsigned int tag);
-extern void logsys_fork_completed (void);
-
-extern void logsys_flush (void);
-
-extern void logsys_atsegv (void);
-
-extern int logsys_log_rec_store (const char *filename);
-
/*
- * Internal APIs that must be globally exported
- */
-extern unsigned int _logsys_subsys_create (
- const char *ident,
- unsigned int priority);
-
-extern void _logsys_nosubsys_set (void);
-
-extern int _logsys_rec_init (unsigned int size);
-
-extern void _logsys_log_printf (
- int subsys,
- const char *function_name,
- const char *file_name,
- int file_line,
- unsigned int level,
- const char *format,
- ...) __attribute__((format(printf, 6, 7)));
-
-extern void _logsys_log_rec (
- int subsys,
- const char *function_name,
- const char *file_name,
- int file_line,
- unsigned int rec_ident,
- ...);
-
-extern int _logsys_wthread_create (void);
-
-static unsigned int logsys_subsys_id __attribute__((unused)) = -1;
-
-/*
* External definitions
*/
extern void *logsys_rec_end;
#define LOG_REC_END (&logsys_rec_end)
-#define LOGSYS_DECLARE_SYSTEM(name,mode,file,facility,format,rec_size) \
-__attribute__ ((constructor)) static void logsys_system_init (void) \
+#define LOGSYS_DECLARE_SYSTEM(name,mode,debug,file,file_priority, \
+ syslog_facility,syslog_priority,tags,format,rec_size) \
+__attribute__ ((constructor)) \
+static void logsys_system_init (void) \
{ \
- const char *error_string; \
+ int err; \
\
- logsys_config_mode_set (mode); \
- logsys_config_file_set (&error_string, (file)); \
- logsys_config_facility_set (name, (facility)); \
- logsys_format_set (format); /* FIXME: assert success? */ \
- _logsys_rec_init (rec_size); \
- _logsys_wthread_create(); \
-}
-
-#define LOGSYS_DECLARE_NOSUBSYS(priority) \
-__attribute__ ((constructor)) static void logsys_nosubsys_init (void) \
-{ \
- unsigned int pri, tags; \
+ err = _logsys_system_setup (name,mode,debug,file,file_priority, \
+ syslog_facility,syslog_priority,tags); \
+ assert (err == 0); \
\
- logsys_subsys_id = \
- logsys_config_subsys_get("MAIN", &tags, &pri); \
+ err = logsys_format_set (format); \
+ assert (err == 0); \
\
- if (logsys_subsys_id == -1) { \
- _logsys_nosubsys_set(); \
- logsys_subsys_id = \
- _logsys_subsys_create ("MAIN", (priority)); \
- } \
+ err = _logsys_rec_init (rec_size); \
+ assert (err == 0); \
+ \
+ err = _logsys_wthread_create(); \
+ assert (err == 0); \
}
-#define LOGSYS_DECLARE_SUBSYS(subsys,priority) \
-__attribute__ ((constructor)) static void logsys_subsys_init (void) \
+#define LOGSYS_DECLARE_SUBSYS(subsys) \
+__attribute__ ((constructor)) \
+static void logsys_subsys_init (void) \
{ \
- unsigned int pri, tags; \
- \
logsys_subsys_id = \
- logsys_config_subsys_get((subsys), &tags, &pri); \
- \
- if (logsys_subsys_id == -1) \
- logsys_subsys_id = \
- _logsys_subsys_create ((subsys), (priority)); \
+ _logsys_subsys_create ((subsys)); \
+ assert (logsys_subsys_id < SUBSYS_MAX); \
}
#define log_rec(rec_ident, args...) \
@@ -277,26 +334,4 @@
__FILE__, __LINE__, LOGSYS_TAG_TRACE8, format, ##args);\
} while(0)
-/*
- * For one-time programmatic initialization and configuration of logsys
- * instead of using the DECLARE macros. These APIs do not allow subsystems
- */
-int logsys_init (
- const char *name,
- int mode,
- int facility,
- int priority,
- const char *file,
- char *format,
- int rec_size);
-
-int logsys_conf (
- char *name,
- int mode,
- int facility,
- int priority,
- char *file);
-
-void logsys_exit (void);
-
#endif /* LOGSYS_H_DEFINED */
--- exec/logsys.c (revision 2058)
+++ exec/logsys.c (working copy)
@@ -96,35 +96,35 @@
int flt_data_size;
-#define SUBSYS_MAX 32
-
#define COMBINE_BUFFER_SIZE 2048
+/* values for logsys_logger init_status */
+#define LOGSYS_LOGGER_INIT_DONE 0
+#define LOGSYS_LOGGER_NEEDS_INIT 1
+
+static int logsys_system_needs_init = LOGSYS_LOGGER_NEEDS_INIT;
+
+/* need unlogical order to preserve 64bit alignment */
struct logsys_logger {
- char subsys[64];
- unsigned int priority;
- unsigned int tags;
- unsigned int mode;
+ char subsys[SUBSYS_MAXLEN]; /* subsystem name */
+ char *logfile; /* log to file */
+ FILE *logfile_fp; /* track file descriptor */
+ unsigned int mode; /* subsystem mode */
+ unsigned int debug; /* debug on|off */
+ unsigned int tags; /* trace tags */
+ int syslog_facility; /* facility */
+ int syslog_priority; /* priority */
+ int logfile_priority; /* priority to file */
+ int init_status; /* internal field to handle init queues
+ for subsystems */
};
/*
- * Configuration parameters for logging system
+ * operating global variables
*/
-static const char *logsys_name = NULL;
-static unsigned int logsys_mode = LOG_MODE_NOSUBSYS;
+static struct logsys_logger logsys_loggers[SUBSYS_MAX + 1];
-static const char *logsys_file = NULL;
-
-static FILE *logsys_file_fp = NULL;
-
-static int logsys_facility = LOG_DAEMON;
-
-/*
- * operating global variables
- */
-static struct logsys_logger logsys_loggers[SUBSYS_MAX];
-
static int wthread_active = 0;
static int wthread_should_exit = 0;
@@ -161,8 +161,6 @@
#define FDTAIL_INDEX (flt_data_size + 1)
-static void logsys_atexit (void);
-
/*
* Helpers for _logsys_log_rec functionality
*/
@@ -204,7 +202,6 @@
}
#endif
-
/*
* Before any write operation, a reclaim on the buffer area must be executed
*/
@@ -305,7 +302,7 @@
const char *file_name,
const char *function_name,
int file_line,
- unsigned int level,
+ int level,
char *buffer)
{
char output_buffer[COMBINE_BUFFER_SIZE];
@@ -316,7 +313,13 @@
struct timeval tv;
int cutoff;
unsigned int len;
-
+ int subsysid;
+
+ subsysid = _logsys_config_subsys_get(subsys);
+ if (subsysid == - 1) {
+ return;
+ }
+
while (format_buffer[format_buffer_idx]) {
cutoff = -1;
if (format_buffer[format_buffer_idx] == '%') {
@@ -375,34 +378,41 @@
/*
* Output to syslog
- */
- if (logsys_mode & LOG_MODE_OUTPUT_SYSLOG) {
- syslog (level, "%s", output_buffer);
+ */
+ if (((logsys_loggers[subsysid].mode & LOG_MODE_OUTPUT_SYSLOG) &&
+ (level <= logsys_loggers[subsysid].syslog_priority)) ||
+ (logsys_loggers[subsysid].debug != 0)) {
+ syslog (level | logsys_loggers[subsysid].syslog_facility, "%s", output_buffer);
}
/*
* Terminate string with \n \0
*/
- if (logsys_mode & (LOG_MODE_OUTPUT_FILE|LOG_MODE_OUTPUT_STDERR)) {
+ if (logsys_loggers[subsysid].mode & (LOG_MODE_OUTPUT_FILE|LOG_MODE_OUTPUT_STDERR)) {
output_buffer[output_buffer_idx++] = '\n';
output_buffer[output_buffer_idx] = '\0';
}
/*
* Output to configured file
- */
- if ((logsys_mode & LOG_MODE_OUTPUT_FILE) && logsys_file_fp) {
+ */
+ if (((logsys_loggers[subsysid].mode & LOG_MODE_OUTPUT_FILE) &&
+ logsys_loggers[subsysid].logfile_fp &&
+ (level <= logsys_loggers[subsysid].logfile_priority)) ||
+ (logsys_loggers[subsysid].debug != 0)) {
/*
* Output to a file
*/
- (void)fwrite (output_buffer, strlen (output_buffer), 1, logsys_file_fp);
- fflush (logsys_file_fp);
+ (void)fwrite (output_buffer, strlen (output_buffer), 1, logsys_loggers[subsysid].logfile_fp);
+ fflush (logsys_loggers[subsysid].logfile_fp);
}
/*
* Output to stderr
- */
- if (logsys_mode & LOG_MODE_OUTPUT_STDERR) {
+ */
+ if (((logsys_loggers[subsysid].mode & LOG_MODE_OUTPUT_STDERR) &&
+ (level <= logsys_loggers[subsysid].logfile_priority)) ||
+ (logsys_loggers[subsysid].debug != 0)) {
(void)write (STDERR_FILENO, output_buffer, strlen (output_buffer));
}
}
@@ -442,10 +452,10 @@
(char *)arguments[1],
(char *)arguments[2],
file_line,
- level,
+ (level-1),
(char *)arguments[3]);
}
-
+
static int record_read (char *buf, int rec_idx, int *log_msg) {
unsigned int rec_size;
unsigned int rec_ident;
@@ -582,32 +592,238 @@
wthread_wait_locked ();
}
+static int _logsys_config_subsys_get_unlocked (const char *subsys)
+{
+ unsigned int i;
+
+ if (!subsys) {
+ return SUBSYS_MAX;
+ }
+
+ for (i = 0; i <= SUBSYS_MAX; i++) {
+ if (strcmp (logsys_loggers[i].subsys, subsys) == 0) {
+ pthread_mutex_unlock (&logsys_config_mutex);
+ return i;
+ }
+ }
+
+ return (-1);
+}
+
+static void syslog_facility_reconf (void)
+{
+ closelog();
+ openlog(logsys_loggers[SUBSYS_MAX].subsys,
+ LOG_CONS|LOG_PID,
+ logsys_loggers[SUBSYS_MAX].syslog_facility);
+}
+
/*
+ * this is always invoked within the mutex, so it's safe to parse the
+ * whole thing as we need.
+ */
+static void logsys_close_logfile (
+ int subsysid)
+{
+ int i;
+
+ /* if there is no fp, just cleanup possible logfile strdups */
+ if (logsys_loggers[subsysid].logfile_fp == NULL) {
+ goto outfree;
+ }
+
+ /* if there is another subsystem or system using the same fp,
+ * then we clean our own structs, but we can't close the file
+ * as it is in use by somebody else.
+ * Only the last users will be allowed to perform the fclose.
+ */
+ for (i = 0; i <= SUBSYS_MAX; i++) {
+ if ((logsys_loggers[i].logfile_fp == logsys_loggers[subsysid].logfile_fp) &&
+ (i != subsysid)) {
+ logsys_loggers[subsysid].logfile_fp = NULL;
+ goto outfree;
+ }
+ }
+
+ /* if we are here, we are the last users of that fp, so we can safely
+ * close it.
+ */
+ fclose (logsys_loggers[subsysid].logfile_fp);
+ logsys_loggers[subsysid].logfile_fp = NULL;
+
+ /* this is common to all exit paths */
+outfree:
+ if (logsys_loggers[subsysid].logfile != NULL) {
+ free (logsys_loggers[subsysid].logfile);
+ logsys_loggers[subsysid].logfile = NULL;
+ }
+}
+
+/*
+ * we need a version that can work when somebody else is already
+ * holding a config mutex lock or we will never get out of here
+ */
+static int logsys_config_file_set_unlocked (
+ int subsysid,
+ const char **error_string,
+ const char *file)
+{
+ static char error_string_response[512];
+ int i;
+
+ if (file == NULL) {
+ logsys_close_logfile(subsysid);
+ return (0);
+ }
+
+ if (logsys_loggers[subsysid].mode & LOG_MODE_OUTPUT_FILE) {
+ logsys_close_logfile(subsysid);
+ logsys_loggers[subsysid].logfile = strdup(file);
+ if (logsys_loggers[subsysid].logfile == NULL) {
+ snprintf (error_string_response,
+ sizeof(error_string_response),
+ "Unable to allocate memory for logfile '%s'\n",
+ file);
+ *error_string = error_string_response;
+ return (-1);
+ }
+ for (i = 0; i <= SUBSYS_MAX; i++) {
+ if ((logsys_loggers[i].logfile != NULL) &&
+ (strcmp (logsys_loggers[i].logfile,
+ logsys_loggers[subsysid].logfile) == 0) &&
+ (i != subsysid)) {
+ logsys_loggers[subsysid].logfile_fp =
+ logsys_loggers[i].logfile_fp;
+ }
+ }
+ if (logsys_loggers[subsysid].logfile_fp == NULL) {
+ logsys_loggers[subsysid].logfile_fp =
+ fopen (file, "a+");
+ }
+ if (logsys_loggers[subsysid].logfile_fp == NULL) {
+ snprintf (error_string_response,
+ sizeof(error_string_response),
+ "Can't open logfile '%s' for reason (%s).\n",
+ file, strerror (errno));
+ *error_string = error_string_response;
+ return (-1);
+ }
+ } else
+ logsys_close_logfile(subsysid);
+
+ return (0);
+}
+
+static void logsys_subsys_init (
+ const char *subsys,
+ int subsysid)
+{
+ if (logsys_system_needs_init == LOGSYS_LOGGER_NEEDS_INIT) {
+ logsys_loggers[subsysid].init_status =
+ LOGSYS_LOGGER_NEEDS_INIT;
+ } else {
+ memcpy(&logsys_loggers[subsysid],
+ &logsys_loggers[SUBSYS_MAX],
+ sizeof(logsys_loggers[SUBSYS_MAX]));
+ logsys_loggers[subsysid].tags = LOGSYS_TAG_LOG;
+ logsys_loggers[subsysid].init_status =
+ LOGSYS_LOGGER_INIT_DONE;
+ }
+ strncpy (logsys_loggers[subsysid].subsys, subsys,
+ SUBSYS_MAXLEN);
+}
+
+/*
* Internal API - exported
*/
-void _logsys_nosubsys_set (void)
+
+int _logsys_system_setup(
+ const char *system,
+ unsigned int mode,
+ unsigned int debug,
+ const char *logfile,
+ int logfile_priority,
+ int syslog_facility,
+ int syslog_priority,
+ unsigned int tags)
{
- logsys_mode |= LOG_MODE_NOSUBSYS;
+ int i;
+ const char *errstr;
+ char tempsubsys[SUBSYS_MAXLEN];
+
+ i = SUBSYS_MAX;
+
+ pthread_mutex_lock (&logsys_config_mutex);
+
+ snprintf(logsys_loggers[i].subsys,
+ SUBSYS_MAXLEN,
+ "%s", system);
+
+ logsys_loggers[i].mode = mode;
+
+ logsys_loggers[i].debug = debug;
+
+ if ((logfile) && strlen(logfile) > 0) {
+ logsys_config_file_set_unlocked (i, &errstr, logfile);
+ }
+ logsys_loggers[i].logfile_priority = logfile_priority;
+
+ logsys_loggers[i].syslog_facility = syslog_facility;
+ logsys_loggers[i].syslog_priority = syslog_priority;
+ syslog_facility_reconf();
+
+ logsys_loggers[i].tags = tags;
+
+ logsys_loggers[i].init_status = LOGSYS_LOGGER_INIT_DONE;
+
+ logsys_system_needs_init = LOGSYS_LOGGER_INIT_DONE;
+
+ for (i = 0; i < SUBSYS_MAX; i++) {
+ if ((strcmp (logsys_loggers[i].subsys, "") != 0) &&
+ (logsys_loggers[i].init_status ==
+ LOGSYS_LOGGER_NEEDS_INIT)) {
+ strncpy (tempsubsys, logsys_loggers[i].subsys,
+ SUBSYS_MAXLEN);
+ logsys_subsys_init(tempsubsys, i);
+ }
+ }
+
+ pthread_mutex_unlock (&logsys_config_mutex);
+
+ return (0);
}
-unsigned int _logsys_subsys_create (
- const char *subsys,
- unsigned int priority)
+unsigned int _logsys_subsys_create (const char *subsys)
{
+ int i;
+
assert (subsys != NULL);
- return logsys_config_subsys_set (
- subsys,
- LOGSYS_TAG_LOG,
- priority);
+ pthread_mutex_lock (&logsys_config_mutex);
+
+ i = _logsys_config_subsys_get_unlocked (subsys);
+ if ((i > -1) && (i < SUBSYS_MAX)) {
+ pthread_mutex_unlock (&logsys_config_mutex);
+ return i;
+ }
+
+ for (i = 0; i < SUBSYS_MAX; i++) {
+ if (strcmp (logsys_loggers[i].subsys, "") == 0) {
+ logsys_subsys_init(subsys, i);
+ break;
+ }
+ }
+
+ assert(i < SUBSYS_MAX);
+
+ pthread_mutex_unlock (&logsys_config_mutex);
+ return i;
}
int _logsys_wthread_create (void)
{
- if ((logsys_mode & LOG_MODE_FORK) == 0) {
- if (logsys_name != NULL) {
- openlog (logsys_name, LOG_CONS|LOG_PID, logsys_facility);
- }
+ if (((logsys_loggers[SUBSYS_MAX].mode & LOG_MODE_FORK) == 0) &&
+ ((logsys_loggers[SUBSYS_MAX].mode & LOG_MODE_THREADED) != 0)) {
wthread_create();
atexit (logsys_atexit);
}
@@ -621,9 +837,10 @@
* Last record ends at zero
*/
flt_data = malloc ((size + 2) * sizeof (unsigned int));
- assert (flt_data != NULL);
+ if (flt_data == NULL) {
+ return (-1);
+ }
flt_data_size = size;
- assert (flt_data != NULL);
flt_data[FDHEAD_INDEX] = 0;
flt_data[FDTAIL_INDEX] = 0;
@@ -651,7 +868,7 @@
* ... repeats length & arg
*/
void _logsys_log_rec (
- int subsys,
+ int subsysid,
const char *function_name,
const char *file_name,
int file_line,
@@ -690,8 +907,8 @@
/*
* Encode logsys subsystem identity, filename, and function
*/
- buf_args[0] = logsys_loggers[subsys].subsys;
- buf_len[0] = strlen (logsys_loggers[subsys].subsys) + 1;
+ buf_args[0] = logsys_loggers[subsysid].subsys;
+ buf_len[0] = strlen (logsys_loggers[subsysid].subsys) + 1;
buf_args[1] = file_name;
buf_len[1] = strlen (file_name) + 1;
buf_args[2] = function_name;
@@ -803,7 +1020,7 @@
}
void _logsys_log_printf (
- int subsys,
+ int subsysid,
const char *function_name,
const char *file_name,
int file_line,
@@ -815,12 +1032,10 @@
unsigned int len;
va_list ap;
- if (logsys_mode & LOG_MODE_NOSUBSYS) {
- subsys = 0;
+ if (subsysid == -1) {
+ subsysid = SUBSYS_MAX;
}
- if (level > logsys_loggers[subsys].priority) {
- return;
- }
+
va_start (ap, format);
len = vsprintf (logsys_print_buffer, format, ap);
va_end (ap);
@@ -832,7 +1047,7 @@
/*
* Create a log record
*/
- _logsys_log_rec (subsys,
+ _logsys_log_rec (subsysid,
function_name,
file_name,
file_line,
@@ -840,12 +1055,12 @@
logsys_print_buffer, len + 1,
LOG_REC_END);
- if ((logsys_mode & LOG_MODE_THREADED) == 0) {
+ if ((logsys_loggers[SUBSYS_MAX].mode & LOG_MODE_THREADED) == 0) {
/*
* Output (and block) if the log mode is not threaded otherwise
* expect the worker thread to output the log data once signaled
*/
- log_printf_to_logs (logsys_loggers[subsys].subsys,
+ log_printf_to_logs (logsys_loggers[subsysid].subsys,
file_name, function_name, file_line, level,
logsys_print_buffer);
} else {
@@ -856,68 +1071,107 @@
}
}
+int _logsys_config_subsys_get (const char *subsys)
+{
+ unsigned int i;
+
+ pthread_mutex_lock (&logsys_config_mutex);
+
+ i = _logsys_config_subsys_get_unlocked (subsys);
+
+ pthread_mutex_unlock (&logsys_config_mutex);
+
+ return i;
+}
+
/*
* External Configuration and Initialization API
*/
void logsys_fork_completed (void)
{
- logsys_mode &= ~LOG_MODE_FORK;
+ logsys_loggers[SUBSYS_MAX].mode &= ~LOG_MODE_FORK;
_logsys_wthread_create ();
}
-void logsys_config_mode_set (unsigned int mode)
+unsigned int logsys_config_mode_set (const char *subsys, unsigned int mode)
{
+ int i;
+
pthread_mutex_lock (&logsys_config_mutex);
- logsys_mode = mode;
+ i = _logsys_config_subsys_get_unlocked (subsys);
+ if (i != -1) {
+ logsys_loggers[i].mode = mode;
+ i = 0;
+ }
pthread_mutex_unlock (&logsys_config_mutex);
+
+ return i;
}
-unsigned int logsys_config_mode_get (void)
+unsigned int logsys_config_mode_get (const char *subsys)
{
- return logsys_mode;
+ int i;
+
+ i = _logsys_config_subsys_get (subsys);
+ if (i == -1) {
+ return -1;
+ }
+
+ return logsys_loggers[i].mode;
}
-static void logsys_close_logfile (void)
+unsigned int logsys_config_tags_set (const char *subsys, unsigned int tags)
{
- if (logsys_file_fp != NULL) {
- fclose (logsys_file_fp);
- logsys_file_fp = NULL;
+ int i;
+
+ pthread_mutex_lock (&logsys_config_mutex);
+ i = _logsys_config_subsys_get_unlocked (subsys);
+ if (i != -1) {
+ logsys_loggers[i].tags = tags;
+ i = 0;
}
+ pthread_mutex_unlock (&logsys_config_mutex);
+
+ return i;
}
-int logsys_config_file_set (const char **error_string, const char *file)
+unsigned int logsys_config_tags_get (const char *subsys)
{
- static char error_string_response[512];
+ int i;
- if (file == NULL) {
- logsys_close_logfile();
- return (0);
+ i = _logsys_config_subsys_get (subsys);
+ if (i == -1) {
+ return -1;
}
+ return logsys_loggers[i].tags;
+}
+
+int logsys_config_file_set (
+ const char *subsys,
+ const char **error_string,
+ const char *file)
+{
+ int i;
+ int res;
+
pthread_mutex_lock (&logsys_config_mutex);
- if (logsys_mode & LOG_MODE_OUTPUT_FILE) {
- logsys_file = file;
- logsys_close_logfile();
- logsys_file_fp = fopen (file, "a+");
- if (logsys_file_fp == 0) {
- snprintf (error_string_response,
- sizeof(error_string_response),
- "Can't open logfile '%s' for reason (%s).\n",
- file, strerror (errno));
- *error_string = error_string_response;
- pthread_mutex_unlock (&logsys_config_mutex);
- return (-1);
- }
- } else
- logsys_close_logfile();
+ i = _logsys_config_subsys_get_unlocked (subsys);
+ if (i == -1) {
+ res = i;
+ } else {
+ res = logsys_config_file_set_unlocked(i, error_string, file);
+ }
pthread_mutex_unlock (&logsys_config_mutex);
- return (0);
+ return res;
}
int logsys_format_set (const char *format)
{
+ int ret = 0;
+
pthread_mutex_lock (&logsys_config_mutex);
if (format_buffer) {
@@ -927,15 +1181,15 @@
if (format) {
format_buffer = strdup(format);
+ if (format_buffer == NULL) {
+ ret = -1;
+ }
} else {
format_buffer = strdup("[%6s] %b");
}
- if (format_buffer == NULL) {
- return -1;
- }
pthread_mutex_unlock (&logsys_config_mutex);
- return 0;
+ return ret;
}
char *logsys_format_get (void)
@@ -943,16 +1197,77 @@
return format_buffer;
}
-void logsys_config_facility_set (const char *name, unsigned int facility)
+unsigned int logsys_config_syslog_facility_set (
+ const char *subsys,
+ unsigned int facility)
{
+ int i;
+
pthread_mutex_lock (&logsys_config_mutex);
+ i = _logsys_config_subsys_get_unlocked (subsys);
+ if (i != -1) {
+ logsys_loggers[i].syslog_facility = facility;
+ if (i == SUBSYS_MAX) {
+ syslog_facility_reconf();
+ }
+ i = 0;
+ }
+ pthread_mutex_unlock (&logsys_config_mutex);
- logsys_name = name;
- logsys_facility = facility;
+ return i;
+}
+unsigned int logsys_config_syslog_priority_set (
+ const char *subsys,
+ unsigned int priority)
+{
+ int i;
+
+ pthread_mutex_lock (&logsys_config_mutex);
+ i = _logsys_config_subsys_get_unlocked (subsys);
+ if (i != -1) {
+ logsys_loggers[i].syslog_priority = priority;
+ i = 0;
+ }
pthread_mutex_unlock (&logsys_config_mutex);
+
+ return i;
}
+unsigned int logsys_config_logfile_priority_set (
+ const char *subsys,
+ unsigned int priority)
+{
+ int i;
+
+ pthread_mutex_lock (&logsys_config_mutex);
+ i = _logsys_config_subsys_get_unlocked (subsys);
+ if (i != -1) {
+ logsys_loggers[i].logfile_priority = priority;
+ i = 0;
+ }
+ pthread_mutex_unlock (&logsys_config_mutex);
+
+ return i;
+}
+
+unsigned int logsys_config_debug_set (
+ const char *subsys,
+ unsigned int debug)
+{
+ int i;
+
+ pthread_mutex_lock (&logsys_config_mutex);
+ i = _logsys_config_subsys_get_unlocked (subsys);
+ if (i != -1) {
+ logsys_loggers[i].debug = debug;
+ i = 0;
+ }
+ pthread_mutex_unlock (&logsys_config_mutex);
+
+ return i;
+}
+
int logsys_facility_id_get (const char *name)
{
unsigned int i;
@@ -1025,63 +1340,6 @@
return (NULL);
}
-unsigned int logsys_config_subsys_set (
- const char *subsys,
- unsigned int tags,
- unsigned int priority)
-{
- int i;
-
- pthread_mutex_lock (&logsys_config_mutex);
- for (i = 0; i < SUBSYS_MAX; i++) {
- if (strcmp (logsys_loggers[i].subsys, subsys) == 0) {
- logsys_loggers[i].tags = tags;
- logsys_loggers[i].priority = priority;
-
- break;
- }
- }
-
- if (i == SUBSYS_MAX) {
- for (i = 0; i < SUBSYS_MAX; i++) {
- if (strcmp (logsys_loggers[i].subsys, "") == 0) {
- strncpy (logsys_loggers[i].subsys, subsys,
- sizeof(logsys_loggers[i].subsys));
- logsys_loggers[i].tags = tags;
- logsys_loggers[i].priority = priority;
- break;
- }
- }
- }
- assert(i < SUBSYS_MAX);
-
- pthread_mutex_unlock (&logsys_config_mutex);
- return i;
-}
-
-int logsys_config_subsys_get (
- const char *subsys,
- unsigned int *tags,
- unsigned int *priority)
-{
- unsigned int i;
-
- pthread_mutex_lock (&logsys_config_mutex);
-
- for (i = 0; i < SUBSYS_MAX; i++) {
- if (strcmp (logsys_loggers[i].subsys, subsys) == 0) {
- *tags = logsys_loggers[i].tags;
- *priority = logsys_loggers[i].priority;
- pthread_mutex_unlock (&logsys_config_mutex);
- return i;
- }
- }
-
- pthread_mutex_unlock (&logsys_config_mutex);
-
- return (-1);
-}
-
int logsys_log_rec_store (const char *filename)
{
int fd;
@@ -1105,7 +1363,7 @@
return (0);
}
-static void logsys_atexit (void)
+void logsys_atexit (void)
{
if (wthread_active) {
wthread_should_exit = 1;
@@ -1113,59 +1371,3 @@
pthread_join (logsys_thread_id, NULL);
}
}
-
-void logsys_atsegv (void)
-{
- if (wthread_active) {
- wthread_should_exit = 1;
- wthread_signal ();
- pthread_join (logsys_thread_id, NULL);
- }
-}
-
-int logsys_init (
- const char *name,
- int mode,
- int facility,
- int priority,
- const char *file,
- char *format,
- int rec_size)
-{
- const char *errstr;
-
- _logsys_nosubsys_set ();
- _logsys_subsys_create (name, priority);
- strncpy (logsys_loggers[0].subsys, name,
- sizeof (logsys_loggers[0].subsys));
- logsys_config_mode_set (mode);
- logsys_config_facility_set (name, facility);
- logsys_config_file_set (&errstr, file);
- if (logsys_format_set (format))
- return -1;
- _logsys_rec_init (rec_size);
- _logsys_wthread_create ();
- return (0);
-}
-
-int logsys_conf (
- char *name,
- int mode,
- int facility,
- int priority,
- char *file)
-{
- const char *errstr;
-
- _logsys_rec_init (100000);
- strncpy (logsys_loggers[0].subsys, name,
- sizeof (logsys_loggers[0].subsys));
- logsys_config_mode_set (mode);
- logsys_config_facility_set (name, facility);
- logsys_config_file_set (&errstr, file);
- return (0);
-}
-
-void logsys_exit (void)
-{
-}
_______________________________________________
Openais mailing list
[email protected]
https://lists.linux-foundation.org/mailman/listinfo/openais