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;
if( i + 1 >= argc ) return -1;
giDebugLevel = atoi(argv[++i]);
break;
+ case 'D':
+ gbServer_RunInBackground = 1;
+ return -1;
default:
// Usage Error?
PrintUsage(argv[0]);
}
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]);
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
+#include <fcntl.h> // O_*
#include <string.h>
#include <limits.h>
#include <stdarg.h>
return ;
}
-#if 0
+ //
if( gbServer_RunInBackground )
{
+ int newin, newout, newerr;
int pid = fork();
if( pid == -1 ) {
fprintf(stderr, "ERROR: Unable to fork\n");
// 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 ) {