diff --git a/src/Makefile.am b/src/Makefile.am index 85991c6d..011c0f4c 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -16,6 +16,7 @@ finit_SOURCES = api.c \ exec.c finit.c finit.h \ getty.c \ helpers.c helpers.h \ + log.c log.h \ mdadm.c mount.c pid.c \ plugin.c plugin.h private.h \ service.c service.h \ diff --git a/src/helpers.c b/src/helpers.c index f38321db..e97dade0 100644 --- a/src/helpers.c +++ b/src/helpers.c @@ -139,44 +139,6 @@ int print_result(int fail) return fail; } -/* - * Log to /dev/kmsg until syslogd has started, then openlog() - * and continue logging as a regular daemon. - */ -void logit(int prio, const char *fmt, ...) -{ - va_list ap; - - va_start(ap, fmt); - if (!_slup && !fexist("/dev/log")) { - FILE *fp; - - fp = fopen("/dev/kmsg", "w"); - if (fp) { - if (debug) - prio = LOG_ERR; - - fprintf(fp, "<%d>finit[1]:", LOG_DAEMON | prio); - vfprintf(fp, fmt, ap); - fclose(fp); - } else { - fprintf(stderr, "Failed opening /dev/kmsg for appending ...\n"); - if (debug || prio <= LOG_ERR) - vfprintf(stderr, fmt, ap); - } - va_end(ap); - return; - } - - if (!_slup) { - openlog("finit", LOG_PID, LOG_DAEMON); - _slup = 1; - } - - vsyslog(prio, fmt, ap); - va_end(ap); -} - int getuser(char *username, char **home) { #ifdef ENABLE_STATIC diff --git a/src/helpers.h b/src/helpers.h index db160195..16408434 100644 --- a/src/helpers.h +++ b/src/helpers.h @@ -25,49 +25,9 @@ #ifndef FINIT_HELPERS_H_ #define FINIT_HELPERS_H_ -#include -#include -#include /* strerror() */ -#include #include #include - -/* - * Error and debug messages - * - * Use of logit() is preferred, but these are guaranteed to display on - * /dev/console as well. Useful for critical errors and early debug. - */ -#define _l(prio, fmt, args...) do { if (_slup) warnx(fmt, ##args); logit(prio, fmt "\n", ##args); } while (0) -#define _m(prio, fmt, args...) do { _l(prio, "%s() - " fmt, __func__, ##args); } while (0) -#define _d(fmt, args...) do { if (debug) { _m(LOG_DEBUG, fmt, ##args); } } while (0) -#define _w(fmt, args...) do { _m(LOG_WARNING, fmt, ##args); } while (0) -#define _e(fmt, args...) do { _m(LOG_ERR, fmt, ##args); } while (0) -#define _pe(fmt, args...) do { _m(LOG_ERR, fmt ". Error %d: %s", ##args, errno, strerror(errno)); } while (0) - -extern int _slup; /* INTERNAL: Is syslog up yet? */ - -char *strip_line (char *line); - -int pid_alive (pid_t pid); -char *pid_get_name (pid_t pid, char *name, size_t len); - -void print (int action, const char *fmt, ...); -void print_desc (char *action, char *desc); -int print_result (int fail); - -void logit (int prio, const char *fmt, ...); - -int start_process (char *cmd, char *args[], int console); -int getuser (char *username, char **home); -int getgroup (char *group); -void set_hostname (char **hostname); - -int complete (char *cmd, int pid); -int run (char *cmd); -int run_interactive (char *cmd, char *fmt, ...); -pid_t run_getty (char *tty, char *speed, char *term, int console); -int run_parts (char *dir, char *cmd); +#include "log.h" #ifndef HAVE_GETFSENT struct fstab { @@ -80,11 +40,31 @@ struct fstab { int fs_passno; /* pass number on parallel dump */ }; -int setfsent(void); -void endfsent(void); -struct fstab *getfsent(void); +int setfsent (void); +void endfsent (void); +struct fstab *getfsent (void); #endif /* HAVE_GETFSENT */ +char *strip_line (char *line); + +int pid_alive (pid_t pid); +char *pid_get_name (pid_t pid, char *name, size_t len); + +void print (int action, const char *fmt, ...); +void print_desc (char *action, char *desc); +int print_result (int fail); + +int start_process (char *cmd, char *args[], int console); +int getuser (char *username, char **home); +int getgroup (char *group); +void set_hostname (char **hostname); + +int complete (char *cmd, int pid); +int run (char *cmd); +int run_interactive (char *cmd, char *fmt, ...); +pid_t run_getty (char *tty, char *speed, char *term, int console); +int run_parts (char *dir, char *cmd); + static inline void create(char *path, mode_t mode, uid_t uid, gid_t gid) { if (touch(path) || chmod(path, mode) || chown(path, uid, gid)) diff --git a/src/log.c b/src/log.c new file mode 100644 index 00000000..c3e1b026 --- /dev/null +++ b/src/log.c @@ -0,0 +1,75 @@ +/* Finit daemon log functions + * + * Copyright (c) 2008-2017 Joachim Nilsson + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#include +#include +#include + +#include "finit.h" +#include "log.h" + + +/* + * Log to /dev/kmsg until syslogd has started, then openlog() + * and continue logging as a regular daemon. + */ +void logit(int prio, const char *fmt, ...) +{ + va_list ap; + + va_start(ap, fmt); + if (!_slup && !fexist("/dev/log")) { + FILE *fp; + + fp = fopen("/dev/kmsg", "w"); + if (fp) { + if (debug) + prio = LOG_ERR; + + fprintf(fp, "<%d>finit[1]:", LOG_DAEMON | prio); + vfprintf(fp, fmt, ap); + fclose(fp); + } else { + fprintf(stderr, "Failed opening /dev/kmsg for appending ...\n"); + if (debug || prio <= LOG_ERR) + vfprintf(stderr, fmt, ap); + } + va_end(ap); + return; + } + + if (!_slup) { + openlog("finit", LOG_PID, LOG_DAEMON); + _slup = 1; + } + + vsyslog(prio, fmt, ap); + va_end(ap); +} + +/** + * Local Variables: + * indent-tabs-mode: t + * c-file-style: "linux" + * End: + */ diff --git a/src/log.h b/src/log.h new file mode 100644 index 00000000..515244df --- /dev/null +++ b/src/log.h @@ -0,0 +1,48 @@ +/* Finit daemon log functions + * + * Copyright (c) 2008-2017 Joachim Nilsson + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef FINIT_LOG_H_ +#define FINIT_LOG_H_ + +#include +#include /* strerror() */ +#include + +/* + * Error and debug messages + * + * Use of logit() is preferred, but these are guaranteed to display on + * /dev/console as well. Useful for critical errors and early debug. + */ +#define _l(prio, fmt, args...) do { if (_slup) warnx(fmt, ##args); logit(prio, fmt "\n", ##args); } while (0) +#define _m(prio, fmt, args...) do { _l(prio, "%s() - " fmt, __func__, ##args); } while (0) +#define _d(fmt, args...) do { if (debug) { _m(LOG_DEBUG, fmt, ##args); } } while (0) +#define _w(fmt, args...) do { _m(LOG_WARNING, fmt, ##args); } while (0) +#define _e(fmt, args...) do { _m(LOG_ERR, fmt, ##args); } while (0) +#define _pe(fmt, args...) do { _m(LOG_ERR, fmt ". Error %d: %s", ##args, errno, strerror(errno)); } while (0) + +extern int _slup; /* INTERNAL: Is syslog up yet? */ + +void logit (int prio, const char *fmt, ...); + +#endif /* FINIT_LOG_H_ */