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 anytun.org <satp@wirdorange.org>
16 * This program is free software; you can redistribute it and/or modify
17 * it under the terms of the GNU General Public License version 2
18 * as published by the Free Software Foundation.
20 * This program is distributed in the hope that it will be useful,
21 * but WITHOUT ANY WARRANTY; without even the implied warranty of
22 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
23 * GNU General Public License for more details.
25 * You should have received a copy of the GNU General Public License
26 * along with this program (see the file COPYING included with this
27 * distribution); if not, write to the Free Software Foundation, Inc.,
28 * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
38 #include "datatypes.h"
41 #include "signalController.h"
42 #include "anymuxOptions.h"
44 #include "muxSocket.h"
45 #include "Sockets/ListenSocket.h"
46 #include "Sockets/SocketHandler.h"
52 ThreadParam() : addr(""), port(0) {};
58 void* syncListener(void* p
)
60 ThreadParam
* param
= reinterpret_cast<ThreadParam
*>(p
);
61 SOCKETS_NAMESPACE::SocketHandler h
;
62 SOCKETS_NAMESPACE::ListenSocket
<MuxSocket
> l(h
,true);
64 if( l
.Bind(param
->addr
, param
->port
) )
67 Utility::ResolveLocal(); // resolve local hostname
75 void chrootAndDrop(std::string
const& chrootdir
, std::string
const& username
)
79 std::cerr
<< "this programm has to be run as root in order to run in a chroot" << std::endl
;
83 struct passwd
*pw
= getpwnam(username
.c_str());
85 if(chroot(chrootdir
.c_str()))
87 std::cerr
<< "can't chroot to " << chrootdir
<< std::endl
;
90 cLog
.msg(Log::PRIO_NOTICE
) << "we are in chroot jail (" << chrootdir
<< ") now" << std::endl
;
92 if (initgroups(pw
->pw_name
, pw
->pw_gid
) || setgid(pw
->pw_gid
) || setuid(pw
->pw_uid
))
94 std::cerr
<< "can't drop to user " << username
<< " " << pw
->pw_uid
<< ":" << pw
->pw_gid
<< std::endl
;
97 cLog
.msg(Log::PRIO_NOTICE
) << "dropped user to " << username
<< " " << pw
->pw_uid
<< ":" << pw
->pw_gid
<< std::endl
;
101 std::cerr
<< "unknown user " << username
<< std::endl
;
116 // std::cout << "running in background now..." << std::endl;
119 // for (fd=getdtablesize();fd>=0;--fd) // close all file descriptors
120 for (fd
=0;fd
<=2;fd
++) // close all file descriptors
122 fd
=open("/dev/null",O_RDWR
); // stdin
128 int main(int argc
, char* argv
[])
130 if(!gOpt
.parse(argc
, argv
))
136 std::ifstream
file( gOpt
.getFileName().c_str() );
141 std::cout
<< "ERROR: unable to open file!" << std::endl
;
145 std::ofstream pidFile
;
146 if(gOpt
.getPidFile() != "") {
147 pidFile
.open(gOpt
.getPidFile().c_str());
148 if(!pidFile
.is_open()) {
149 std::cout
<< "can't open pid file" << std::endl
;
154 chrootAndDrop(gOpt
.getChrootDir(), gOpt
.getUsername());
155 if(gOpt
.getDaemonize())
158 if(pidFile
.is_open()) {
159 pid_t pid
= getpid();
164 SignalController sig
;
168 p
.addr
= gOpt
.getBindToAddr();
169 p
.port
= gOpt
.getBindToPort();
170 pthread_t syncListenerThread
;
171 pthread_create(&syncListenerThread
, NULL
, syncListener
, &p
);
175 pthread_cancel(syncListenerThread
);
177 pthread_join(syncListenerThread
, NULL
);