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