]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/inspircd.cpp
Remove an extremely noisy piece of debug on startup/rehash - this code works fine...
[user/henk/code/inspircd.git] / src / inspircd.cpp
index 550baa027d2c4e34500e16d51af887a2656c383b..9a64331b5f1faeabe84d3a3540f96e15db0edccf 100644 (file)
@@ -35,6 +35,9 @@
        #include <stdlib.h>
        #include <crtdbg.h>
        #endif
+
+       #include <pwd.h> // setuid
+       #include <grp.h> // setgid
 #endif
 
 #include <fstream>
 #include "caller.h"
 #include "testsuite.h"
 
-using irc::sockets::insp_ntoa;
-using irc::sockets::insp_inaddr;
-using irc::sockets::insp_sockaddr;
-
 InspIRCd* SI = NULL;
 int* mysig = NULL;
 
@@ -78,12 +77,9 @@ const char* ExitCodes[] =
                "Could not create windows forked process", /* 14 */
                "Received SIGTERM", /* 15 */
                "Bad command handler loaded", /* 16 */
-               "Windows service specific error 1", /* 17 - Dont know what to call these yet, will give them */
-               "Windows service specific error 2", /* 18 - better descriptions later on */
-               "Windows service specific error 3", /* 19 */
-               "Windows service specific error 4", /* 20 */
-               "Windows service specific error 5", /* 21 */
-               "Windows service specific error 6"  /* 22 */
+               "RegisterServiceCtrlHandler failed", /* 17 */
+               "UpdateSCMStatus failed", /* 18 */
+               "CreateEvent failed" /* 19 */
 };
 
 void InspIRCd::Cleanup()
@@ -461,6 +457,7 @@ InspIRCd::InspIRCd(int argc, char** argv)
        ThreadEngineFactory* tef = new ThreadEngineFactory();
        this->Threads = tef->Create(this);
        delete tef;
+       this->Mutexes = new MutexFactory(this);
 
        /* Default implementation does nothing */
        this->PI = new ProtocolInterface(this);
@@ -628,7 +625,7 @@ InspIRCd::InspIRCd(int argc, char** argv)
        /* During startup we don't actually initialize this
         * in the thread engine.
         */
-       this->ConfigThread = new ConfigReaderThread(this, true, NULL);
+       this->ConfigThread = new ConfigReaderThread(this, true, "");
        ConfigThread->Run();
        delete ConfigThread;
        this->ConfigThread = NULL;
@@ -732,6 +729,54 @@ InspIRCd::InspIRCd(int argc, char** argv)
 
        Logs->Log("STARTUP", DEFAULT, "Startup complete as '%s'[%s], %d max open sockets", Config->ServerName,Config->GetSID().c_str(), SE->GetMaxFds());
 
+#ifndef WIN32
+       if (*(this->Config->SetUser))
+       {
+               // setuid
+               struct passwd *u;
+
+               errno = 0;
+               u = getpwnam(this->Config->SetUser);
+
+               if (!u)
+               {
+                       this->Logs->Log("SETGUID", DEFAULT, "getpwnam() failed (bad user?): %s", strerror(errno));
+                       this->QuickExit(0);
+               }
+
+               int ret = setuid(u->pw_uid);
+
+               if (ret == -1)
+               {
+                       this->Logs->Log("SETGUID", DEFAULT, "setuid() failed (bad user?): %s", strerror(errno));
+                       this->QuickExit(0);
+               }
+       }
+
+       if (*(this->Config->SetGroup))
+       {
+               // setgid
+               struct group *g;
+
+               errno = 0;
+               g = getgrnam(this->Config->SetGroup);
+
+               if (!g)
+               {
+                       this->Logs->Log("SETGUID", DEFAULT, "getgrnam() failed (bad user?): %s", strerror(errno));
+                       this->QuickExit(0);
+               }
+
+               int ret = setgid(g->gr_gid);
+
+               if (ret == -1)
+               {
+                       this->Logs->Log("SETGUID", DEFAULT, "setgid() failed (bad user?): %s", strerror(errno));
+                       this->QuickExit(0);
+               }
+       }
+#endif
+
        this->WritePID(Config->PID);
 }
 
@@ -780,7 +825,8 @@ int InspIRCd::Run()
                        this->Res->Rehash();
                        this->ResetMaxBans();
                        InitializeDisabledCommands(Config->DisabledCommands, this);
-                       FOREACH_MOD_I(this, I_OnRehash, OnRehash(Config->RehashUser, Config->RehashParameter));
+                       User* user = !Config->RehashUserUID.empty() ? FindNick(Config->RehashUserUID) : NULL;
+                       FOREACH_MOD_I(this, I_OnRehash, OnRehash(user, Config->RehashParameter));
                        this->BuildISupport();
                }