From 1b1b4f396d34f08e2e2932e7a69229dcc51a1da2 Mon Sep 17 00:00:00 2001
From: John Hodge <tpg@heathred.ucc.asn.au>
Date: Tue, 15 Mar 2011 13:24:57 +0800
Subject: [PATCH] Fixed up daemonising implementation (now to test it)

---
 src/server/main.c   | 12 +++++++++++-
 src/server/server.c | 17 +++++++++++------
 2 files changed, 22 insertions(+), 7 deletions(-)

diff --git a/src/server/main.c b/src/server/main.c
index 83c8e06..d6fefbc 100644
--- a/src/server/main.c
+++ b/src/server/main.c
@@ -25,6 +25,7 @@
 extern void	Init_Handlers(void);
 extern void	Load_Itemlist(void);
 extern void	Server_Start(void);
+extern int	gbServer_RunInBackground;
 extern int	giServer_Port;
 extern char	*gsItemListFile;
 extern char	*gsCoke_SerialPort;
@@ -85,6 +86,9 @@ int main(int argc, char *argv[])
 				if( i + 1 >= argc )	return -1;
 				giDebugLevel = atoi(argv[++i]);
 				break;
+			case 'D':
+				gbServer_RunInBackground = 1;
+				return -1;
 			default:
 				// Usage Error?
 				PrintUsage(argv[0]);
@@ -116,12 +120,18 @@ int main(int argc, char *argv[])
 				}
 				fgets(buf, sizeof buf, fp);
 				fclose(fp);
-				gsDoor_Password = strdup(buf);;
+				gsDoor_Password = strdup(buf);
 			}
 			else if( strcmp(arg, "--cokebank") == 0 ) {
 				if( i + 1 >= argc )	return -1;
 				gsCokebankPath = argv[++i];
 			}
+			else if( strcmp(arg, "--daemonise") == 0 ) {
+				gbServer_RunInBackground = 1;
+			}
+			else if( strcmp(arg, "--dont-daemonise") == 0 ) {
+				gbServer_RunInBackground = 1;
+			}
 			else {
 				// Usage error?
 				PrintUsage(argv[0]);
diff --git a/src/server/server.c b/src/server/server.c
index dd8a294..4dec980 100644
--- a/src/server/server.c
+++ b/src/server/server.c
@@ -14,6 +14,7 @@
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <unistd.h>
+#include <fcntl.h>	// O_*
 #include <string.h>
 #include <limits.h>
 #include <stdarg.h>
@@ -147,9 +148,10 @@ void Server_Start(void)
 		return ;
 	}
 
-#if 0
+	// 
 	if( gbServer_RunInBackground )
 	{
+		int newin, newout, newerr;
 		int pid = fork();
 		if( pid == -1 ) {
 			fprintf(stderr, "ERROR: Unable to fork\n");
@@ -160,12 +162,15 @@ void Server_Start(void)
 			// Parent, quit
 			exit(0);
 		}
-		// In child, sort out stdin/stdout
-		reopen(0, "/dev/null", O_READ);
-		reopen(1, gsServer_LogFile, O_CREAT|O_APPEND);
-		reopen(2, gsServer_ErrorLog, O_CREAT|O_APPEND);
+		// In child
+		// - Sort out stdin/stdout
+		newin  = open("/dev/null", O_RDONLY);
+		newout = open(gsServer_LogFile, O_CREAT|O_APPEND, 0644);
+		newerr = open(gsServer_ErrorLog, O_CREAT|O_APPEND, 0644);
+		dup2(newin, 0);
+		dup2(newout, 1);
+		dup2(newerr, 2);
 	}
-#endif
 	
 	// Listen
 	if( listen(giServer_Socket, MAX_CONNECTION_QUEUE) < 0 ) {
-- 
GitLab