Write a postlicyd(8) man page.
[apps/pfixtools.git] / common / common.h
index 22299b7..bd5a6d6 100644 (file)
 /*     products derived from this software without specific prior written     */
 /*     permission.                                                            */
 /*                                                                            */
-/*  THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND   */
-/*  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE     */
-/*  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR        */
-/*  PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS    */
-/*  BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR    */
-/*  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF      */
-/*  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS  */
-/*  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN   */
-/*  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)   */
-/*  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF    */
-/*  THE POSSIBILITY OF SUCH DAMAGE.                                           */
+/*  THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS   */
+/*  OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED         */
+/*  WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE    */
+/*  DISCLAIMED.  IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY         */
+/*  DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL        */
+/*  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS   */
+/*  OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)     */
+/*  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,       */
+/*  STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN  */
+/*  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE           */
+/*  POSSIBILITY OF SUCH DAMAGE.                                               */
+/*                                                                            */
+/*   Copyright (c) 2006-2008 the Authors                                      */
+/*   see AUTHORS and source files for details                                 */
 /******************************************************************************/
 
 /*
 typedef int  (*initcall_t)(void);
 typedef void (*exitcall_t)(void);
 
-#define __init __attribute__((__used__,__section__(".mad.init")))
-#define __exit __attribute__((__used__,__section__(".mad.exit")))
+void common_register_exit(exitcall_t exitcall);
+void common_init(void);
 
-#define module_init(fn)  static __init initcall_t __init_##fn = fn;
-#define module_exit(fn)  static __exit exitcall_t __exit_##fn = fn;
+#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)
@@ -82,14 +97,14 @@ typedef void (*exitcall_t)(void);
   : (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__)
@@ -104,10 +119,9 @@ typedef void (*exitcall_t)(void);
 #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);
 
@@ -130,9 +144,6 @@ int common_setup(const char* pidfile, bool unsafe, const char* runas_user,
 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);
 }