#endif
#ifndef WIN32
+#include <poll.h>
#ifdef HAVE_SETRLIMIT
#include <sys/resource.h>
#endif
}
#ifndef WIN32
-static void handle_SIGUSR2(int sig)
-{
- if (sig) {};
-
- system_ready = 1;
-
- return;
-}
static void handle_SIGCHLD(int sig)
{
#else
-static void daemonize(int do_wait)
+static int check_fd(int fd, int ms)
+{
+ struct pollfd pfds[2] = { { 0 } };
+ int s, r = 0, i = 0;
+
+ pfds[0].fd = fd;
+ pfds[0].events = POLLIN | POLLERR;
+ s = poll(pfds, 1, ms);
+
+ if (s == 0 || s == -1) {
+ r = s;
+ } else {
+ r = -1;
+
+ if ((pfds[0].revents & POLLIN)) {
+ if ((i = read(fd, &r, sizeof(r))) > -1) {
+ i = write(fd, &r, sizeof(r));
+ }
+ }
+ }
+
+ return r;
+}
+
+static void daemonize(int *fds)
{
int fd;
pid_t pid;
+ unsigned int sanity = 60;
- if (!do_wait) {
+ if (!fds) {
switch (fork()) {
case 0: /* child process */
break;
switch (pid) {
case 0: /* child process */
+ if (fds) {
+ close(fds[0]);
+ }
break;
case -1:
fprintf(stderr, "Error Backgrounding (fork2)! %d - %s\n", errno, strerror(errno));
default: /* parent process */
fprintf(stderr, "%d Backgrounding.\n", (int) pid);
- if (do_wait) {
- unsigned int sanity = 60;
+ if (fds) {
char *o;
+ close(fds[1]);
+
if ((o = getenv("FREESWITCH_BG_TIMEOUT"))) {
int tmp = atoi(o);
if (tmp > 0) {
}
}
- while (--sanity && !system_ready) {
+ do {
+ system_ready = check_fd(fds[0], 2000);
- if (sanity % 2 == 0) {
+ if (system_ready == 0) {
printf("FreeSWITCH[%d] Waiting for background process pid:%d to be ready.....\n", (int)getpid(), (int) pid);
}
- sleep(1);
- }
- if (!system_ready) {
+
+ } while (--sanity && system_ready == 0);
+
+ shutdown(fds[0], 2);
+ close(fds[0]);
+ fds[0] = -1;
+
+
+ if (system_ready < 0) {
printf("FreeSWITCH[%d] Error starting system! pid:%d\n", (int)getpid(), (int) pid);
kill(pid, 9);
exit(EXIT_FAILURE);
printf("FreeSWITCH[%d] System Ready pid:%d\n", (int) getpid(), (int) pid);
}
+
exit(EXIT_SUCCESS);
}
- if (do_wait) {
+ if (fds) {
setsid();
}
-
+ return;
/* redirect std* to null */
fd = open("/dev/null", O_RDONLY);
if (fd != 0) {
switch_bool_t do_wait = SWITCH_FALSE;
char *runas_user = NULL;
char *runas_group = NULL;
+ int fds[2] = { 0, 0 };
#else
switch_bool_t win32_service = SWITCH_FALSE;
#endif
signal(SIGTERM, handle_SIGILL);
#ifndef WIN32
if (do_wait) {
- signal(SIGUSR2, handle_SIGUSR2);
+ if (pipe(fds)) {
+ fprintf(stderr, "System Error!\n");
+ exit(-1);
+ }
+
signal(SIGCHLD, handle_SIGCHLD);
}
#endif
FreeConsole();
#else
if (!nf) {
- daemonize(do_wait);
+ daemonize(do_wait ? fds : NULL);
}
#endif
}
#ifndef WIN32
if (do_wait) {
- kill(getppid(), SIGUSR2);
+ if (fds[1] > -1) {
+ int i, v = 1;
+
+ if ((i = write(fds[1], &v, sizeof(v))) < 0) {
+ fprintf(stderr, "System Error [%s]\n", strerror(errno));
+ } else {
+ i = read(fds[1], &v, sizeof(v));
+ }
+
+ shutdown(fds[1], 2);
+ close(fds[1]);
+ fds[1] = -1;
+ }
}
#endif