ttd.c
changeset 704 e843dd369938
parent 679 04ca2cd69420
child 760 8fda8a13270c
--- a/ttd.c	Sat Dec 18 13:38:27 2004 +0000
+++ b/ttd.c	Sat Dec 18 14:19:21 2004 +0000
@@ -314,6 +314,7 @@
 		"  -G seed             = Set random seed\n"
 		"  -n [ip#player:port] = Start networkgame\n"
 		"  -D                  = Start dedicated server\n"
+		"  -f                  = Fork into the background (dedicated only)\n"
 		"  -i                  = Force to use the DOS palette (use this if you see a lot of pink)\n"
 		"  -p #player          = Player as #player (deprecated) (network only)\n"
 	);
@@ -516,6 +517,8 @@
 	if (_music_driver->is_song_playing()) ResetMusic();
 }
 
+extern void DedicatedFork();
+
 int ttd_main(int argc, char* argv[])
 {
 	MyGetOptData mgo;
@@ -531,12 +534,14 @@
 	_game_mode = GM_MENU;
 	_switch_mode = SM_MENU;
 	_switch_mode_errorstr = INVALID_STRING_ID;
+	_dedicated_forks = false;
+	_dedicated_enabled = false;
 
 	// The last param of the following function means this:
 	//   a letter means: it accepts that param (e.g.: -h)
 	//   a ':' behind it means: it need a param (e.g.: -m<driver>)
 	//   a '::' behind it means: it can optional have a param (e.g.: -d<debug>)
-	MyGetOptInit(&mgo, argc-1, argv+1, "m:s:v:hDn::l:eit:d::r:g::G:p:");
+	MyGetOptInit(&mgo, argc-1, argv+1, "m:s:v:hDfn::l:eit:d::r:g::G:p:");
 	while ((i = MyGetOpt(&mgo)) != -1) {
 		switch(i) {
 		case 'm': ttd_strlcpy(musicdriver, mgo.opt, sizeof(musicdriver)); break;
@@ -546,7 +551,11 @@
 				sprintf(musicdriver,"null");
 				sprintf(sounddriver,"null");
 				sprintf(videodriver,"dedicated");
+				_dedicated_enabled = true;
 			} break;
+		case 'f': {
+				_dedicated_forks = true;
+			}; break;
 		case 'n': {
 				network = true;
 				if (mgo.opt)
@@ -595,6 +604,13 @@
 	}
 
 	DeterminePaths();
+
+#ifdef UNIX
+	// We must fork here, or we'll end up without some resources we need (like sockets)
+	if (_dedicated_forks)
+		DedicatedFork();
+#endif
+
 	LoadFromConfig();
 
 	// override config?
@@ -604,6 +620,9 @@
 	if (resolution[0]) { _cur_resolution[0] = resolution[0]; _cur_resolution[1] = resolution[1]; }
 	if (startdate != -1) _patches.starting_date = startdate;
 
+	if (_dedicated_forks && !_dedicated_enabled)
+		_dedicated_forks = false;
+
 	// enumerate language files
 	InitializeLanguagePacks();