Репозиторий ALT Linux backports/2.4
Последнее обновление: 9 июля 2008 | Пакетов: 497 | Посещений: 1584984
 поиск   регистрация   авторизация 
 
Группа :: Игры/Аркады
Пакет: bzflag

 Главная   Изменения   Спек   Патчи   Загрузить   Bugs and FR 

Патч: bzflag-2.0.8-service-alt.patch


diff -urN bzflag-2.0.8.orig/src/bzfs/bzfs.cxx bzflag-2.0.8/src/bzfs/bzfs.cxx
--- bzflag-2.0.8.orig/src/bzfs/bzfs.cxx	2006-05-16 13:06:45 +0400
+++ bzflag-2.0.8/src/bzfs/bzfs.cxx	2006-05-16 13:06:58 +0400
@@ -20,6 +20,12 @@
 #include <vector>
 #include <string>
 #include <time.h>
+#ifndef _WIN32
+#include <unistd.h>
+#include <sys/types.h>
+#include <pwd.h>
+#include <grp.h>
+#endif
 
 // implementation-specific bzflag headers
 #include "NetHandler.h"
@@ -4545,6 +4551,78 @@
     return 2;
   }
 
+#ifndef _WIN32
+	struct passwd *user;
+	struct group *group;
+	uid_t uid = -1;
+	gid_t gid = -1;
+			
+	if (clOptions->doDaemon) 
+	{
+		if (( clOptions->user.length() != 0 ) && ( clOptions->group.length() != 0 ))
+		{
+
+			user = getpwnam(clOptions->user.c_str());
+			group = getgrnam(clOptions->group.c_str());
+
+			if (user) 
+				uid = user->pw_uid;
+			else
+				std::cerr << "Couldn't find user " << clOptions->user << " in password file" << std::endl;
+			
+			if (group) 
+				gid = group->gr_gid;
+			else
+				std::cerr << "Couldn't find group " << clOptions->group << " in groups file" << std::endl;
+
+		}
+		
+		if(getuid()) /* root check */
+		{
+			std::cerr << "WARNING: Cant' change user/group id unless you are root." << std::endl;
+			return 0;
+		}
+
+		if( (int) gid != -1) 
+		{
+			if(!setgid(gid))
+				std::cout << "Changed groupid to " << (int) gid << std::endl;
+			else
+			{
+				std::cerr << "Error changing groupd: " << strerror(errno) << std::endl;
+				return 0;
+			}
+		}
+
+		if( (int) uid != -1) {
+			if(!setuid(uid))
+				std::cout << "Changed userid to " << (int) uid << std::endl;
+			else
+			{
+				std::cerr << "Error changing userid: " << strerror(errno) << std::endl;
+				return 0;
+			}
+		}
+	
+		daemon(0,0);
+	}
+#endif
+
+	if(clOptions->pidFileName.length() != 0)
+	{ 
+		unsigned int pid = 0;
+		FILE *fp = fopen(clOptions->pidFileName.c_str(), "wt");
+		#ifndef _WIN32
+		pid = getpid();
+		#else
+		pid = _getpid();
+		#endif
+		if (fp) 
+		{
+			fprintf(fp, "%d", pid);
+			fclose(fp);
+		}
+	}
 
   /* MAIN SERVER RUN LOOP
    *
diff -urN bzflag-2.0.8.orig/src/bzfs/CmdLineOptions.cxx bzflag-2.0.8/src/bzfs/CmdLineOptions.cxx
--- bzflag-2.0.8.orig/src/bzfs/CmdLineOptions.cxx	2006-05-16 13:06:45 +0400
+++ bzflag-2.0.8/src/bzfs/CmdLineOptions.cxx	2006-05-16 13:17:47 +0400
@@ -73,8 +73,14 @@
 "[-filterCallsigns] "
 "[-filterChat] "
 "[-filterSimple] "
+#ifndef _WIN32
+"[+daemon] "
+#endif
 "[-g] "
 "[-gndtex <texture name>] "
+#ifndef _WIN32
+"[-group <groupname> ] "
+#endif
 "[-groupdb <group file>] "
 "[-h] "
 "[-handicap] "
@@ -134,6 +140,9 @@
 "[-timemanual] "
 "[-tk] "
 "[-tkkr <percent>] "
+#ifndef _WIN32
+"[-user <username> ] "
+#endif
 "[-ts [micros]] "
 "[-userdb <user permissions file>] "
 "[-vars <filename>] "
@@ -167,8 +176,12 @@
 "\t-filterCallsigns: filter callsigns to disallow inappropriate user names\n"
 "\t-filterChat: filter chat messages\n"
 "\t-filterSimple: perform simple exact matches with the bad word list\n"
+#ifndef _WIN32
+"\t+daemon: daemonize server\n"
+#endif
 "\t-g: serve one game and then exit\n"
 "\t-gndtex: specify ground texture\n"
+"\t-group: group to start bzfs as (only with +daemon and +user)\n"
 "\t-groupdb: file to read for group permissions\n"
 "\t-h: use random building heights\n"
 "\t-handicap: give advantage based on relative playing ability\n"
@@ -233,6 +246,7 @@
 "\t-timemanual: countdown for timed games is started with /countdown\n"
 "\t-tk: player does not die when killing a teammate\n"
 "\t-tkkr: team-kills-to-wins percentage (1-100) for kicking tk-ing players\n"
+"\t-user: user to start bzfs as (only with +daemon and -group)\n"
 "\t-ts [micros]: timestamp all console output, [micros] to include\n"
 "\t\tmicroseconds\n"
 "\t-userdb: file to read for user access permissions\n"
@@ -832,18 +846,8 @@
       options.password = argv[i];
       memset(argv[i], ' ', options.password.size());
     } else if (strcmp(argv[i], "-pidfile") == 0) {
-      unsigned int pid = 0;
 	  checkArgc(1, i, argc, argv[i]);
-      FILE *fp = fopen(argv[i], "wt");
-#ifndef _WIN32
-      pid = getpid();
-#else
-      pid = _getpid();
-#endif
-      if (fp) {
-	fprintf(fp, "%d", pid);
-	fclose(fp);
-      }
+	  options.pidFileName = argv[i];
     }  else if (strcmp(argv[i], "-pf") == 0) {
       // try wksPort first and if we can't open that port then
       // let system assign a port for us.
@@ -1138,6 +1142,14 @@
       checkArgc(1, i, argc, argv[i]);
       BZDB.set(StateDatabase::BZDB_WORLDSIZE, TextUtils::format("%d",atoi(argv[i])*2));
       std::cerr << "using world size of \"" << BZDBCache::worldSize << "\"" << std::endl;
+    } else if (strcmp(argv[i], "+daemon") == 0 ) {
+      options.doDaemon = true;
+    } else if (strcmp(argv[i], "-user") == 0 ) {
+		checkArgc(1, i, argc, argv[i]);
+		options.user = argv[i];
+    } else if (strcmp(argv[i], "-group") == 0 ) {
+		checkArgc(1, i, argc, argv[i]);
+		options.group = argv[i];
     } else {
       std::cerr << "bad argument \"" << argv[i] << "\"" << std::endl;
       usage(argv[0]);
diff -urN bzflag-2.0.8.orig/src/bzfs/CmdLineOptions.h bzflag-2.0.8/src/bzfs/CmdLineOptions.h
--- bzflag-2.0.8.orig/src/bzfs/CmdLineOptions.h	2006-05-16 13:06:45 +0400
+++ bzflag-2.0.8/src/bzfs/CmdLineOptions.h	2006-05-16 13:07:10 +0400
@@ -78,7 +78,8 @@
     filterFilename(""), filterCallsigns(false), filterChat(false), filterSimple(false),
     banTime(300), voteTime(60), vetoTime(2), votesRequired(2),
     votePercentage(50.1f), voteRepeatTime(300),
-    autoTeam(false), citySize(5), cacheURL(""), cacheOut("")
+    autoTeam(false), citySize(5), cacheURL(""), cacheOut(""), 
+    doDaemon(false), pidFileName(""), user(""), group("")
   {
     int i;
     for (FlagTypeMap::iterator it = FlagType::getFlagMap().begin();
@@ -196,6 +197,19 @@
 
   std::string	   cacheURL;
   std::string	   cacheOut;
+  
+  //forking or not
+  bool doDaemon;
+
+  //pidfile
+  std::string pidFileName;
+
+  //user
+  std::string user;
+
+  //group
+
+  std::string group;
 
   // plugins
   typedef struct
 
design & coding: Vladimir Lettiev aka crux © 2004-2005