]> git.llucax.com Git - software/posixx.git/blob - src/socket/unix.hpp
Move basic_socket.hpp to the socket directory
[software/posixx.git] / src / socket / unix.hpp
1 #ifndef POSIXX_SOCKET_UNIX_HPP_
2 #define POSIXX_SOCKET_UNIX_HPP_
3
4 #include "basic_socket.hpp" // posixx::socket
5
6 #include <sys/un.h> // sockaddr_un
7 #include <string> // std::string
8 #include <utility> // std::pair
9 #include <cstring> // memset, memcpy, memcmp
10
11 /// @file
12
13 namespace posixx { namespace socket {
14
15 /// Unix (local) sockets
16 namespace unix {
17
18 /// Unix socket address
19 struct sockaddr: sockaddr_un
20 {
21
22         /// Create an empty unix socket address.
23         sockaddr() throw ();
24
25         /**
26          * Create a unix socket address.
27          *
28          * @param path Path to the socket (should be less than ::PATH_MAX
29          *             characters long).
30          */
31         sockaddr(const std::string& path) throw (std::logic_error);
32
33         /// Length of this unix socket address
34         socklen_t length() const throw ();
35
36         /// Get the path of this unix socket address
37         std::string path() const throw ();
38
39         /// Compare two unix socket addresses
40         bool operator == (const sockaddr& other) const throw ();
41
42 }; // struct sockaddr
43
44 /// Unix socket traits
45 struct traits
46 {
47         /// Socket address type.
48         typedef posixx::socket::unix::sockaddr sockaddr;
49         /// Protocol family.
50         enum { PF = PF_UNIX };
51 };
52
53 /// Unix socket
54 typedef posixx::socket::basic_socket< traits > socket;
55
56 /// Pair of unix sockets
57 typedef std::pair< socket*, socket* > pair_type;
58
59 /// Create a pair of connected unix sockets
60 pair_type pair(type type, int protocol = 0) throw (posixx::error);
61
62 } } } // namespace posixx::socket::unix
63
64
65
66 inline
67 posixx::socket::unix::sockaddr::sockaddr() throw ()
68 {
69         sun_family = AF_UNIX;
70 }
71
72 inline
73 posixx::socket::unix::sockaddr::sockaddr(const std::string& path)
74                 throw (std::logic_error)
75 {
76         if (path.size() >= sizeof(sun_path))
77                 throw std::logic_error("path too long");
78         sun_family = AF_UNIX;
79         memcpy(sun_path, path.c_str(), path.size() + 1); // \0
80 }
81
82 inline
83 socklen_t posixx::socket::unix::sockaddr::length() const throw ()
84 {
85         return sizeof(sun_family) + strlen(sun_path);
86 }
87
88 inline
89 std::string posixx::socket::unix::sockaddr::path() const throw ()
90 {
91         return std::string(sun_path);
92 }
93
94 inline
95 bool posixx::socket::unix::sockaddr::operator == (const sockaddr& other)
96                 const throw ()
97 {
98         return sun_family == other.sun_family
99                         && !strncmp(sun_path, other.sun_path, sizeof(sun_path));
100 }
101
102 inline
103 posixx::socket::unix::pair_type posixx::socket::unix::pair(type type,
104                 int protocol) throw (posixx::error)
105 {
106         return posixx::socket::pair< socket >(type, protocol);
107 }
108
109 #endif // POSIXX_SOCKET_UNIX_HPP_