typedef int (*initcall_t)(void);
typedef void (*exitcall_t)(void);
-#define __init __attribute__((__used__,__section__(".mad.init")))
-#define __exit __attribute__((__used__,__section__(".mad.exit")))
-
-#define module_init(fn) static __init initcall_t __init_##fn = fn;
-#define module_exit(fn) static __exit exitcall_t __exit_##fn = fn;
+void common_register_exit(exitcall_t exitcall);
+void common_init(void);
+
+#define module_init(fn) \
+ __attribute__((constructor,used)) \
+ static void __init_wrapper__ ## fn (void) { \
+ common_init(); \
+ if (fn() != 0) { \
+ exit(-1); \
+ } \
+ }
+#define module_exit(fn) \
+ __attribute__((constructor,used)) \
+ static void __exit_wrapper ## fn(void) { \
+ common_init(); \
+ common_register_exit(fn); \
+ }
#define likely(expr) __builtin_expect((expr) != 0, 1)
#define unlikely(expr) __builtin_expect((expr) != 0, 0)
: (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 __log(Level, Fmt, ...) \
+ if (log_level >= Level) { \
+ if (log_syslog) { \
+ syslog(Level, "%s" Fmt, log_state, ##__VA_ARGS__); \
+ } else { \
+ fprintf(stderr, "[%s] %s" Fmt "\n", \
+ __level_name(Level), log_state, ##__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;
+extern const char *log_state;
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);
static inline void common_startup(void)
{
signal(SIGPIPE, SIG_IGN);
- signal(SIGINT, &common_sighandler);
- signal(SIGTERM, &common_sighandler);
- signal(SIGHUP, &common_sighandler);
signal(SIGSEGV, &common_sighandler);
}