summaryrefslogtreecommitdiff
path: root/support/dktools/dk4dmt.h
diff options
context:
space:
mode:
Diffstat (limited to 'support/dktools/dk4dmt.h')
-rw-r--r--support/dktools/dk4dmt.h135
1 files changed, 135 insertions, 0 deletions
diff --git a/support/dktools/dk4dmt.h b/support/dktools/dk4dmt.h
new file mode 100644
index 0000000000..b2a1059b5c
--- /dev/null
+++ b/support/dktools/dk4dmt.h
@@ -0,0 +1,135 @@
+/*
+ WARNING: This file was generated by dkct.
+ Changes you make here will be lost if dkct is run again!
+ You should modify the original source and run dkct on it.
+ Original source: dk4dmt.ctr
+*/
+
+/*
+Copyright (C) 2016-2017, Dirk Krause
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+* Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+* Redistributions in binary form must reproduce the above opyright notice,
+ this list of conditions and the following disclaimer in the documentation
+ and/or other materials provided with the distribution.
+* Neither the name of the author nor the names of contributors may be used
+ to endorse or promote products derived from this software without specific
+ prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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.
+*/
+
+#ifndef DK4DMT_H_INCLUDED
+/** Avoid multiple inclusions. */
+#define DK4DMT_H_INCLUDED 1
+
+
+#line 8 "dk4dmt.ctr"
+
+/** @file dk4dmt.h Daemon tools.
+
+The functions in this module can be used in standing daemons.
+
+In the original process, call the
+dk4dmt_parent_before_fork() function to close all file descriptors
+above 2, reset all signal handlers to defaults, unblock all signals
+and check whether a PID file already exists.
+If you plan to give up root privileges in the child processes
+(use setgid() and setuid() to change effective user and group),
+do not use /var/run/<i>program</i>.pid as PID file name, better
+use /var/run/<i>program</i>/<i>program</i>.pid instead and make
+sure to set ownership and group on /var/run/<i>program</i>
+to the unprivileged user and group used by the child process.
+User and group need write permission to the directory, so the unprivileged
+child process can remove the PID file when exiting.
+
+In the intermediate process after the first fork call
+dk4dmt_intermediate_before_fork(). Among other things this function
+completely decouples the process from the terminal.
+
+In the final process (after forking again) call
+dk4dmt_daemon_after_fork()
+to set up things before starting service. This function creates the PID
+file, connects file descriptors 0, 1 and 2 to /dev/null, resets
+the umask and changes into the / directory.
+
+After finishing service call
+dk4dmt_daemon_end() before exiting. This function removes the PID
+file.
+*/
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Activities in parent process before calling fork().
+ * Close all file descriptors above 2.
+ * Reset all signal actions to default handlers.
+ * Unblock all signals.
+ * Check whether PID file already exists.
+ Use this function to check whether the initial process
+ can run fork().
+ @param prgname Program name.
+ @param pidfilename PID file name.
+ @param logstderr Flag: Logging to stderr allowed.
+ @param slf Syslog feature.
+ @return 1 on success (can call fork), 0 on error (abort).
+*/
+int
+dk4dmt_parent_before_fork(
+ const char *prgname, const char *pidfilename, int logstderr, int slf
+);
+
+
+/** Activities in first child before calling fork() again.
+ * Decouple completely from terminal.
+ Use this function to check whether the first child process
+ can run fork() again.
+ @param prgname Program name.
+ @param slf Syslog feature.
+ @return 1 on success (can call fork), 0 on error (abort).
+*/
+int
+dk4dmt_intermediate_before_fork(const char *prgname, int slf);
+
+/** Activities in final daemon process.
+ * Create PID file.
+ * Connect file descriptors 0, 1 and 2 to /dev/null.
+ * Reset umask.
+ * Change into / directory.
+ @param prgname Program name.
+ @param pidfilename File name for PID file.
+ @param slf Syslog feature.
+ @return 1 on success, 0 on error.
+*/
+int
+dk4dmt_daemon_after_fork(const char *prgname, const char *pidfilename, int slf);
+
+/** End of daemon, remove PID file.
+ @param prgname Program name.
+ @param pidfilename PID file name.
+ @param slf Syslog feature.
+*/
+void
+dk4dmt_daemon_end(const char *prgname, const char *pidfilename, int slf);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif