From 8cb60ca0a52f5e11bac27da542c153d9e8ed2551 Mon Sep 17 00:00:00 2001 From: Christian Pointner Date: Thu, 28 Feb 2008 20:57:22 +0000 Subject: anyrtpproxy almost finished --- anyrtpproxy/anyrtpproxy.cpp | 158 +++++++++++++++++++++++--------------------- 1 file changed, 82 insertions(+), 76 deletions(-) (limited to 'anyrtpproxy/anyrtpproxy.cpp') diff --git a/anyrtpproxy/anyrtpproxy.cpp b/anyrtpproxy/anyrtpproxy.cpp index b5998e2..311dc4f 100644 --- a/anyrtpproxy/anyrtpproxy.cpp +++ b/anyrtpproxy/anyrtpproxy.cpp @@ -1,5 +1,9 @@ #include +#include +#include +#include + #include "../datatypes.h" #include "../log.h" @@ -8,93 +12,95 @@ #include "../buffer.h" #include "options.h" +#include #define MAX_PACKET_SIZE 1500 -void* worker(void* dont_use_me) +void* worker(void* l) { + IfListElement* interface = reinterpret_cast(l); + try { + UDPSocket recv_sock(interface->host_, interface->port_); + UDPSocket send_sock; + IfList remote_host_list = gOpt.getRemoteHosts(); + + cLog.msg(Log::PRIO_NOTICE) << "worker listening on: " << interface->toString(); - UDPSocket sock("127.0.0.1", 22222); Buffer buf(u_int32_t(MAX_PACKET_SIZE)); - while(1) { string remote_host; u_int16_t remote_port; buf.setLength(MAX_PACKET_SIZE); - u_int32_t len = sock.recvFrom(buf.getBuf(), buf.getLength(), remote_host, remote_port); + u_int32_t len = recv_sock.recvFrom(buf.getBuf(), buf.getLength(), remote_host, remote_port); buf.setLength(len); - std::cout << "Received UDP Packet from: " << remote_host << ":" << remote_port << std::endl; - std::cout << buf.getHexDump() << std::endl; - -// sendTo(buf, len, addr, port); + IfList::const_iterator it = remote_host_list.begin(); + for(;it != remote_host_list.end(); it++) + send_sock.sendTo(buf.getBuf(), buf.getLength(), it->host_, it->port_); } } catch(std::exception &e) { - std::cout << "an error happend: " << e.what() << std::endl; + cLog.msg(Log::PRIO_ERR) << "worker(" << interface->toString() << ") exiting because: " << e.what() << std::endl; } pthread_exit(NULL); } +void chrootAndDrop(string const& chrootdir, string const& username) +{ + if (getuid() != 0) + { + std::cerr << "this programm has to be run as root in order to run in a chroot" << std::endl; + exit(-1); + } + + struct passwd *pw = getpwnam(username.c_str()); + if(pw) { + if(chroot(chrootdir.c_str())) + { + std::cerr << "can't chroot to " << chrootdir << std::endl; + exit(-1); + } + std::cout << "we are in chroot jail (" << chrootdir << ") now" << std::endl; + chdir("/"); + if (initgroups(pw->pw_name, pw->pw_gid) || setgid(pw->pw_gid) || setuid(pw->pw_uid)) + { + std::cerr << "can't drop to user " << username << " " << pw->pw_uid << ":" << pw->pw_gid << std::endl; + exit(-1); + } + std::cout << "dropped user to " << username << " " << pw->pw_uid << ":" << pw->pw_gid << std::endl; + } + else + { + std::cerr << "unknown user " << username << std::endl; + exit(-1); + } +} +void daemonize() +{ + pid_t pid; - -// void chrootAndDrop(string const& chrootdir, string const& username) -// { -// if (getuid() != 0) -// { -// std::cerr << "this programm has to be run as root in order to run in a chroot" << std::endl; -// exit(-1); -// } - -// struct passwd *pw = getpwnam(username.c_str()); -// if(pw) { -// if(chroot(chrootdir.c_str())) -// { -// std::cerr << "can't chroot to " << chrootdir << std::endl; -// exit(-1); -// } -// std::cout << "we are in chroot jail (" << chrootdir << ") now" << std::endl; -// chdir("/"); -// if (initgroups(pw->pw_name, pw->pw_gid) || setgid(pw->pw_gid) || setuid(pw->pw_uid)) -// { -// std::cerr << "can't drop to user " << username << " " << pw->pw_uid << ":" << pw->pw_gid << std::endl; -// exit(-1); -// } -// std::cout << "dropped user to " << username << " " << pw->pw_uid << ":" << pw->pw_gid << std::endl; -// } -// else -// { -// std::cerr << "unknown user " << username << std::endl; -// exit(-1); -// } -// } - -// void daemonize() -// { -// pid_t pid; - -// pid = fork(); -// if(pid) exit(0); -// setsid(); -// pid = fork(); -// if(pid) exit(0); + pid = fork(); + if(pid) exit(0); + setsid(); + pid = fork(); + if(pid) exit(0); -// std::cout << "running in background now..." << std::endl; - -// int fd; -// for (fd=getdtablesize();fd>=0;--fd) // close all file descriptors -// close(fd); -// fd=open("/dev/null",O_RDWR); // stdin -// dup(fd); // stdout -// dup(fd); // stderr -// umask(027); -// } + std::cout << "running in background now..." << std::endl; + + int fd; + for (fd=getdtablesize();fd>=0;--fd) // close all file descriptors + close(fd); + fd=open("/dev/null",O_RDWR); // stdin + dup(fd); // stdout + dup(fd); // stderr + umask(027); +} int main(int argc, char* argv[]) @@ -106,28 +112,28 @@ int main(int argc, char* argv[]) exit(-1); } -// if(gOpt.chroot) -// chrootAndDrop(gOpt.getChrootDir, gOpt.getUsername); -// if(testSetPid(gOpt.pidFilename)) -// { -// std::cout << "exiting..." << std::endl; -// return -1; -// } -// if(gOpt.daemonize) -// daemonize(gOpt.pidFilename); - + if(gOpt.getChroot()) + chrootAndDrop(gOpt.getChrootDir(), gOpt.getUsername()); + if(gOpt.getDaemonize()) + daemonize(); + cLog.setLogName("anyrtpproxy"); cLog.msg(Log::PRIO_NOTICE) << "anyrtpproxy started..."; - + SignalController sig; sig.init(); + - pthread_t workerThread; - pthread_create(&workerThread, NULL, worker, NULL); - pthread_detach(workerThread); - + IfList listeners(gOpt.getLocalInterfaces()); + IfList::iterator it = listeners.begin(); + for(;it != listeners.end();++it) + { + pthread_t workerThread; + pthread_create(&workerThread, NULL, worker, static_cast(&(*it))); + pthread_detach(workerThread); + } int ret = sig.run(); - + return ret; } -- cgit v1.2.3