Commit d9f234b7 authored by jan.koester's avatar jan.koester
Browse files

daemon support

parent 9bb14174
Loading
Loading
Loading
Loading
Loading
+54 −1
Changes for src/authdb.cpp: 54 added lines, 1 removed line.
Original line number Diff line number Diff line
@@ -59,6 +59,13 @@

#include <json-c/json.h>

#ifndef _WIN32
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
#include <sys/stat.h>
#endif

namespace authdb {

    AdPlugin       *g_AdPlugin       = nullptr;
@@ -389,7 +396,10 @@ int main(int argc,char *argv[]){
    cmdplus::CmdController cmd(cmdplus::CmdController::getInstance());

    cmd.registerCmd("config",'c',true,"","Config Path");
    cmd.registerCmd("debug",'d',false,"false","Config Path");
    cmd.registerCmd("debug",'d',false,"false","Debug Mode");
#ifndef _WIN32
    cmd.registerCmd("foreground",'f',false,"false","Run in foreground (disable daemon)");
#endif

    cmd.parseCmd(argc,argv);

@@ -399,6 +409,49 @@ int main(int argc,char *argv[]){
        return -1;
    }

#ifndef _WIN32
    bool foreground = (cmd.getCmdbyKey("foreground")->getValue() == "true");

    if (!foreground) {
        pid_t pid = fork();
        if (pid < 0) {
            std::cerr << "fork failed" << std::endl;
            return 1;
        }
        if (pid > 0)
            return 0;

        if (setsid() < 0) {
            std::cerr << "setsid failed" << std::endl;
            return 1;
        }

        close(STDIN_FILENO);
        close(STDOUT_FILENO);
        close(STDERR_FILENO);
    }

    if (getuid() == 0) {
        struct passwd *pw = getpwnam("authdb");
        if (pw) {
            if (setgid(pw->pw_gid) != 0) {
                std::cerr << "setgid failed" << std::endl;
                return 1;
            }
            if (initgroups("authdb", pw->pw_gid) != 0) {
                std::cerr << "initgroups failed" << std::endl;
                return 1;
            }
            if (setuid(pw->pw_uid) != 0) {
                std::cerr << "setuid failed" << std::endl;
                return 1;
            }
        } else {
            std::cerr << "user authdb not found, running as root" << std::endl;
        }
    }
#endif

    confplus::Config config(cmd.getCmdbyKey("config")->getValue());

    authdb::AuthBackend backend(authdb::AuthBackendType::File,