#include "mem.h"
-
#define __tostr(x) #x
#define STR(x) __tostr(x)
#define module_init(fn) static __init initcall_t __init_##fn = fn;
#define module_exit(fn) static __exit exitcall_t __exit_##fn = fn;
+#define likely(expr) __builtin_expect((expr) != 0, 1)
+#define unlikely(expr) __builtin_expect((expr) != 0, 0)
+
+#define __level_name(L) \
+ ( (L) == LOG_DEBUG ? "debug " \
+ : (L) == LOG_NOTICE ? "notice" \
+ : (L) == LOG_INFO ? "info " \
+ : (L) == LOG_WARNING ? "warn " \
+ : (L) == LOG_ERR ? "error " \
+ : (L) == LOG_CRIT ? "crit " \
+ : (L) == LOG_ALERT ? "alert " \
+ : "??? " )
+
#define __log(Level, Fmt, ...) \
if (log_level >= Level) { \
- syslog(Level, Fmt, ##__VA_ARGS__); \
+ if (log_syslog) { \
+ syslog(Level, Fmt, ##__VA_ARGS__); \
+ } else { \
+ fprintf(stderr, "[%s] " Fmt "\n", \
+ __level_name(Level), ##__VA_ARGS__); \
+ } \
}
#define debug(Fmt, ...) __log(LOG_DEBUG, Fmt, ##__VA_ARGS__)
#define UNIXERR(fun) err("%s:%d:%s %s: %m", \
__FILE__, __LINE__, __func__, fun)
-extern sig_atomic_t sigint;
-extern sig_atomic_t sighup;
extern int log_level;
+extern bool log_syslog;
void common_sighandler(int sig);
+int setnonblock(int sock);
int tcp_bind(const struct sockaddr *addr, socklen_t len);
int tcp_listen(const struct sockaddr *addr, socklen_t len);
int tcp_listen_nonblock(const struct sockaddr *addr, socklen_t len);
int common_setup(const char* pidfile, bool unsafe, const char* runas_user,
const char* runas_group, bool daemonize);
+static inline void common_startup(void)
+{
+ signal(SIGPIPE, SIG_IGN);
+ signal(SIGSEGV, &common_sighandler);
+}
+
+
#define DECLARE_MAIN \
static int main_initialize(void) \
{ \
+ log_syslog = true; \
openlog(DAEMON_NAME, LOG_PID, LOG_MAIL); \
- signal(SIGPIPE, SIG_IGN); \
- signal(SIGINT, &common_sighandler); \
- signal(SIGTERM, &common_sighandler); \
- signal(SIGHUP, &common_sighandler); \
- signal(SIGSEGV, &common_sighandler); \
- info("starting..."); \
+ common_startup(); \
return 0; \
} \
\