summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSander Vrijders <sander.vrijders@intec.ugent.be>2016-07-06 18:58:56 +0200
committerSander Vrijders <sander.vrijders@intec.ugent.be>2016-07-06 18:58:56 +0200
commit4a3e3f1b9eef457f3f216d2b2a4ccf0a32eb9599 (patch)
tree67fe25649a0258596bbbe122c19fe3a09ae2a203
parent6c799af1b4cf86a32979d98034c560fb976a9caf (diff)
downloadouroboros-4a3e3f1b9eef457f3f216d2b2a4ccf0a32eb9599.tar.gz
ouroboros-4a3e3f1b9eef457f3f216d2b2a4ccf0a32eb9599.zip
lib, irmd, ipcpd: Provide the feature to write to logs
Writing output to log files is now enabled by default. Logs are written to <INSTALL_PREFIX>/var/log/ouroboros, which is created on install. There is a log file for the irmd and one per IPCP. To still get (colored) output on stdout, provide the --stdout switch when starting the irmd. Fixes #17
-rw-r--r--CMakeLists.txt4
-rw-r--r--include/ouroboros/config.h.in1
-rw-r--r--include/ouroboros/logs.h47
-rw-r--r--src/ipcpd/ipcp.c39
-rw-r--r--src/ipcpd/ipcp.h2
-rw-r--r--src/ipcpd/local/main.c6
-rw-r--r--src/ipcpd/shim-eth-llc/main.c4
-rw-r--r--src/ipcpd/shim-udp/main.c6
-rw-r--r--src/irmd/main.c68
-rw-r--r--src/lib/CMakeLists.txt1
-rw-r--r--src/lib/ipcp.c12
-rw-r--r--src/lib/logs.c36
12 files changed, 197 insertions, 29 deletions
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ba900645..7404eeb4 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -55,6 +55,10 @@ install(FILES "${CMAKE_CURRENT_BINARY_DIR}/ouroboros.pc"
enable_testing()
add_custom_target(check COMMAND ${CMAKE_CTEST_COMMAND})
+# Log directory
+set(LOG_DIR "var/log/ouroboros")
+install(DIRECTORY DESTINATION ${LOG_DIR})
+
add_subdirectory(src)
add_subdirectory(include)
diff --git a/include/ouroboros/config.h.in b/include/ouroboros/config.h.in
index 4cbed554..c11c2d05 100644
--- a/include/ouroboros/config.h.in
+++ b/include/ouroboros/config.h.in
@@ -44,5 +44,6 @@
#define IRMD_MAX_FLOWS 4096
#define IRMD_THREADPOOL_SIZE 3
#define IRMD_FLOW_TIMEOUT 5000 /* ms */
+#define LOG_DIR "/@LOG_DIR@/"
#endif
diff --git a/include/ouroboros/logs.h b/include/ouroboros/logs.h
index 344a7ddc..601d8340 100644
--- a/include/ouroboros/logs.h
+++ b/include/ouroboros/logs.h
@@ -30,32 +30,51 @@
#error You must define OUROBOROS_PREFIX before including this file
#endif
+int set_logfile(char * filename);
+
#define ANSI_COLOR_RED "\x1b[31m"
#define ANSI_COLOR_GREEN "\x1b[32m"
#define ANSI_COLOR_YELLOW "\x1b[33m"
#define ANSI_COLOR_BLUE "\x1b[34m"
#define ANSI_COLOR_RESET "\x1b[0m"
-#define __LOG(CLR, PFX, LVL, FMT, ARGS...) \
- do { printf(CLR PFX "(" LVL "): " FMT ANSI_COLOR_RESET "\n", ##ARGS); }\
- while (0)
+#define DEBUG_CODE "DB"
+#define ERROR_CODE "EE"
+#define WARN_CODE "WW"
+#define INFO_CODE "II"
+#define IMPL_CODE "NI"
+
+extern FILE * logfile;
+
+#define __LOG(CLR, LVL, FMT, ARGS...) \
+ do { \
+ if (logfile != NULL) { \
+ fprintf(logfile, \
+ OUROBOROS_PREFIX "(" LVL "): " \
+ FMT ANSI_COLOR_RESET "\n", ##ARGS); \
+ fflush(logfile); \
+ } else { \
+ printf(CLR OUROBOROS_PREFIX "(" LVL "): " \
+ FMT ANSI_COLOR_RESET "\n", ##ARGS); \
+ } \
+ } while (0)
-#define LOG_ERR(FMT, ARGS...) __LOG(ANSI_COLOR_RED, OUROBOROS_PREFIX, \
- "EE", FMT, ##ARGS)
-#define LOG_WARN(FMT, ARGS...) __LOG(ANSI_COLOR_YELLOW, OUROBOROS_PREFIX, \
- "WW", FMT, ##ARGS)
-#define LOG_INFO(FMT, ARGS...) __LOG(ANSI_COLOR_GREEN, OUROBOROS_PREFIX, \
- "II", FMT, ##ARGS)
-#define LOG_NI(FMT, ARGS...) __LOG(ANSI_COLOR_BLUE, OUROBOROS_PREFIX, \
- "NI", FMT, ##ARGS)
+#define LOG_ERR(FMT, ARGS...) __LOG(ANSI_COLOR_RED, \
+ ERROR_CODE, FMT, ##ARGS)
+#define LOG_WARN(FMT, ARGS...) __LOG(ANSI_COLOR_YELLOW, \
+ WARN_CODE, FMT, ##ARGS)
+#define LOG_INFO(FMT, ARGS...) __LOG(ANSI_COLOR_GREEN, \
+ INFO_CODE, FMT, ##ARGS)
+#define LOG_NI(FMT, ARGS...) __LOG(ANSI_COLOR_BLUE, \
+ IMPL_CODE, FMT, ##ARGS)
#ifdef CONFIG_OUROBOROS_DEBUG
-#define LOG_DBG(FMT, ARGS...) __LOG("", OUROBOROS_PREFIX, "DB", FMT, ##ARGS)
+#define LOG_DBG(FMT, ARGS...) __LOG("", DEBUG_CODE, FMT, ##ARGS)
#else
-#define LOG_DBG(FMT, ARGS...) do { } while (0)
+#define LOG_DBG(FMT, ARGS...) do { } while (0)
#endif
-#define LOG_DBGF(FMT, ARGS...) LOG_DBG("%s: " FMT, __FUNCTION__, ##ARGS)
+#define LOG_DBGF(FMT, ARGS...) LOG_DBG("%s: " FMT, __FUNCTION__, ##ARGS)
#define LOG_MISSING LOG_NI("Missing code in %s:%d",__FILE__, __LINE__)
diff --git a/src/ipcpd/ipcp.c b/src/ipcpd/ipcp.c
index 579203c2..28004a92 100644
--- a/src/ipcpd/ipcp.c
+++ b/src/ipcpd/ipcp.c
@@ -22,13 +22,15 @@
#include <ouroboros/config.h>
#include <ouroboros/ipcp.h>
-#include <sys/socket.h>
-#include <stdlib.h>
-#include "ipcp.h"
#define OUROBOROS_PREFIX "ipcpd/ipcp"
#include <ouroboros/logs.h>
+#include <string.h>
+#include <sys/socket.h>
+#include <stdlib.h>
+#include "ipcp.h"
+
struct ipcp * ipcp_instance_create()
{
struct ipcp * i = malloc(sizeof *i);
@@ -45,15 +47,42 @@ struct ipcp * ipcp_instance_create()
return i;
}
-int ipcp_arg_check(int argc, char * argv[])
+int ipcp_parse_arg(int argc, char * argv[])
{
- if (argc != 2)
+ char * log_file;
+ size_t len = 0;
+
+ if (!(argc == 3 || argc == 2))
return -1;
/* argument 1: api of irmd */
if (atoi(argv[1]) == 0)
return -1;
+ if (argv[2] == NULL)
+ return 0;
+
+ len += strlen(INSTALL_PREFIX);
+ len += strlen(LOG_DIR);
+ len += strlen(argv[2]);
+
+ log_file = malloc(len + 1);
+ if (log_file == NULL) {
+ LOG_ERR("Failed to malloc");
+ return -1;
+ }
+
+ strcpy(log_file, INSTALL_PREFIX);
+ strcat(log_file, LOG_DIR);
+ strcat(log_file, argv[2]);
+ log_file[len] = '\0';
+
+ if (set_logfile(log_file))
+ LOG_ERR("Cannot open %s, falling back to stdout for logs.",
+ log_file);
+
+ free(log_file);
+
return 0;
}
diff --git a/src/ipcpd/ipcp.h b/src/ipcpd/ipcp.h
index 27c3cf8e..bbf1d1f7 100644
--- a/src/ipcpd/ipcp.h
+++ b/src/ipcpd/ipcp.h
@@ -50,6 +50,6 @@ struct ipcp {
struct ipcp * ipcp_instance_create();
void * ipcp_main_loop(void * o);
void * ipcp_sdu_loop(void * o);
-int ipcp_arg_check(int argc, char * argv[]);
+int ipcp_parse_arg(int argc, char * argv[]);
#endif
diff --git a/src/ipcpd/local/main.c b/src/ipcpd/local/main.c
index 4802a161..c705f74c 100644
--- a/src/ipcpd/local/main.c
+++ b/src/ipcpd/local/main.c
@@ -573,7 +573,7 @@ static struct ipcp * ipcp_local_create()
#ifndef MAKE_CHECK
-int main (int argc, char * argv[])
+int main(int argc, char * argv[])
{
struct sigaction sig_act;
sigset_t sigset;
@@ -583,8 +583,8 @@ int main (int argc, char * argv[])
sigaddset(&sigset, SIGHUP);
sigaddset(&sigset, SIGPIPE);
- if (ipcp_arg_check(argc, argv)) {
- LOG_ERR("Wrong arguments.");
+ if (ipcp_parse_arg(argc, argv)) {
+ LOG_ERR("Failed to parse arguments.");
exit(1);
}
diff --git a/src/ipcpd/shim-eth-llc/main.c b/src/ipcpd/shim-eth-llc/main.c
index 68e7e933..ba912829 100644
--- a/src/ipcpd/shim-eth-llc/main.c
+++ b/src/ipcpd/shim-eth-llc/main.c
@@ -1245,8 +1245,8 @@ int main(int argc, char * argv[])
sigaddset(&sigset, SIGHUP);
sigaddset(&sigset, SIGPIPE);
- if (ipcp_arg_check(argc, argv)) {
- LOG_ERR("Wrong arguments.");
+ if (ipcp_parse_arg(argc, argv)) {
+ LOG_ERR("Failed to parse arguments.");
exit(1);
}
diff --git a/src/ipcpd/shim-udp/main.c b/src/ipcpd/shim-udp/main.c
index 9354ec2f..b0fe1c11 100644
--- a/src/ipcpd/shim-udp/main.c
+++ b/src/ipcpd/shim-udp/main.c
@@ -1557,7 +1557,7 @@ static struct ipcp * ipcp_udp_create()
#ifndef MAKE_CHECK
-int main (int argc, char * argv[])
+int main(int argc, char * argv[])
{
struct sigaction sig_act;
sigset_t sigset;
@@ -1567,8 +1567,8 @@ int main (int argc, char * argv[])
sigaddset(&sigset, SIGHUP);
sigaddset(&sigset, SIGPIPE);
- if (ipcp_arg_check(argc, argv)) {
- LOG_ERR("Wrong arguments.");
+ if (ipcp_parse_arg(argc, argv)) {
+ LOG_ERR("Failed to parse arguments.");
exit(1);
}
diff --git a/src/irmd/main.c b/src/irmd/main.c
index de100cf8..ddce2d61 100644
--- a/src/irmd/main.c
+++ b/src/irmd/main.c
@@ -50,6 +50,8 @@
#include <limits.h>
#include <pthread.h>
#include <sys/stat.h>
+#include <dirent.h>
+#include <getopt.h>
#define IRMD_CLEANUP_TIMER ((IRMD_FLOW_TIMEOUT / 20) * MILLION) /* ns */
@@ -1707,17 +1709,81 @@ static struct irm * irm_create()
return instance;
}
-int main()
+static void usage()
+{
+ LOG_ERR("Usage: irmd \n\n"
+ " [--stdout (Print to stdout instead of logs)]\n");
+}
+
+int main(int argc, char ** argv)
{
struct sigaction sig_act;
int t = 0;
+ char * log_file = INSTALL_PREFIX LOG_DIR "irmd.log";
+ DIR * log_dir;
+ struct dirent * ent;
+ char * point;
+ char * log_path;
+ size_t len = 0;
+ bool use_stdout = false;
+
if (geteuid() != 0) {
LOG_ERR("IPC Resource Manager must be run as root.");
exit(EXIT_FAILURE);
}
+ argc--;
+ argv++;
+ while (argc > 0) {
+ if (strcmp(*argv, "--stdout") == 0) {
+ use_stdout = true;
+ argc--;
+ argv++;
+ } else {
+ usage();
+ exit(EXIT_FAILURE);
+ }
+ }
+
+
+ if (!use_stdout &&
+ (log_dir = opendir(INSTALL_PREFIX LOG_DIR)) != NULL) {
+ while ((ent = readdir(log_dir)) != NULL) {
+ point = strrchr(ent->d_name,'.');
+ if (point == NULL ||
+ strcmp(point, ".log") != 0)
+ continue;
+
+ len += strlen(INSTALL_PREFIX);
+ len += strlen(LOG_DIR);
+ len += strlen(ent->d_name);
+
+ log_path = malloc(len + 1);
+ if (log_path == NULL) {
+ LOG_ERR("Failed to malloc");
+ exit(EXIT_FAILURE);
+ }
+
+ strcpy(log_path, INSTALL_PREFIX);
+ strcat(log_path, LOG_DIR);
+ strcat(log_path, ent->d_name);
+
+ unlink(log_path);
+
+ free(log_path);
+ len = 0;
+ }
+ closedir(log_dir);
+ }
+
+ if (!use_stdout)
+ if (set_logfile(log_file))
+ LOG_ERR("Cannot open %s, falling back to "
+ "stdout for logs.",
+ log_file);
+
/* init sig_act */
memset(&sig_act, 0, sizeof sig_act);
diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt
index 57f44f15..9c45269c 100644
--- a/src/lib/CMakeLists.txt
+++ b/src/lib/CMakeLists.txt
@@ -31,6 +31,7 @@ set(SOURCE_FILES
ipcp.c
irm.c
list.c
+ logs.c
nsm.c
shm_ap_rbuff.c
shm_du_map.c
diff --git a/src/lib/ipcp.c b/src/lib/ipcp.c
index e4a82b60..5d46940d 100644
--- a/src/lib/ipcp.c
+++ b/src/lib/ipcp.c
@@ -109,6 +109,7 @@ pid_t ipcp_create(enum ipcp_type ipcp_type)
char * ipcp_dir = "/sbin/";
char * full_name = NULL;
char * exec_name = NULL;
+ char * log_file = NULL;
sprintf(irmd_api, "%u", getpid());
@@ -149,8 +150,19 @@ pid_t ipcp_create(enum ipcp_type ipcp_type)
strcat(full_name, exec_name);
full_name[len] = '\0';
+ if (logfile != NULL) {
+ log_file = malloc(20);
+ if (log_file == NULL) {
+ LOG_ERR("Failed to malloc.");
+ exit(EXIT_FAILURE);
+ }
+ sprintf(log_file, "ipcpd-%u.log", getpid());
+ }
+
+ /* log_file to be placed at the end */
char * argv[] = {full_name,
irmd_api,
+ log_file,
0};
char * envp[] = {0};
diff --git a/src/lib/logs.c b/src/lib/logs.c
new file mode 100644
index 00000000..d86073e4
--- /dev/null
+++ b/src/lib/logs.c
@@ -0,0 +1,36 @@
+/*
+ * Ouroboros - Copyright (C) 2016
+ *
+ * Logging facilities
+ *
+ * Sander Vrijders <sander.vrijders@intec.ugent.be>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#define OUROBOROS_PREFIX "logging"
+
+#include <ouroboros/logs.h>
+
+FILE * logfile = NULL;
+
+int set_logfile(char * filename)
+{
+ logfile = fopen(filename, "w");
+ if (logfile == NULL)
+ return -1;
+
+ return 0;
+}