Switch to libev.
[apps/pfixtools.git] / common / common.h
index 9b86f09..e2f2b3b 100644 (file)
 
 #include "mem.h"
 
-#define UNIXERR(fun)                                    \
-        syslog(LOG_ERR, "%s:%d:%s: %s: %m",             \
-               __FILE__, __LINE__, __func__, fun)
-
 #define __tostr(x)  #x
 #define STR(x)      __tostr(x)
 
@@ -73,11 +69,47 @@ typedef void (*exitcall_t)(void);
 #define module_init(fn)  static __init initcall_t __init_##fn = fn;
 #define module_exit(fn)  static __exit exitcall_t __exit_##fn = fn;
 
-extern sig_atomic_t sigint;
-extern sig_atomic_t sighup;
+#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) {                                     \
+        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 notice(Fmt, ...) __log(LOG_NOTICE,  Fmt, ##__VA_ARGS__)
+#define info(Fmt, ...)   __log(LOG_INFO,    Fmt, ##__VA_ARGS__)
+#define warn(Fmt, ...)   __log(LOG_WARNING, Fmt, ##__VA_ARGS__)
+#define err(Fmt, ...)    __log(LOG_ERR,     Fmt, ##__VA_ARGS__)
+#define crit(Fmt, ...)   __log(LOG_CRIT,    Fmt, ##__VA_ARGS__)
+#define alert(Fmt, ...)  __log(LOG_ALERT,   Fmt, ##__VA_ARGS__)
+#define emerg(Fmt, ...)  __log(LOG_ALERT,   Fmt, ##__VA_ARGS__)
+
+#define UNIXERR(fun)     err("%s:%d:%s %s: %m",                      \
+                             __FILE__, __LINE__, __func__, fun)
+
+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);
@@ -93,16 +125,19 @@ int pidfile_refresh(void);
 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);                      \
-        syslog(LOG_INFO, "Starting...");                          \
+        common_startup();                                         \
         return 0;                                                 \
     }                                                             \
                                                                   \