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/>.
39 #include "datatypes.h"
42 #include "signalController.h"
43 #include "anyCtrOptions.h"
45 #include "anyCtrSocket.h"
46 #include "Sockets/ListenSocket.h"
47 #include "Sockets/SocketHandler.h"
53 ThreadParam() : addr(""), port(0) {};
59 void* syncListener(void* p
)
61 ThreadParam
* param
= reinterpret_cast<ThreadParam
*>(p
);
62 SOCKETS_NAMESPACE::SocketHandler h
;
63 SOCKETS_NAMESPACE::ListenSocket
<MuxSocket
> l(h
,true);
65 if( l
.Bind(param
->addr
, param
->port
) )
68 Utility::ResolveLocal(); // resolve local hostname
76 void chrootAndDrop(std::string
const& chrootdir
, std::string
const& username
)
80 std::cerr
<< "this programm has to be run as root in order to run in a chroot" << std::endl
;
84 struct passwd
*pw
= getpwnam(username
.c_str());
86 if(chroot(chrootdir
.c_str()))
88 std::cerr
<< "can't chroot to " << chrootdir
<< std::endl
;
91 cLog
.msg(Log::PRIO_NOTICE
) << "we are in chroot jail (" << chrootdir
<< ") now" << std::endl
;
93 if (initgroups(pw
->pw_name
, pw
->pw_gid
) || setgid(pw
->pw_gid
) || setuid(pw
->pw_uid
))
95 std::cerr
<< "can't drop to user " << username
<< " " << pw
->pw_uid
<< ":" << pw
->pw_gid
<< std::endl
;
98 cLog
.msg(Log::PRIO_NOTICE
) << "dropped user to " << username
<< " " << pw
->pw_uid
<< ":" << pw
->pw_gid
<< std::endl
;
102 std::cerr
<< "unknown user " << username
<< std::endl
;
117 // std::cout << "running in background now..." << std::endl;
120 // for (fd=getdtablesize();fd>=0;--fd) // close all file descriptors
121 for (fd
=0;fd
<=2;fd
++) // close all file descriptors
123 fd
=open("/dev/null",O_RDWR
); // stdin
129 int main(int argc
, char* argv
[])
131 if(!gOpt
.parse(argc
, argv
))
137 std::ifstream
file( gOpt
.getFileName().c_str() );
142 std::cout
<< "ERROR: unable to open file!" << std::endl
;
146 std::ofstream pidFile
;
147 if(gOpt
.getPidFile() != "") {
148 pidFile
.open(gOpt
.getPidFile().c_str());
149 if(!pidFile
.is_open()) {
150 std::cout
<< "can't open pid file" << std::endl
;
155 chrootAndDrop(gOpt
.getChrootDir(), gOpt
.getUsername());
156 if(gOpt
.getDaemonize())
159 if(pidFile
.is_open()) {
160 pid_t pid
= getpid();
165 SignalController sig
;
169 p
.addr
= gOpt
.getBindToAddr();
170 p
.port
= gOpt
.getBindToPort();
171 pthread_t syncListenerThread
;
172 pthread_create(&syncListenerThread
, NULL
, syncListener
, &p
);
176 pthread_cancel(syncListenerThread
);
178 pthread_join(syncListenerThread
, NULL
);