00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00024 #include "config.h"
00025
00026 #include <memory>
00027 #include <netdb.h>
00028 #include <sys/socket.h>
00029 #include <sys/types.h>
00030 #include <sys/un.h>
00031
00032 #include <scalestack/kernel/module.h>
00033 #include <scalestack/kernel/option.h>
00034 #include <scalestack/network/local/local.h>
00035 #include <scalestack/network/local/stream/listener.h>
00036 #include <scalestack/network/local/stream/listener_service.h>
00037 #include <scalestack/network/stream_service.h>
00038
00039 using namespace std;
00040
00041 namespace scalestack
00042 {
00043 namespace network
00044 {
00045 namespace local
00046 {
00047 namespace stream
00048 {
00049
00050
00051
00052
00053
00054 void listener_service::options(kernel::module& module,
00055 const std::string& addresses)
00056 {
00057 module.add_option("addresses", _("List of local sockets to listen on."),
00058 "SOCKET[,SOCKET]...", addresses);
00059 module.add_option("backlog", _("Backlog value to use for listen(2)."),
00060 "BACKLOG", "64");
00061 }
00062
00063 listener_service::listener_service(kernel::module& module,
00064 std::auto_ptr<stream_service_provider> stream_service_provider):
00065 network::listener_service(module, stream_service_provider)
00066 {
00067 }
00068
00069 listener_service::~listener_service()
00070 {
00071 _handler_service.stop();
00072 }
00073
00074 void listener_service::add_listeners(void)
00075 {
00076 add_listeners(_module.get_option("addresses").get_value());
00077 }
00078
00079 void listener_service::add_listeners(const std::string& addresses)
00080 {
00081 string::size_type current = 0;
00082
00083 do
00084 {
00085 string::size_type next = addresses.find_first_of(",", current);
00086 string address = addresses.substr(current, next - current);
00087
00088 struct addrinfo addrinfo;
00089 struct sockaddr_un sockaddr;
00090 set_address(addrinfo, sockaddr, SOCK_STREAM, address);
00091
00092 auto_ptr<listener> new_listener(
00093 new listener(_handler_service,
00094 addrinfo,
00095 _module.get_option("backlog").get_int_value(),
00096 *_stream_service_provider,
00097 address));
00098 _module.log_notice(_("Local stream listener bound to %s"), address.c_str());
00099 new_listener->start();
00100 new_listener.release();
00101
00102 current = addresses.find_first_not_of(",", next);
00103 }
00104 while (current != string::npos);
00105 }
00106
00107 }
00108 }
00109 }
00110 }