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/>.
44 void chrootAndDrop(std::string
const& chrootdir
, std::string
const& username
)
48 std::cerr
<< "this programm has to be run as root in order to run in a chroot" << std::endl
;
52 struct passwd
*pw
= getpwnam(username
.c_str());
54 if(chroot(chrootdir
.c_str()))
56 std::cerr
<< "can't chroot to " << chrootdir
<< std::endl
;
59 cLog
.msg(Log::PRIO_NOTICE
) << "we are in chroot jail (" << chrootdir
<< ") now" << std::endl
;
62 std::cerr
<< "can't change to /" << std::endl
;
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
;
70 cLog
.msg(Log::PRIO_NOTICE
) << "dropped user to " << username
<< " " << pw
->pw_uid
<< ":" << pw
->pw_gid
<< std::endl
;
74 std::cerr
<< "unknown user " << username
<< std::endl
;
89 // std::cout << "running in background now..." << std::endl;
92 // for (fd=getdtablesize();fd>=0;--fd) // close all file descriptors
93 for (fd
=0;fd
<=2;fd
++) // close all file descriptors
95 fd
= open("/dev/null",O_RDWR
); // stdin
97 cLog
.msg(Log::PRIO_WARNING
) << "can't open stdin (chroot and no link to /dev/null?)";
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";