moved rtp stuff to anyrtpproxy and removed it from anytun
[anytun.git] / src / daemon.hpp
blobd66549b9f0b4c51c6c7bd33c4d8202795bac05fd
1 #ifndef _DAEMON_HPP
2 #define _DAEMON_HPP
3 #ifndef NODAEMON
5 #include <poll.h>
6 #include <fcntl.h>
7 #include <pwd.h>
8 #include <grp.h>
9 #include <sys/wait.h>
10 #include <sys/stat.h>
11 #include <unistd.h>
13 void chrootAndDrop(std::string const& chrootdir, std::string const& username)
15 if (getuid() != 0)
17 std::cerr << "this programm has to be run as root in order to run in a chroot" << std::endl;
18 exit(-1);
21 struct passwd *pw = getpwnam(username.c_str());
22 if(pw) {
23 if(chroot(chrootdir.c_str()))
25 std::cerr << "can't chroot to " << chrootdir << std::endl;
26 exit(-1);
28 cLog.msg(Log::PRIO_NOTICE) << "we are in chroot jail (" << chrootdir << ") now" << std::endl;
29 if(chdir("/"))
31 std::cerr << "can't change to /" << std::endl;
32 exit(-1);
34 if (initgroups(pw->pw_name, pw->pw_gid) || setgid(pw->pw_gid) || setuid(pw->pw_uid))
36 std::cerr << "can't drop to user " << username << " " << pw->pw_uid << ":" << pw->pw_gid << std::endl;
37 exit(-1);
39 cLog.msg(Log::PRIO_NOTICE) << "dropped user to " << username << " " << pw->pw_uid << ":" << pw->pw_gid << std::endl;
41 else
43 std::cerr << "unknown user " << username << std::endl;
44 exit(-1);
48 void daemonize()
50 pid_t pid;
52 pid = fork();
53 if(pid) exit(0);
54 setsid();
55 pid = fork();
56 if(pid) exit(0);
58 // std::cout << "running in background now..." << std::endl;
60 int fd;
61 // for (fd=getdtablesize();fd>=0;--fd) // close all file descriptors
62 for (fd=0;fd<=2;fd++) // close all file descriptors
63 close(fd);
64 fd = open("/dev/null",O_RDWR); // stdin
65 if(fd == -1)
66 cLog.msg(Log::PRIO_WARNING) << "can't open stdin";
67 else {
68 if(dup(fd) == -1) // stdout
69 cLog.msg(Log::PRIO_WARNING) << "can't open stdout";
70 if(dup(fd) == -1) // stderr
71 cLog.msg(Log::PRIO_WARNING) << "can't open stderr";
73 umask(027);
75 #endif
76 #endif