Set scheduling policy before dropping privileges
authorSebastian Blunt <sebastian@c4k3.net>
Tue, 6 Dec 2016 17:11:14 +0000 (18:11 +0100)
committerSebastian Blunt <sebastian@c4k3.net>
Tue, 6 Dec 2016 17:11:14 +0000 (18:11 +0100)
Previously if set to daemonize, set to run with realtime priority, and
set to drop privileges, umurmur would try to set the scheduling policy
after dropping privileges, which would fail as unprivileged processes
are not allowed to set a realtime scheduling policy as of Linux 2.6.12.

Fixes #94.

src/main.c

index a18363dd721bc579bdbcd842e295d4c8b0223132..bc913395f8b56e784709aac25ed9839ca1820f73 100644 (file)
@@ -323,6 +323,13 @@ int main(int argc, char **argv)
                        if (pidfile != NULL)
                                lockfile(pidfile);
 
+#ifdef POSIX_PRIORITY_SCHEDULING
+                       /* Set the scheduling policy, has to be called after daemonizing
+                        * but before we drop privileges */
+                       if (realtime)
+                               setscheduler();
+#endif
+
                        switch_user();
 
                        /* Reopen log file. If user switch results in access denied, we catch
@@ -332,6 +339,15 @@ int main(int argc, char **argv)
                }
                else Log_init(true);
 
+#ifdef POSIX_PRIORITY_SCHEDULING
+               /* We still want to set scheduling policy if nodaemon is specified,
+                * but if we are daemonizing setscheduler() will be called above */
+               if (nodaemon) {
+                       if (realtime)
+                               setscheduler();
+               }
+#endif
+
                signal(SIGCHLD, SIG_IGN); /* ignore child */
                signal(SIGTSTP, SIG_IGN); /* ignore tty signals */
                signal(SIGTTOU, SIG_IGN);
@@ -360,11 +376,6 @@ int main(int argc, char **argv)
     Sharedmemory_init( bindport, bindport6 );
 #endif
 
-#ifdef POSIX_PRIORITY_SCHEDULING
-               if (realtime)
-                       setscheduler();
-#endif
-
                Server_run();
 
 #ifdef USE_SHAREDMEMORY_API