Add ProcessPriority option.
[tinc] / src / tincd.c
index 929e9b9..27cd01e 100644 (file)
@@ -161,7 +161,7 @@ static bool parse_options(int argc, char **argv)
 
                        case 'L':                               /* no detach */
 #ifndef HAVE_MLOCKALL
-                               logger(LOG_ERR, _("mlockall() not supported on this platform!"));
+                               logger(LOG_ERR, _("%s not supported on this platform"), "mlockall()");
                                return false;
 #else
                                do_mlock = true;
@@ -457,7 +457,8 @@ static bool drop_privs() {
                uid = pw->pw_uid;
                if (initgroups(switchuser, pw->pw_gid) != 0 ||
                    setgid(pw->pw_gid) != 0) {
-                       logger(LOG_ERR, _("%s failed"), "initgroups()");
+                       logger(LOG_ERR, _("System call `%s' failed: %s"),
+                              "initgroups", strerror(errno));
                        return false;
                }
                endgrent();
@@ -465,8 +466,9 @@ static bool drop_privs() {
        }
        if (do_chroot) {
                tzset();        /* for proper timestamps in logs */
-               if (chroot(confbase) != 0 || chdir(".") != 0) {
-                       logger(LOG_ERR, _("%s failed"), "chroot()");
+               if (chroot(confbase) != 0 || chdir("/") != 0) {
+                       logger(LOG_ERR, _("System call `%s' failed: %s"),
+                              "chroot", strerror(errno));
                        return false;
                }
                free(confbase);
@@ -474,7 +476,8 @@ static bool drop_privs() {
        }
        if (switchuser)
                if (setuid(uid) != 0) {
-                       logger(LOG_ERR, _("%s failed"), "setuid()");
+                       logger(LOG_ERR, _("System call `%s' failed: %s"),
+                              "setuid", strerror(errno));
                        return false;
                }
 #endif
@@ -577,6 +580,35 @@ int main2(int argc, char **argv)
        if(!setup_network())
                goto end;
 
+        /* Change process priority */
+
+        char *priority = 0;
+
+        if(get_config_string(lookup_config(config_tree, "ProcessPriority"), &priority)) {
+                if(!strcasecmp(priority, "Normal")) {
+#ifdef HAVE_MINGW
+                        SetPriorityClass(GetCurrentProcess(), NORMAL_PRIORITY_CLASS);
+#else
+                        nice(0);
+#endif
+                } else if(!strcasecmp(priority, "Low")) {
+#ifdef HAVE_MINGW
+                        SetPriorityClass(GetCurrentProcess(), BELOW_NORMAL_PRIORITY_CLASS);
+#else
+                        nice(10);
+#endif
+                } else if(!strcasecmp(priority, "High")) {
+#ifdef HAVE_MINGW
+                        SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
+#else
+                        nice(-10);
+#endif
+                } else {
+                        logger(LOG_ERR, _("Invalid priority `%s`!"), priority);
+                        goto end;
+                }
+        }
+
        /* drop privileges */
        if (!drop_privs())
                goto end;