svn cleanup
[anytun.git] / anytun-controld.cpp
blob204694ea3b4ff3e6be6ba9a047a386c212815c6e
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 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
31 #include <iostream>
32 #include <fstream>
33 #include <poll.h>
34 #include <fcntl.h>
35 #include <pwd.h>
36 #include <grp.h>
38 #include "datatypes.h"
40 #include "log.h"
41 #include "signalController.h"
42 #include "anymuxOptions.h"
44 #include "muxSocket.h"
45 #include "Sockets/ListenSocket.h"
46 #include "Sockets/SocketHandler.h"
49 class ThreadParam
51 public:
52 ThreadParam() : addr(""), port(0) {};
53 std::string addr;
54 u_int16_t port;
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) )
65 pthread_exit(NULL);
67 Utility::ResolveLocal(); // resolve local hostname
68 h.Add(&l);
69 h.Select(1,0);
70 while (1) {
71 h.Select(1,0);
75 void chrootAndDrop(std::string const& chrootdir, std::string const& username)
77 if (getuid() != 0)
79 std::cerr << "this programm has to be run as root in order to run in a chroot" << std::endl;
80 exit(-1);
83 struct passwd *pw = getpwnam(username.c_str());
84 if(pw) {
85 if(chroot(chrootdir.c_str()))
87 std::cerr << "can't chroot to " << chrootdir << std::endl;
88 exit(-1);
90 cLog.msg(Log::PRIO_NOTICE) << "we are in chroot jail (" << chrootdir << ") now" << std::endl;
91 chdir("/");
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;
95 exit(-1);
97 cLog.msg(Log::PRIO_NOTICE) << "dropped user to " << username << " " << pw->pw_uid << ":" << pw->pw_gid << std::endl;
99 else
101 std::cerr << "unknown user " << username << std::endl;
102 exit(-1);
106 void daemonize()
108 pid_t pid;
110 pid = fork();
111 if(pid) exit(0);
112 setsid();
113 pid = fork();
114 if(pid) exit(0);
116 // std::cout << "running in background now..." << std::endl;
118 int fd;
119 // for (fd=getdtablesize();fd>=0;--fd) // close all file descriptors
120 for (fd=0;fd<=2;fd++) // close all file descriptors
121 close(fd);
122 fd=open("/dev/null",O_RDWR); // stdin
123 dup(fd); // stdout
124 dup(fd); // stderr
125 umask(027);
128 int main(int argc, char* argv[])
130 if(!gOpt.parse(argc, argv))
132 gOpt.printUsage();
133 exit(-1);
136 std::ifstream file( gOpt.getFileName().c_str() );
137 if( file.is_open() )
138 file.close();
139 else
141 std::cout << "ERROR: unable to open file!" << std::endl;
142 exit(-1);
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;
153 if(gOpt.getChroot())
154 chrootAndDrop(gOpt.getChrootDir(), gOpt.getUsername());
155 if(gOpt.getDaemonize())
156 daemonize();
158 if(pidFile.is_open()) {
159 pid_t pid = getpid();
160 pidFile << pid;
161 pidFile.close();
164 SignalController sig;
165 sig.init();
167 ThreadParam p;
168 p.addr = gOpt.getBindToAddr();
169 p.port = gOpt.getBindToPort();
170 pthread_t syncListenerThread;
171 pthread_create(&syncListenerThread, NULL, syncListener, &p);
173 int ret = sig.run();
175 pthread_cancel(syncListenerThread);
177 pthread_join(syncListenerThread, NULL);
179 return ret;