From: Martin Willi Date: Thu, 27 Jun 2013 15:25:51 +0000 (+0200) Subject: stream: add support for TCP stream services X-Git-Tag: 5.1.0rc1~10^2~43 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c5597a4b5682f05841be7d2b4d2ed578f956cb13;p=thirdparty%2Fstrongswan.git stream: add support for TCP stream services --- diff --git a/src/libstrongswan/networking/streams/stream_manager.c b/src/libstrongswan/networking/streams/stream_manager.c index 0141e1d8da..db38977c1c 100644 --- a/src/libstrongswan/networking/streams/stream_manager.c +++ b/src/libstrongswan/networking/streams/stream_manager.c @@ -250,6 +250,7 @@ METHOD(stream_manager_t, destroy, void, remove_stream(this, stream_create_unix); remove_stream(this, stream_create_tcp); remove_service(this, stream_service_create_unix); + remove_service(this, stream_service_create_tcp); this->streams->destroy(this->streams); this->services->destroy(this->services); @@ -285,6 +286,7 @@ stream_manager_t *stream_manager_create() add_stream(this, "unix://", stream_create_unix); add_stream(this, "tcp://", stream_create_tcp); add_service(this, "unix://", stream_service_create_unix); + add_service(this, "tcp://", stream_service_create_tcp); return &this->public; } diff --git a/src/libstrongswan/networking/streams/stream_service.c b/src/libstrongswan/networking/streams/stream_service.c index 609ff3cac2..ab7a7e38fc 100644 --- a/src/libstrongswan/networking/streams/stream_service.c +++ b/src/libstrongswan/networking/streams/stream_service.c @@ -205,3 +205,46 @@ stream_service_t *stream_service_create_unix(char *uri) } return stream_service_create_from_fd(fd); } + +/** + * See header + */ +stream_service_t *stream_service_create_tcp(char *uri) +{ + union { + struct sockaddr_in in; + struct sockaddr_in6 in6; + struct sockaddr sa; + } addr; + int fd, len, on = 1; + + len = stream_parse_uri_tcp(uri, &addr.sa); + if (len == -1) + { + DBG1(DBG_NET, "invalid stream URI: '%s'", uri); + return NULL; + } + fd = socket(addr.sa.sa_family, SOCK_STREAM, 0); + if (fd < 0) + { + DBG1(DBG_NET, "opening socket '%s' failed: %s", uri, strerror(errno)); + return NULL; + } + if (setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) != 0) + { + DBG1(DBG_NET, "SO_REUSADDR on '%s' failed: %s", uri, strerror(errno)); + } + if (bind(fd, &addr.sa, len) < 0) + { + DBG1(DBG_NET, "binding socket '%s' failed: %s", uri, strerror(errno)); + close(fd); + return NULL; + } + if (listen(fd, 5) < 0) + { + DBG1(DBG_NET, "listen on socket '%s' failed: %s", uri, strerror(errno)); + close(fd); + return NULL; + } + return stream_service_create_from_fd(fd); +} diff --git a/src/libstrongswan/networking/streams/stream_service.h b/src/libstrongswan/networking/streams/stream_service.h index f864a7aeb7..f1dc643f8d 100644 --- a/src/libstrongswan/networking/streams/stream_service.h +++ b/src/libstrongswan/networking/streams/stream_service.h @@ -83,4 +83,12 @@ stream_service_t *stream_service_create_from_fd(int fd); */ stream_service_t *stream_service_create_unix(char *uri); +/** + * Create a service instance for TCP sockets. + * + * @param uri TCP socket specific URI, must start with "tcp://" + * @return stream_service instance, NULL on failure + */ +stream_service_t *stream_service_create_tcp(char *uri); + #endif /** STREAM_SERVICE_H_ @}*/