forked from ports/contrib
335 lines
8.5 KiB
Diff
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
|
|
*
|