]> git.tdb.fi Git - libs/net.git/commitdiff
Implement the required virtual functions in Socket
authorMikko Rasa <tdb@tdb.fi>
Tue, 5 Dec 2017 06:40:46 +0000 (08:40 +0200)
committerMikko Rasa <tdb@tdb.fi>
Tue, 5 Dec 2017 06:40:46 +0000 (08:40 +0200)
source/net/socket.cpp
source/net/socket.h
source/net/socket_private.h
source/net/unix/socket.cpp
source/net/windows/socket.cpp

index e8e5eaf6275eddb27634a0d473377bed18570d8b..85cc9872a0df0a802555e80e63df446a8f568fc8 100644 (file)
@@ -5,6 +5,8 @@
 #include "socket.h"
 #include "socket_private.h"
 
+using namespace std;
+
 namespace Msp {
 namespace Net {
 
@@ -29,6 +31,7 @@ Socket::Socket(Family af, int type, int proto):
 {
        mode = IO::M_RDWR;
 
+       // TODO use SOCK_CLOEXEC on Linux
        priv->handle = socket(family_to_sys(af), type, proto);
 
        platform_init();
@@ -44,13 +47,22 @@ Socket::~Socket()
 
 void Socket::set_block(bool b)
 {
-       mode = (mode&~IO::M_NONBLOCK);
-       if(b)
-               mode = (mode|IO::M_NONBLOCK);
-
+       IO::adjust_mode(mode, IO::M_NONBLOCK, !b);
        priv->set_block(b);
 }
 
+void Socket::set_inherit(bool i)
+{
+       IO::adjust_mode(mode, IO::M_INHERIT, i);
+       priv->set_inherit(i);
+}
+
+const IO::Handle &Socket::get_handle(IO::Mode)
+{
+       // TODO could this be implemented somehow?
+       throw logic_error("Socket::get_handle");
+}
+
 const IO::Handle &Socket::get_event_handle()
 {
        return priv->event;
index 1f60f9bb2276942ce31e7eaf69612e4e67641f02..fe5c605049f84ab8396e11f49d0ceda1a3fe032c 100644 (file)
@@ -42,6 +42,8 @@ public:
        ~Socket();
 
        virtual void set_block(bool);
+       virtual void set_inherit(bool);
+       const IO::Handle &get_handle(IO::Mode);
        virtual const IO::Handle &get_event_handle();
 
        /** Associates the socket with a local address.  There must be no existing
index 742877b4516514b718a623c0185a025a11ddb66f..86ce587643e24b04262cc89564b5d236acb0d9c3 100644 (file)
@@ -22,6 +22,7 @@ struct Socket::Private
        IO::Handle event;
 
        void set_block(bool);
+       void set_inherit(bool);
        int set_option(int, int, const void *, socklen_t);
        int get_option(int, int, void *, socklen_t *);
 };
index 46c80b7a59000d4b36c788b7c566c5cddb570c15..a9e9c58362d0f44faad9ae310157ecfd345e5c83 100644 (file)
@@ -15,6 +15,7 @@ namespace Net {
 void Socket::platform_init()
 {
        *priv->event = priv->handle;
+       set_inherit(false);
 }
 
 void Socket::platform_cleanup()
@@ -40,6 +41,12 @@ void Socket::Private::set_block(bool b)
        fcntl(handle, F_SETFL, (flags&~O_NONBLOCK)|(b?0:O_NONBLOCK));
 }
 
+void Socket::Private::set_inherit(bool i)
+{
+       int flags = fcntl(handle, F_GETFD);
+       fcntl(handle, F_SETFD, (flags&~O_CLOEXEC)|(i?O_CLOEXEC:0));
+}
+
 int Socket::Private::set_option(int level, int optname, const void *optval, socklen_t optlen)
 {
        return setsockopt(handle, level, optname, optval, optlen);
index f4fab44c478d491f0677b333dfc26a853113be78..a7268e85a65f46bd91e1d752dbfcba4c5fc450c6 100644 (file)
@@ -70,6 +70,10 @@ void Socket::Private::set_block(bool b)
        ioctlsocket(handle, FIONBIO, &flag);
 }
 
+void Socket::Private::set_inherit(bool i)
+{
+}
+
 int Socket::Private::set_option(int level, int optname, const void *optval, socklen_t optlen)
 {
        return setsockopt(handle, level, optname, reinterpret_cast<const char *>(optval), optlen);