X-Git-Url: http://git.madism.org/?a=blobdiff_plain;f=common%2Fcommon.h;fp=common%2Fcommon.h;h=9b86f09324271972f8c35290899fb8abd65b3f28;hb=8977d252fc44ae953df4bde4a2f1c5895beea4e0;hp=0000000000000000000000000000000000000000;hpb=063fa644df8a1bc2f0d76027dae5d7d0d8ce4f47;p=apps%2Fpfixtools.git diff --git a/common/common.h b/common/common.h new file mode 100644 index 0000000..9b86f09 --- /dev/null +++ b/common/common.h @@ -0,0 +1,117 @@ +/******************************************************************************/ +/* pfixtools: a collection of postfix related tools */ +/* ~~~~~~~~~ */ +/* ________________________________________________________________________ */ +/* */ +/* Redistribution and use in source and binary forms, with or without */ +/* modification, are permitted provided that the following conditions */ +/* are met: */ +/* */ +/* 1. Redistributions of source code must retain the above copyright */ +/* notice, this list of conditions and the following disclaimer. */ +/* 2. Redistributions in binary form must reproduce the above copyright */ +/* notice, this list of conditions and the following disclaimer in the */ +/* documentation and/or other materials provided with the distribution. */ +/* 3. The names of its contributors may not be used to endorse or promote */ +/* 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. */ +/******************************************************************************/ + +/* + * Copyright © 2007 Pierre Habouzit + * Copyright © 2008 Florent Bruneau + */ + +#ifndef PFIXTOOLS_COMMON_H +#define PFIXTOOLS_COMMON_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#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) + +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; + +extern sig_atomic_t sigint; +extern sig_atomic_t sighup; + +void common_sighandler(int sig); + +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 accept_nonblock(int fd); +int xwrite(int fd, const char *s, size_t l); + +int daemon_detach(void); +int drop_privileges(const char *user, const char *group); + +int pidfile_open(const char *name); +int pidfile_refresh(void); + +int common_setup(const char* pidfile, bool unsafe, const char* runas_user, + const char* runas_group, bool daemonize); + +#define DECLARE_MAIN \ + static int main_initialize(void) \ + { \ + 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..."); \ + return 0; \ + } \ + \ + static void main_shutdown(void) \ + { \ + closelog(); \ + } \ + \ + module_init(main_initialize); \ + module_exit(main_shutdown); + +#endif