|
|
@ -37,6 +37,7 @@
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <stdint.h>
|
|
|
|
#include <errno.h>
|
|
|
|
#include <errno.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <string.h>
|
|
|
|
|
|
|
|
#include <fcntl.h>
|
|
|
|
|
|
|
|
|
|
|
|
int openlistener_socket(int port)
|
|
|
|
int openlistener_socket(int port)
|
|
|
|
{
|
|
|
|
{
|
|
|
@ -115,3 +116,55 @@ int normalize_path(char *path)
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define DM_MAX_CLOSE 8192
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
int daemonize(void)
|
|
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
pid_t pid;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* fork */
|
|
|
|
|
|
|
|
pid = fork();
|
|
|
|
|
|
|
|
if (pid == -1) {
|
|
|
|
|
|
|
|
perror("fork() failed");
|
|
|
|
|
|
|
|
return EFAULT;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
else if (pid != 0) {
|
|
|
|
|
|
|
|
exit(EXIT_SUCCESS);
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* create new session and progress group */
|
|
|
|
|
|
|
|
if (setsid() == -1) {
|
|
|
|
|
|
|
|
perror("setsid() failed");
|
|
|
|
|
|
|
|
return EFAULT;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* set the working directory to the root directory */
|
|
|
|
|
|
|
|
if (chdir("/") == -1) {
|
|
|
|
|
|
|
|
perror("chdir() failed");
|
|
|
|
|
|
|
|
return EFAULT;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* close all open files */
|
|
|
|
|
|
|
|
int fd;
|
|
|
|
|
|
|
|
int maxfd = sysconf(_SC_OPEN_MAX);
|
|
|
|
|
|
|
|
if (maxfd == -1)
|
|
|
|
|
|
|
|
maxfd = DM_MAX_CLOSE; /* if this limit is indeterminate, take a guess */
|
|
|
|
|
|
|
|
for (fd = 0; fd < maxfd; fd++)
|
|
|
|
|
|
|
|
close(fd);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* reopen standard fd's /dev/null */
|
|
|
|
|
|
|
|
close(STDIN_FILENO);
|
|
|
|
|
|
|
|
fd = open("/dev/null", O_RDWR);
|
|
|
|
|
|
|
|
if (fd != STDIN_FILENO) { /* fd should be 0 */
|
|
|
|
|
|
|
|
return EBADFD;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (dup2(STDIN_FILENO, STDOUT_FILENO) != STDOUT_FILENO) {
|
|
|
|
|
|
|
|
return EBADFD;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
if (dup2(STDIN_FILENO, STDERR_FILENO) != STDERR_FILENO) {
|
|
|
|
|
|
|
|
return EBADFD;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
}
|