summaryrefslogtreecommitdiff
path: root/anyrtpproxy/anyrtpproxy.cpp
diff options
context:
space:
mode:
authorChristian Pointner <equinox@anytun.org>2008-02-28 20:57:22 +0000
committerChristian Pointner <equinox@anytun.org>2008-02-28 20:57:22 +0000
commit8cb60ca0a52f5e11bac27da542c153d9e8ed2551 (patch)
tree8531b3f5d94f68c1fa26866652bf6fe7deafab44 /anyrtpproxy/anyrtpproxy.cpp
parentll (diff)
anyrtpproxy almost finished
Diffstat (limited to 'anyrtpproxy/anyrtpproxy.cpp')
-rw-r--r--anyrtpproxy/anyrtpproxy.cpp158
1 files changed, 82 insertions, 76 deletions
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 <iostream>
+#include <fcntl.h>
+#include <pwd.h>
+#include <grp.h>
+
#include "../datatypes.h"
#include "../log.h"
@@ -8,93 +12,95 @@
#include "../buffer.h"
#include "options.h"
+#include <list>
#define MAX_PACKET_SIZE 1500
-void* worker(void* dont_use_me)
+void* worker(void* l)
{
+ IfListElement* interface = reinterpret_cast<IfListElement*>(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<void*>(&(*it)));
+ pthread_detach(workerThread);
+ }
int ret = sig.run();
-
+
return ret;
}