doing replay protection before learning remote host
[anytun.git] / src / daemon.hpp
blob6ed74aa003ef9563f2fcbd91adba67b5ff8afeb9
1 /*
2 * anytun
4 * The secure anycast tunneling protocol (satp) defines a protocol used
5 * for communication between any combination of unicast and anycast
6 * tunnel endpoints. It has less protocol overhead than IPSec in Tunnel
7 * mode and allows tunneling of every ETHER TYPE protocol (e.g.
8 * ethernet, ip, arp ...). satp directly includes cryptography and
9 * message authentication based on the methodes used by SRTP. It is
10 * intended to deliver a generic, scaleable and secure solution for
11 * tunneling and relaying of packets of any protocol.
14 * Copyright (C) 2007-2008 Othmar Gsenger, Erwin Nindl,
15 * Christian Pointner <satp@wirdorange.org>
17 * This file is part of Anytun.
19 * Anytun is free software: you can redistribute it and/or modify
20 * it under the terms of the GNU General Public License version 3 as
21 * published by the Free Software Foundation.
23 * Anytun is distributed in the hope that it will be useful,
24 * but WITHOUT ANY WARRANTY; without even the implied warranty of
25 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
26 * GNU General Public License for more details.
28 * You should have received a copy of the GNU General Public License
29 * along with anytun. If not, see <http://www.gnu.org/licenses/>.
32 #ifndef _DAEMON_HPP
33 #define _DAEMON_HPP
34 #ifndef NODAEMON
36 #include <poll.h>
37 #include <fcntl.h>
38 #include <pwd.h>
39 #include <grp.h>
40 #include <sys/wait.h>
41 #include <sys/stat.h>
42 #include <unistd.h>
44 void chrootAndDrop(std::string const& chrootdir, std::string const& username)
46 if (getuid() != 0)
48 std::cerr << "this programm has to be run as root in order to run in a chroot" << std::endl;
49 exit(-1);
52 struct passwd *pw = getpwnam(username.c_str());
53 if(pw) {
54 if(chroot(chrootdir.c_str()))
56 std::cerr << "can't chroot to " << chrootdir << std::endl;
57 exit(-1);
59 cLog.msg(Log::PRIO_NOTICE) << "we are in chroot jail (" << chrootdir << ") now" << std::endl;
60 if(chdir("/"))
62 std::cerr << "can't change to /" << std::endl;
63 exit(-1);
65 if (initgroups(pw->pw_name, pw->pw_gid) || setgid(pw->pw_gid) || setuid(pw->pw_uid))
67 std::cerr << "can't drop to user " << username << " " << pw->pw_uid << ":" << pw->pw_gid << std::endl;
68 exit(-1);
70 cLog.msg(Log::PRIO_NOTICE) << "dropped user to " << username << " " << pw->pw_uid << ":" << pw->pw_gid << std::endl;
72 else
74 std::cerr << "unknown user " << username << std::endl;
75 exit(-1);
79 void daemonize()
81 pid_t pid;
83 pid = fork();
84 if(pid) exit(0);
85 setsid();
86 pid = fork();
87 if(pid) exit(0);
89 // std::cout << "running in background now..." << std::endl;
91 int fd;
92 // for (fd=getdtablesize();fd>=0;--fd) // close all file descriptors
93 for (fd=0;fd<=2;fd++) // close all file descriptors
94 close(fd);
95 fd = open("/dev/null",O_RDWR); // stdin
96 if(fd == -1)
97 cLog.msg(Log::PRIO_WARNING) << "can't open stdin (chroot and no link to /dev/null?)";
98 else {
99 if(dup(fd) == -1) // stdout
100 cLog.msg(Log::PRIO_WARNING) << "can't open stdout";
101 if(dup(fd) == -1) // stderr
102 cLog.msg(Log::PRIO_WARNING) << "can't open stderr";
104 umask(027);
106 #endif
107 #endif