summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSander Vrijders <[email protected]>2016-07-06 18:58:56 +0200
committerSander Vrijders <[email protected]>2016-07-06 18:58:56 +0200
commit4a3e3f1b9eef457f3f216d2b2a4ccf0a32eb9599 (patch)
tree67fe25649a0258596bbbe122c19fe3a09ae2a203 /src
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
Diffstat (limited to 'src')
-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
9 files changed, 159 insertions, 15 deletions
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 <[email protected]>
+ *
+ * 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;
+}