[Freeswitch-svn] [commit] r9577 - freeswitch/trunk/src

Freeswitch SVN mikej at freeswitch.org
Tue Sep 16 22:09:59 EDT 2008


Author: mikej
Date: Tue Sep 16 22:09:58 2008
New Revision: 9577

Modified:
   freeswitch/trunk/src/switch.c

Log:
(FSCORE-189)  Improve daemonize code

Modified: freeswitch/trunk/src/switch.c
==============================================================================
--- freeswitch/trunk/src/switch.c	(original)
+++ freeswitch/trunk/src/switch.c	Tue Sep 16 22:09:58 2008
@@ -194,6 +194,58 @@
 	SetServiceStatus(hStatus, &status);
 }
 
+#else
+
+void daemonize(void) {
+	int fd;
+	pid_t pid;
+
+	switch (fork()) {
+		case 0:
+			break;
+		case -1:
+			fprintf(stderr, "Error Backgrounding (fork)! %d - %s\n", errno, strerror(errno));
+			exit(0);
+			break;
+		default:
+			exit(0);
+	}
+
+	if (setsid() < 0) {
+		fprintf(stderr, "Error Backgrounding (setsid)! %d - %s\n", errno, strerror(errno));
+		exit(0);
+	}
+	pid = fork();
+	switch (pid) {
+		case 0:
+			break;
+		case -1:
+			fprintf(stderr, "Error Backgrounding (fork2)! %d - %s\n", errno, strerror(errno));
+			exit(0);
+			break;
+		default:
+			fprintf(stderr, "%d Backgrounding.\n", (int) pid);
+			exit(0);
+	}
+
+	/* redirect std* to null */
+	fd = open("/dev/null", O_RDONLY);
+	if (fd != 0) {
+		dup2(fd, 0);
+		close(fd);
+	}
+	fd = open("/dev/null", O_WRONLY);
+	if (fd != 1) {
+		dup2(fd, 1);
+		close(fd);
+	}
+	fd = open("/dev/null", O_WRONLY);
+	if (fd != 2) {
+		dup2(fd, 2);
+		close(fd);
+	}
+}
+
 #endif
 
 /* the main application entry point */
@@ -501,9 +553,8 @@
 #ifdef WIN32
 		FreeConsole();
 #else
-		if (!nf && (pid = fork())) {
-			fprintf(stderr, "%d Backgrounding.\n", (int) pid);
-			exit(0);
+		if (!nf) {
+			daemonize();
 		}
 #endif
 	}
@@ -530,12 +581,12 @@
 	memset(pid_buffer, 0, sizeof(pid_buffer));
 	switch_snprintf(pid_path, sizeof(pid_path), "%s%s%s", SWITCH_GLOBAL_dirs.log_dir, SWITCH_PATH_SEPARATOR, pfile);
 	switch_snprintf(pid_buffer, sizeof(pid_buffer), "%d", pid);
-	pid_len = sizeof(pid_buffer);
+	pid_len = strlen(pid_buffer);
 
 	apr_pool_create(&pool, NULL);
 	if (switch_file_open(&fd,
 		pid_path,
-		SWITCH_FOPEN_WRITE | SWITCH_FOPEN_CREATE,
+		SWITCH_FOPEN_WRITE | SWITCH_FOPEN_CREATE | SWITCH_FOPEN_TRUNCATE,
 		SWITCH_FPROT_UREAD | SWITCH_FPROT_UWRITE,
 		pool) != SWITCH_STATUS_SUCCESS) {
 			fprintf(stderr, "Cannot open pid file %s.\n", pid_path);



More information about the Freeswitch-svn mailing list