#include "platform_api.h"
+#include "socket.h"
#include <msp/core/systemerror.h>
#include <msp/io/handle_private.h>
#include "sockaddr_private.h"
-#include "socket.h"
#include "socket_private.h"
+using namespace std;
+
namespace Msp {
namespace Net {
Socket::Socket(const Private &p):
- priv(new Private),
- local_addr(0)
+ priv(make_unique<Private>())
{
mode = IO::M_RDWR;
SockAddr::SysAddr sa;
getsockname(priv->handle, reinterpret_cast<sockaddr *>(&sa.addr), &sa.size);
- local_addr = SockAddr::new_from_sys(sa);
+ local_addr.reset(SockAddr::new_from_sys(sa));
platform_init();
}
Socket::Socket(Family af, int type, int proto):
- priv(new Private),
- local_addr(0)
+ priv(make_unique<Private>())
{
mode = IO::M_RDWR;
+ // TODO use SOCK_CLOEXEC on Linux
priv->handle = socket(family_to_sys(af), type, proto);
platform_init();
Socket::~Socket()
{
platform_cleanup();
-
- delete local_addr;
- delete priv;
}
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 unsupported("Socket::get_handle");
+}
+
const IO::Handle &Socket::get_event_handle()
{
return priv->event;
if(err==-1)
throw system_error("bind");
- delete local_addr;
- local_addr = addr.copy();
+ local_addr.reset(addr.copy());
}
const SockAddr &Socket::get_local_address() const
{
- if(local_addr==0)
+ if(!local_addr)
throw bad_socket_state("not bound");
return *local_addr;
}