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-2009 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 as published by
21 * the Free Software Foundation, either version 3 of the License, or
24 * Anytun is distributed in the hope that it will be useful,
25 * but WITHOUT ANY WARRANTY; without even the implied warranty of
26 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
27 * GNU General Public License for more details.
29 * You should have received a copy of the GNU General Public License
30 * along with anytun. If not, see <http://www.gnu.org/licenses/>.
33 #ifndef ANYTUN_daemon_hpp_INCLUDED
34 #define ANYTUN_daemon_hpp_INCLUDED
46 #include "anytunError.h"
52 PrivInfo(std::string const& username, std::string const& groupname)
60 pw_ = getpwnam(username.c_str());
62 AnytunError::throwErr() << "unkown user " << username;
65 gr_ = getgrnam(groupname.c_str());
67 gr_ = getgrgid(pw_->pw_gid);
70 AnytunError::throwErr() << "unkown group " << groupname;
78 if(setgid(gr_->gr_gid))
79 AnytunError::throwErr() << "setgid('" << gr_->gr_name << "') failed: " << AnytunErrno(errno);
82 gr_list[0] = gr_->gr_gid;
83 if(setgroups (1, gr_list))
84 AnytunError::throwErr() << "setgroups(['" << gr_->gr_name << "']) failed: " << AnytunErrno(errno);
86 if(setuid(pw_->pw_uid))
87 AnytunError::throwErr() << "setuid('" << pw_->pw_name << "') failed: " << AnytunErrno(errno);
89 cLog.msg(Log::PRIO_NOTICE) << "dropped privileges to " << pw_->pw_name << ":" << gr_->gr_name;
98 void do_chroot(std::string const& chrootdir)
101 AnytunError::throwErr() << "this program has to be run as root in order to run in a chroot";
103 if(chroot(chrootdir.c_str()))
104 AnytunError::throwErr() << "can't chroot to " << chrootdir;
106 cLog.msg(Log::PRIO_NOTICE) << "we are in chroot jail (" << chrootdir << ") now" << std::endl;
108 AnytunError::throwErr() << "can't change to /";
113 std::ofstream pidFile;
114 if(gOpt.getPidFile() != "") {
115 pidFile.open(gOpt.getPidFile().c_str());
116 if(!pidFile.is_open())
117 AnytunError::throwErr() << "can't open pid file (" << gOpt.getPidFile() << "): " << AnytunErrno(errno);
124 AnytunError::throwErr() << "daemonizing failed at fork(): " << AnytunErrno(errno) << ", exitting";
131 AnytunError::throwErr() << "daemonizing failed at setsid(): " << AnytunErrno(errno) << ", exitting";
135 AnytunError::throwErr() << "daemonizing failed at fork(): " << AnytunErrno(errno) << ", exitting";
139 if ((chdir("/")) < 0)
140 AnytunError::throwErr() << "daemonizing failed at chdir(): " << AnytunErrno(errno) << ", exitting";
142 // std::cout << "running in background now..." << std::endl;
145 // for (fd=getdtablesize();fd>=0;--fd) // close all file descriptors
146 for (fd=0;fd<=2;fd++) // close all file descriptors
148 fd = open("/dev/null",O_RDWR); // stdin
150 cLog.msg(Log::PRIO_WARNING) << "can't open /dev/null as stdin";
152 if(dup(fd) == -1) // stdout
153 cLog.msg(Log::PRIO_WARNING) << "can't open /dev/null as stdout";
154 if(dup(fd) == -1) // stderr
155 cLog.msg(Log::PRIO_WARNING) << "can't open /dev/null as stderr";
158 if(pidFile.is_open()) {
159 pid_t pid = getpid();