tools_kmod_SOURCES = tools/kmod.c tools/kmod.h tools/lsmod.c \
tools/rmmod.c tools/insmod.c \
tools/modinfo.c tools/modprobe.c \
- tools/depmod.c tools/log.h
+ tools/depmod.c tools/log.h tools/log.c
tools_kmod_LDADD = libkmod/libkmod-util.la \
libkmod/libkmod.la
--- /dev/null
+/*
+ * kmod - log infrastructure
+ *
+ * Copyright (C) 2012 ProFUSION embedded systems
+ *
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <syslog.h>
+
+#include "kmod.h"
+
+static bool log_use_syslog;
+
+void log_open(bool use_syslog)
+{
+ log_use_syslog = use_syslog;
+
+ if (log_use_syslog)
+ openlog(binname, LOG_CONS, LOG_DAEMON);
+}
+
+void log_close(void)
+{
+ if (log_use_syslog)
+ closelog();
+}
+
+void log_kmod(void *data, int priority, const char *file, int line,
+ const char *fn, const char *format, va_list args)
+{
+ const char *prioname = prio_to_str(priority);
+ char *str;
+
+ if (vasprintf(&str, format, args) < 0)
+ return;
+
+ if (log_use_syslog) {
+#ifdef ENABLE_DEBUG
+ syslog(priority, "%s: %s:%d %s() %s", prioname, file, line,
+ fn, str);
+#else
+ syslog(priority, "%s: %s", prioname, str);
+#endif
+ } else {
+#ifdef ENABLE_DEBUG
+ fprintf(stderr, "%s: %s: %s:%d %s() %s", binname, prioname,
+ file, line, fn, str);
+#else
+ fprintf(stderr, "%s: %s: %s", binname, prioname, str);
+#endif
+ }
+
+ free(str);
+ (void)data;
+}
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
+#include <stdbool.h>
#include <stdio.h>
#include <syslog.h>
#include "kmod.h"
+void log_open(bool use_syslog);
+void log_close(void);
+void log_kmod(void *data, int priority, const char *file, int line,
+ const char *fn, const char *format, va_list args);
+
_always_inline_ const char *prio_to_str(int prio);
+/* inline functions */
+
_always_inline_ const char *prio_to_str(int prio)
{
const char *prioname;
va_end(args);
}
-static void log_modprobe(void *data, int priority, const char *file, int line,
- const char *fn, const char *format, va_list args)
-{
- const char *prioname = prio_to_str(priority);
- char *str;
-
- if (vasprintf(&str, format, args) < 0)
- return;
-
- if (use_syslog > 1) {
-#ifdef ENABLE_DEBUG
- syslog(priority, "%s: %s:%d %s() %s", prioname, file, line,
- fn, str);
-#else
- syslog(priority, "%s: %s", prioname, str);
-#endif
- } else {
-#ifdef ENABLE_DEBUG
- fprintf(stderr, "modprobe: %s: %s:%d %s() %s", prioname, file,
- line, fn, str);
-#else
- fprintf(stderr, "modprobe: %s: %s", prioname, str);
-#endif
- }
-
- free(str);
- (void)data;
-}
-
static void _log(int prio, const char *fmt, ...)
{
const char *prioname;
prioname = prio_to_str(prio);
- if (use_syslog > 1)
+ if (use_syslog)
syslog(prio, "%s: %s", prioname, msg);
else
fprintf(stderr, "modprobe: %s: %s", prioname, msg);
args = argv + optind;
nargs = argc - optind;
- if (use_syslog) {
- openlog("modprobe", LOG_CONS, LOG_DAEMON);
- use_syslog++;
- }
+ log_open(use_syslog);
if (!do_show_config) {
if (nargs == 0) {
}
kmod_set_log_priority(ctx, verbose);
- kmod_set_log_fn(ctx, log_modprobe, NULL);
+ kmod_set_log_fn(ctx, log_kmod, NULL);
kmod_load_resources(ctx);
kmod_unref(ctx);
done:
- if (use_syslog > 1)
- closelog();
+ log_close();
if (argv != orig_argv)
free(argv);
binname);
}
-static void log_rmmod(void *data, int priority, const char *file, int line,
- const char *fn, const char *format, va_list args)
-{
- const char *prioname = prio_to_str(priority);
- char *str;
-
- if (vasprintf(&str, format, args) < 0)
- return;
-
- if (use_syslog > 1) {
-#ifdef ENABLE_DEBUG
- syslog(priority, "%s: %s:%d %s() %s", prioname, file, line,
- fn, str);
-#else
- syslog(priority, "%s: %s", prioname, str);
-#endif
- } else {
-#ifdef ENABLE_DEBUG
- fprintf(stderr, "rmmod: %s: %s:%d %s() %s", prioname, file,
- line, fn, str);
-#else
- fprintf(stderr, "rmmod: %s: %s", prioname, str);
-#endif
- }
-
- free(str);
- (void)data;
-}
-
static void _log(int prio, const char *fmt, ...)
{
const char *prioname;
prioname = prio_to_str(prio);
- if (use_syslog > 1)
+ if (use_syslog)
syslog(prio, "%s: %s", prioname, msg);
else
fprintf(stderr, "rmmod: %s: %s", prioname, msg);
}
}
- if (use_syslog) {
- openlog("rmmod", LOG_CONS, LOG_DAEMON);
- use_syslog++;
- }
+ log_open(use_syslog);
if (optind >= argc) {
ERR("missing module name.\n");
}
kmod_set_log_priority(ctx, kmod_get_log_priority(ctx));
- kmod_set_log_fn(ctx, log_rmmod, NULL);
+ kmod_set_log_fn(ctx, log_kmod, NULL);
for (i = optind; i < argc; i++) {
struct kmod_module *mod;
kmod_unref(ctx);
done:
- if (use_syslog > 1)
- closelog();
+ log_close();
return r == 0 ? EXIT_SUCCESS : EXIT_FAILURE;
}