mirror of
https://github.com/octoleo/lsyncd.git
synced 2024-12-13 14:43:09 +00:00
replace daemon(0, 0) with own daemonize
This commit is contained in:
parent
aee59ea5c7
commit
e22691e111
65
lsyncd.c
65
lsyncd.c
@ -483,9 +483,9 @@ write_pidfile(lua_State *L, const char *pidfile) {
|
|||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
static void daemonize(lua_State *L);
|
||||||
static int l_stackdump(lua_State* L);
|
static int l_stackdump(lua_State* L);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Logs a message.
|
* Logs a message.
|
||||||
*
|
*
|
||||||
@ -888,11 +888,7 @@ l_configure(lua_State *L)
|
|||||||
settings.log_syslog = true;
|
settings.log_syslog = true;
|
||||||
}
|
}
|
||||||
logstring("Debug", "daemonizing now.");
|
logstring("Debug", "daemonizing now.");
|
||||||
if (daemon(0, 0)) {
|
daemonize(L);
|
||||||
logstring("Error", "Failed to daemonize");
|
|
||||||
exit(-1); //ERRNO
|
|
||||||
}
|
|
||||||
is_daemon = true;
|
|
||||||
}
|
}
|
||||||
} else if (!strcmp(command, "nodaemon")) {
|
} else if (!strcmp(command, "nodaemon")) {
|
||||||
settings.nodaemon = true;
|
settings.nodaemon = true;
|
||||||
@ -1216,6 +1212,63 @@ nonobserve_fd(int fd)
|
|||||||
observances_len--;
|
observances_len--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Daemonizes.
|
||||||
|
*
|
||||||
|
* Lsyncds own implementation over daemon(0, 0) since
|
||||||
|
* a) OSX keeps bugging about it being deprecated
|
||||||
|
* b) for reason since blindly closing stdin/out/err is unsafe, since
|
||||||
|
* they might not have existed and actually close the monitors fd!
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
daemonize(lua_State *L)
|
||||||
|
{
|
||||||
|
pid_t pid, sid;
|
||||||
|
|
||||||
|
pid = fork();
|
||||||
|
if (pid < 0) {
|
||||||
|
printlogf(L, "Error",
|
||||||
|
"Failure in daemonize at fork: %s", strerror(errno));
|
||||||
|
exit(-1); // ERRNO
|
||||||
|
}
|
||||||
|
if (pid > 0) {
|
||||||
|
/* return parent to shell */
|
||||||
|
exit(0);
|
||||||
|
}
|
||||||
|
sid = setsid();
|
||||||
|
if (sid < 0) {
|
||||||
|
printlogf(L, "Error",
|
||||||
|
"Failure in daemonize at setsid: %s", strerror(errno));
|
||||||
|
exit(-1); // ERRNO
|
||||||
|
}
|
||||||
|
|
||||||
|
/* goto root dir */
|
||||||
|
if ((chdir("/")) < 0) {
|
||||||
|
printlogf(L, "Error",
|
||||||
|
"Failure in daemonize at chdir(\"/\"): %s", strerror(errno));
|
||||||
|
exit(-1); // ERRNO
|
||||||
|
}
|
||||||
|
|
||||||
|
/* does what clibs daemon(0, 0) cannot do,
|
||||||
|
* checks if there were no stdstreams and it might close used fds! */
|
||||||
|
if (observances_len && observances->fd < 3) {
|
||||||
|
printlogf(L, "Normal",
|
||||||
|
"daemonize not closing stdin/out/err, since there seem to none.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* disconnects stdstreams */
|
||||||
|
if (!freopen("/dev/null", "r", stdin) ||
|
||||||
|
!freopen("/dev/null", "r", stdout) ||
|
||||||
|
!freopen("/dev/null", "r", stderr)
|
||||||
|
) {
|
||||||
|
printlogf(L, "Error",
|
||||||
|
"Failure in daemonize at freopen(/dev/null, std[in|out|err])");
|
||||||
|
}
|
||||||
|
|
||||||
|
is_daemon = true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Normal operation happens in here.
|
* Normal operation happens in here.
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user