diff --git a/src/server/main.c b/src/server/main.c index 83c8e06da763aa24e5d91df6f6b4cf3801c686d1..d6fefbc61438f1f0a98f09517d162e3c5c9d9ccc 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 dd8a29432b3c2cb88660854ca07a68273cfb3cc2..4dec980a580f81cef3fe7b7eed5ca1a145959e92 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 ) {