]> git.tdb.fi Git - libs/net.git/blob - source/net/socket.cpp
Use default member initializers where possible
[libs/net.git] / source / net / socket.cpp
1 #include "platform_api.h"
2 #include <msp/core/systemerror.h>
3 #include <msp/io/handle_private.h>
4 #include "sockaddr_private.h"
5 #include "socket.h"
6 #include "socket_private.h"
7
8 using namespace std;
9
10 namespace Msp {
11 namespace Net {
12
13 Socket::Socket(const Private &p):
14         priv(new Private)
15 {
16         mode = IO::M_RDWR;
17
18         priv->handle = p.handle;
19
20         SockAddr::SysAddr sa;
21         getsockname(priv->handle, reinterpret_cast<sockaddr *>(&sa.addr), &sa.size);
22         local_addr = SockAddr::new_from_sys(sa);
23
24         platform_init();
25 }
26
27 Socket::Socket(Family af, int type, int proto):
28         priv(new Private)
29 {
30         mode = IO::M_RDWR;
31
32         // TODO use SOCK_CLOEXEC on Linux
33         priv->handle = socket(family_to_sys(af), type, proto);
34
35         platform_init();
36 }
37
38 Socket::~Socket()
39 {
40         platform_cleanup();
41
42         delete local_addr;
43         delete priv;
44 }
45
46 void Socket::set_block(bool b)
47 {
48         IO::adjust_mode(mode, IO::M_NONBLOCK, !b);
49         priv->set_block(b);
50 }
51
52 void Socket::set_inherit(bool i)
53 {
54         IO::adjust_mode(mode, IO::M_INHERIT, i);
55         priv->set_inherit(i);
56 }
57
58 const IO::Handle &Socket::get_handle(IO::Mode)
59 {
60         // TODO could this be implemented somehow?
61         throw unsupported("Socket::get_handle");
62 }
63
64 const IO::Handle &Socket::get_event_handle()
65 {
66         return priv->event;
67 }
68
69 void Socket::bind(const SockAddr &addr)
70 {
71         SockAddr::SysAddr sa = addr.to_sys();
72
73         int err = ::bind(priv->handle, reinterpret_cast<sockaddr *>(&sa.addr), sa.size);
74         if(err==-1)
75                 throw system_error("bind");
76
77         delete local_addr;
78         local_addr = addr.copy();
79 }
80
81 const SockAddr &Socket::get_local_address() const
82 {
83         if(local_addr==0)
84                 throw bad_socket_state("not bound");
85         return *local_addr;
86 }
87
88 void Socket::set_socket_events(unsigned e)
89 {
90         IO::PollEvent pe = static_cast<IO::PollEvent>(e&4095);
91         if(e&S_CONNECT)
92                 pe = pe|IO::P_OUTPUT;
93         if(e&S_ACCEPT)
94                 pe = pe|IO::P_INPUT;
95
96         set_platform_events(e);
97         set_events(pe);
98 }
99
100 } // namespace Net
101 } // namespace Msp