From: Andre Noll <maan@systemlinux.org>
Date: Sun, 17 Feb 2008 20:53:21 +0000 (+0100)
Subject: Be more careful in daemon_init().
X-Git-Tag: v0.3.1~10
X-Git-Url: https://git.tuebingen.mpg.de/?a=commitdiff_plain;h=2bd7df00a26bb0cb26283f56eef18659aaa65730;p=paraslash.git

Be more careful in daemon_init().

setsid(), chdir() and dup2() all may fail. So check the
return value.
---

diff --git a/daemon.c b/daemon.c
index a2fa1caa..c790c17b 100644
--- a/daemon.c
+++ b/daemon.c
@@ -27,28 +27,36 @@ void daemon_init(void)
 	pid_t pid;
 	int null;
 
-	PARA_INFO_LOG("%s", "daemonizing\n");
-	if ((pid = fork()) < 0) {
-		PARA_EMERG_LOG("%s", "failed to init daemon\n");
-		exit(EXIT_FAILURE);
-	} else if (pid)
+	PARA_INFO_LOG("daemonizing\n");
+	pid = fork();
+	if (pid < 0)
+		goto err;
+	if (pid)
 		exit(EXIT_SUCCESS); /* parent exits */
-	/* child */
-	setsid(); /* become session leader */
-	chdir("/");
+	/* become session leader */
+	if (setsid() < 0)
+		goto err;
+	if (chdir("/") < 0)
+		goto err;
 	umask(0);
-
 	null = open("/dev/null", O_RDONLY);
 	if (null < 0)
-		exit(EXIT_FAILURE);
-	dup2(null, STDIN_FILENO);
-	dup2(null, STDOUT_FILENO);
-	dup2(null, STDERR_FILENO);
+		goto err;
+	if (dup2(null, STDIN_FILENO) < 0)
+		goto err;
+	if (dup2(null, STDOUT_FILENO) < 0)
+		goto err;
+	if (dup2(null, STDERR_FILENO) < 0)
+		goto err;
 	close(null);
+	return;
+err:
+	PARA_EMERG_LOG("fatal: %s\n", strerror(errno));
+	exit(EXIT_FAILURE);
 }
 
 /**
- * fopen() a file in append mode.
+ * fopen() the given file in append mode.
  *
  * \param logfile_name The name of the file to open.
  *
@@ -58,11 +66,11 @@ FILE *open_log(const char *logfile_name)
 {
 	FILE *logfile;
 
-	if (!logfile_name)
-		return NULL;
-	if (!(logfile = fopen(logfile_name, "a"))) {
-		PARA_EMERG_LOG("can not open %s, uid: %d\n", logfile_name,
-			(int)getuid());
+	assert(logfile_name);
+	logfile = fopen(logfile_name, "a");
+	if (!logfile) {
+		PARA_EMERG_LOG("can not open %s: %s\n", logfile_name,
+			strerror(errno));
 		exit(EXIT_FAILURE);
 	}
 	setlinebuf(logfile);