aboutsummaryrefslogtreecommitdiff
path: root/src/utils.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/utils.c')
-rw-r--r--src/utils.c52
1 files changed, 41 insertions, 11 deletions
diff --git a/src/utils.c b/src/utils.c
index 37d901c..10ec2af 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -6,17 +6,42 @@
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
-#include <syslog.h>
+#include <sys/prctl.h>
+#include <assert.h>
#include "utils.h"
+#include "log.h"
#define _POSIX_PATH_MAX 256
+char *arg0 = NULL;
-void set_procname(char *arg0, const char *newname)
+
+static void sighandler_child(int signo)
+{
+ switch (signo) {
+ case SIGHUP:
+ if (getppid() == 1) {
+ N("Master process %d died, exiting", getpgrp());
+ exit(EXIT_SUCCESS);
+ }
+ break;
+ }
+}
+
+int set_child_sighandler(void)
+{
+ /* not portable */
+ if (prctl(PR_SET_PDEATHSIG, SIGHUP) != 0)
+ return 1;
+ return signal(SIGHUP, sighandler_child) == SIG_ERR;
+}
+
+void set_procname(const char *new_arg0)
{
+ assert(arg0);
memset(arg0, 0, _POSIX_PATH_MAX);
- strncpy(arg0, newname, _POSIX_PATH_MAX);
+ strncpy(arg0, new_arg0, _POSIX_PATH_MAX);
}
pid_t daemonize(int stay_foreground)
@@ -40,16 +65,18 @@ pid_t daemonize(int stay_foreground)
}
/* On success: The child process becomes session leader */
- if (!stay_foreground && setsid() < 0)
+ if (!stay_foreground && setsid() < 0) {
+ E_STRERR("setsid");
exit(EXIT_FAILURE);
+ }
/* Catch, ignore and handle signals */
//TODO: Implement a working signal handler */
//signal(SIGCHLD, SIG_IGN);
//signal(SIGHUP, SIG_IGN);
+ /* Fork off for the second time*/
if (!stay_foreground) {
- /* Fork off for the second time*/
pid = fork();
/* An error occurred */
@@ -57,9 +84,13 @@ pid_t daemonize(int stay_foreground)
exit(EXIT_FAILURE);
/* Success: Let the parent terminate */
- if (pid > 0) {
+ if (pid > 0)
exit(EXIT_SUCCESS);
- }
+ }
+
+ if (!stay_foreground && setpgrp()) {
+ E_STRERR("setpgrp");
+ exit(EXIT_FAILURE);
}
/* Set new file permissions */
@@ -70,13 +101,12 @@ pid_t daemonize(int stay_foreground)
/* Change the working directory to the root directory */
/* or another appropriated directory */
- chdir("/");
+// chdir("/");
/* Close all open file descriptors */
int x;
- for (x = sysconf(_SC_OPEN_MAX); x>=0; x--)
- {
- close (x);
+ for (x = sysconf(_SC_OPEN_MAX); x>=0; x--) {
+// close (x);
}
return pid;