contrib/arpon/arpon-syslog.patch
2020-05-25 23:06:44 +00:00

335 lines
8.5 KiB
Diff

diff --git a/ArpON-3.0-ng/src/main.c b/ArpON-3.0-ng/src/main.c
index 7045a13..23d9f0d 100644
--- a/ArpON-3.0-ng/src/main.c
+++ b/ArpON-3.0-ng/src/main.c
@@ -33,6 +33,9 @@
#include <stdio.h>
#include <stdbool.h>
+#include <stdlib.h>
+#include <string.h>
+#include <syslog.h>
#include "dmn.h"
#include "env.h"
@@ -43,12 +46,33 @@
#include "sig.h"
#include "thd.h"
+int syslog_verbosity;
+
/*
* ArpON Main.
*/
int
main(int argc, char **argv, char **envp)
{
+ char* verbosity = getenv("ARPON_SYSLOG_VERBOSITY");
+
+ if (verbosity == NULL)
+ syslog_verbosity = LOG_INFO;
+ else if (strcmp(verbosity, "CRIT") == 0)
+ syslog_verbosity = LOG_CRIT;
+ else if (strcmp(verbosity, "ERR") == 0)
+ syslog_verbosity = LOG_ERR;
+ else if (strcmp(verbosity, "WARNING") == 0)
+ syslog_verbosity = LOG_WARNING;
+ else if (strcmp(verbosity, "INFO") == 0)
+ syslog_verbosity = LOG_INFO;
+ else if (strcmp(verbosity, "DEBUG") == 0)
+ syslog_verbosity = LOG_DEBUG;
+ else
+ syslog_verbosity = LOG_INFO;
+
+ /* Initialize syslog. */
+ openlog("arpon", LOG_CONS | LOG_PID | LOG_NDELAY, LOG_DAEMON);
/* Audit the environment. */
env_audit(argv, envp);
diff --git a/ArpON-3.0-ng/src/msg.c b/ArpON-3.0-ng/src/msg.c
index 77ee70d..174c6e2 100644
--- a/ArpON-3.0-ng/src/msg.c
+++ b/ArpON-3.0-ng/src/msg.c
@@ -42,6 +42,7 @@
#include <errno.h>
#include <assert.h>
#include <pthread.h>
+#include <syslog.h>
#include "config.h"
#include "exit.h"
@@ -58,23 +59,12 @@
*/
#define MSG_MESSAGESIZE 512 /* 512 bytes. */
-/*
- * Log file permissions to 640.
- */
-#define MSG_LOGPERMS S_IRUSR | S_IWUSR | S_IRGRP
+extern int syslog_verbosity;
/*
* Function prototypes not exported.
*/
-static void msg_init(void);
-static void msg_destroy(void);
static void msg_gettimestamp(char *ts);
-static void msg_putmessage(FILE *stream, const char *msg);
-
-/*
- * Initialize the log file stream.
- */
-static FILE *log = NULL;
/*
* Initialize the message mutex.
@@ -82,7 +72,7 @@ static FILE *log = NULL;
static pthread_mutex_t msg_mtx = PTHREAD_MUTEX_INITIALIZER;
/*
- * Initialize the log file stream and print the message with logging.
+ * Print the message.
* The syntax of each message is:
*
* timestamp1 [log level] message1
@@ -93,21 +83,38 @@ static pthread_mutex_t msg_mtx = PTHREAD_MUTEX_INITIALIZER;
void
msg(FILE *stream, const char *level, const char *fmt, ...)
{
-
do {
char ts[MSG_TIMESTAMPSIZE], msg[MSG_MESSAGESIZE];
va_list ap;
int len1, len2, tot_len = MSG_MESSAGESIZE;
+ int syslog_lvl;
/* Lock the mutex of the message. */
if (pthread_mutex_lock(&msg_mtx) != 0)
break;
- /* Log file stream of the messages already initialized and open? */
- if (log == NULL) {
- /* Initialize the log file stream of the messages. */
- msg_init();
- }
+ if (strcmp(level, "BUG") == 0)
+ syslog_lvl = LOG_CRIT;
+ else if (strcmp(level, "ERROR") == 0)
+ syslog_lvl = LOG_ERR;
+ else if (strcmp(level, "WARN") == 0)
+ syslog_lvl = LOG_WARNING;
+ else if (strcmp(level, "INFO") == 0)
+ syslog_lvl = LOG_INFO;
+ else if (strcmp(level, "DEBUG") == 0)
+ syslog_lvl = LOG_DEBUG;
+ else
+ syslog_lvl = LOG_NOTICE;
+
+ if (syslog_verbosity < syslog_lvl)
+ return;
+
+ va_start(ap, fmt);
+
+ /* Print the message to syslog. */
+ vsyslog(syslog_lvl, fmt, ap);
+
+ va_end(ap);
/* Get the timestamp of the message. */
msg_gettimestamp(ts);
@@ -139,125 +146,17 @@ msg(FILE *stream, const char *level, const char *fmt, ...)
/* No message truncated. */
assert(tot_len > 0);
- /* Print the message in the log file stream and the file stream. */
- msg_putmessage(stream, msg);
-
- /* Unlock the mutex of the message. */
- if (pthread_mutex_unlock(&msg_mtx) != 0)
- break;
-
- return;
- } while (0);
-
- ERROR("%s", strerror(errno));
- exit(EXIT_FAILURE);
-}
-
-/*
- * Initialize the log file stream of the messages.
- */
-static void
-msg_init(void)
-{
-
- do {
- struct stat stats;
- bool UNUSED(logcreate) = false;
-
- /* Check if the log file exist. */
- if (stat(LOG_FILE, &stats) < 0) {
- if (errno == ENOENT) {
- int fd;
-
- /* Create and open the log file with the 640 perms. */
- if ((fd = open(LOG_FILE, O_CREAT, MSG_LOGPERMS)) < 0)
- break;
-
- /* Close the log file descriptor. */
- if (close(fd) < 0)
- break;
-
- /* Call again. */
- if (stat(LOG_FILE, &stats) < 0)
- break;
-
-#ifndef NDEBUG
- /* Log file created. */
- logcreate = true;
-#endif /* !NDEBUG */
- } else {
- break;
- }
- }
-
- /* Check if the log file is a regular file. */
- if (S_ISREG(stats.st_mode) == 0) {
- ERROR("%s is not a regular file", LOG_FILE);
- exit(EXIT_FAILURE);
- }
-
- /* Fix the log file perms to 640. */
- if (chmod(LOG_FILE, MSG_LOGPERMS) < 0)
- break;
+ /* Print the message in the file stream. */
+ fprintf(stream, "%s", msg);
- /* Open the log file stream to append. */
- if ((log = fopen(LOG_FILE, "a")) == NULL)
+ /* Flush the file stream. */
+ if (fflush(stream) == EOF)
break;
-#ifndef NDEBUG
/* Unlock the mutex of the message. */
if (pthread_mutex_unlock(&msg_mtx) != 0)
break;
- /* Log file created? */
- if (logcreate == true)
- MSG_DEBUG("Create %s with 640 perms successful", LOG_FILE);
-#endif /* !NDEBUG */
-
- MSG_DEBUG("Open %s successful", LOG_FILE);
- MSG_DEBUG("Start logging");
-
- /* Push msg_destroy() to be called on exit_cleanup(). */
- exit_push(msg_destroy, "msg_destroy");
-
-#ifndef NDEBUG
- /* Lock the mutex of the message. */
- if (pthread_mutex_lock(&msg_mtx) != 0)
- break;
-#endif /* !NDEBUG */
-
- return;
- } while (0);
-
- ERROR("%s", strerror(errno));
- exit(EXIT_FAILURE);
-}
-
-/*
- * Destroy the log file stream of the messages.
- */
-static void
-msg_destroy(void)
-{
-
- do {
- /* Unlock the mutex of the message before the destruction. */
- if (pthread_mutex_unlock(&msg_mtx) != 0)
- break;
-
- /* Log file stream of the messages already destroyed and closed? */
- if (log != NULL) {
- MSG_DEBUG("End logging");
- MSG_DEBUG("Close %s successful", LOG_FILE);
-
- /* Close the log file stream. */
- if (fclose(log) == EOF)
- break;
-
- /* Set the log file stream to NULL. */
- log = NULL;
- }
-
return;
} while (0);
@@ -299,64 +198,6 @@ msg_gettimestamp(char *ts)
exit(EXIT_FAILURE);
}
-/*
- * Put the message in the log file stream and the file stream.
- */
-static void
-msg_putmessage(FILE *stream, const char *msg)
-{
-
- do {
- struct stat stats;
-
- /* Check if the log file exist. */
- if (stat(LOG_FILE, &stats) < 0) {
- if (errno == ENOENT) {
- /* Close the log file stream. */
- if (fclose(log) == EOF)
- break;
-
- /* Set the log file stream to NULL. */
- log = NULL;
-
- /* Re-initialize the log file stream. */
- msg_init();
-
- /* Call again. */
- if (stat(LOG_FILE, &stats) < 0)
- break;
- } else {
- break;
- }
- }
-
- /* Check if the log file is a regular file. */
- if (S_ISREG(stats.st_mode) == 0) {
- ERROR("%s is not a regular file", LOG_FILE);
- exit(EXIT_FAILURE);
- }
-
- /* Print the message in the log file stream. */
- fprintf(log, "%s", msg);
-
- /* Flush the log file stream. */
- if (fflush(log) == EOF)
- break;
-
- /* Print the message in the file stream. */
- fprintf(stream, "%s", msg);
-
- /* Flush the file stream. */
- if (fflush(stream) == EOF)
- break;
-
- return;
- } while (0);
-
- ERROR("%s", strerror(errno));
- exit(EXIT_FAILURE);
-}
-
/*
* EOF
*