rubysl-socket 2.0.1 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (181) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +70 -16
  3. data/lib/rubysl/socket.rb +201 -1396
  4. data/lib/rubysl/socket/ancillary_data.rb +56 -0
  5. data/lib/rubysl/socket/bsd.rb +28 -0
  6. data/lib/rubysl/socket/error.rb +67 -0
  7. data/lib/rubysl/socket/foreign.rb +324 -0
  8. data/lib/rubysl/socket/foreign/addrinfo.rb +10 -0
  9. data/lib/rubysl/socket/foreign/hostent.rb +36 -0
  10. data/lib/rubysl/socket/foreign/ifaddrs.rb +129 -0
  11. data/lib/rubysl/socket/foreign/iovec.rb +18 -0
  12. data/lib/rubysl/socket/foreign/linger.rb +41 -0
  13. data/lib/rubysl/socket/foreign/msghdr.rb +41 -0
  14. data/lib/rubysl/socket/foreign/servent.rb +17 -0
  15. data/lib/rubysl/socket/foreign/sockaddr.rb +21 -0
  16. data/lib/rubysl/socket/foreign/sockaddr_in.rb +25 -0
  17. data/lib/rubysl/socket/foreign/sockaddr_in6.rb +25 -0
  18. data/lib/rubysl/socket/foreign/sockaddr_un.rb +29 -0
  19. data/lib/rubysl/socket/ipv6.rb +38 -0
  20. data/lib/rubysl/socket/linux.rb +16 -0
  21. data/lib/rubysl/socket/socket_options.rb +84 -0
  22. data/lib/rubysl/socket/version.rb +1 -1
  23. data/lib/socket.rb +45 -1
  24. data/lib/socket/addrinfo.rb +453 -0
  25. data/lib/socket/ancillary_data.rb +114 -0
  26. data/lib/socket/basic_socket.rb +295 -0
  27. data/lib/socket/constants.rb +41 -0
  28. data/lib/socket/ifaddr.rb +29 -0
  29. data/lib/socket/ip_socket.rb +37 -0
  30. data/lib/socket/mri.rb +928 -0
  31. data/lib/socket/option.rb +96 -0
  32. data/lib/socket/socket.rb +353 -0
  33. data/lib/socket/socket_error.rb +2 -0
  34. data/lib/socket/tcp_server.rb +78 -0
  35. data/lib/socket/tcp_socket.rb +109 -0
  36. data/lib/socket/udp_socket.rb +73 -0
  37. data/lib/socket/unix_server.rb +35 -0
  38. data/lib/socket/unix_socket.rb +78 -0
  39. data/rubysl-socket.gemspec +15 -10
  40. metadata +78 -293
  41. data/.gitignore +0 -17
  42. data/.travis.yml +0 -9
  43. data/Gemfile +0 -4
  44. data/Rakefile +0 -1
  45. data/spec/addrinfo/afamily_spec.rb +0 -5
  46. data/spec/addrinfo/bind_spec.rb +0 -5
  47. data/spec/addrinfo/canonname_spec.rb +0 -5
  48. data/spec/addrinfo/connect_from_spec.rb +0 -5
  49. data/spec/addrinfo/connect_spec.rb +0 -5
  50. data/spec/addrinfo/connect_to_spec.rb +0 -5
  51. data/spec/addrinfo/family_addrinfo_spec.rb +0 -5
  52. data/spec/addrinfo/foreach_spec.rb +0 -5
  53. data/spec/addrinfo/getaddrinfo_spec.rb +0 -5
  54. data/spec/addrinfo/getnameinfo_spec.rb +0 -5
  55. data/spec/addrinfo/inspect_sockaddr_spec.rb +0 -5
  56. data/spec/addrinfo/inspect_spec.rb +0 -5
  57. data/spec/addrinfo/ip_address_spec.rb +0 -5
  58. data/spec/addrinfo/ip_port_spec.rb +0 -5
  59. data/spec/addrinfo/ip_spec.rb +0 -9
  60. data/spec/addrinfo/ip_unpack_spec.rb +0 -5
  61. data/spec/addrinfo/ipv4_loopback_spec.rb +0 -5
  62. data/spec/addrinfo/ipv4_multicast_spec.rb +0 -5
  63. data/spec/addrinfo/ipv4_private_spec.rb +0 -5
  64. data/spec/addrinfo/ipv4_spec.rb +0 -5
  65. data/spec/addrinfo/ipv6_linklocal_spec.rb +0 -5
  66. data/spec/addrinfo/ipv6_loopback_spec.rb +0 -5
  67. data/spec/addrinfo/ipv6_mc_global_spec.rb +0 -5
  68. data/spec/addrinfo/ipv6_mc_linklocal_spec.rb +0 -5
  69. data/spec/addrinfo/ipv6_mc_nodelocal_spec.rb +0 -5
  70. data/spec/addrinfo/ipv6_mc_orglocal_spec.rb +0 -5
  71. data/spec/addrinfo/ipv6_mc_sitelocal_spec.rb +0 -5
  72. data/spec/addrinfo/ipv6_multicast_spec.rb +0 -5
  73. data/spec/addrinfo/ipv6_sitelocal_spec.rb +0 -5
  74. data/spec/addrinfo/ipv6_spec.rb +0 -5
  75. data/spec/addrinfo/ipv6_to_ipv4_spec.rb +0 -5
  76. data/spec/addrinfo/ipv6_unspecified_spec.rb +0 -5
  77. data/spec/addrinfo/ipv6_v4compat_spec.rb +0 -5
  78. data/spec/addrinfo/ipv6_v4mapped_spec.rb +0 -5
  79. data/spec/addrinfo/listen_spec.rb +0 -5
  80. data/spec/addrinfo/marshal_dump_spec.rb +0 -5
  81. data/spec/addrinfo/marshal_load_spec.rb +0 -5
  82. data/spec/addrinfo/pfamily_spec.rb +0 -5
  83. data/spec/addrinfo/protocol_spec.rb +0 -5
  84. data/spec/addrinfo/socktype_spec.rb +0 -5
  85. data/spec/addrinfo/tcp_spec.rb +0 -5
  86. data/spec/addrinfo/to_s_spec.rb +0 -5
  87. data/spec/addrinfo/to_sockaddr_spec.rb +0 -5
  88. data/spec/addrinfo/udp_spec.rb +0 -5
  89. data/spec/addrinfo/unix_path_spec.rb +0 -5
  90. data/spec/addrinfo/unix_spec.rb +0 -9
  91. data/spec/basicsocket/close_read_spec.rb +0 -42
  92. data/spec/basicsocket/close_write_spec.rb +0 -42
  93. data/spec/basicsocket/do_not_reverse_lookup_spec.rb +0 -78
  94. data/spec/basicsocket/for_fd_spec.rb +0 -37
  95. data/spec/basicsocket/getpeername_spec.rb +0 -24
  96. data/spec/basicsocket/getsockname_spec.rb +0 -27
  97. data/spec/basicsocket/getsockopt_spec.rb +0 -54
  98. data/spec/basicsocket/ioctl_spec.rb +0 -22
  99. data/spec/basicsocket/recv_nonblock_spec.rb +0 -6
  100. data/spec/basicsocket/recv_spec.rb +0 -76
  101. data/spec/basicsocket/send_spec.rb +0 -81
  102. data/spec/basicsocket/setsockopt_spec.rb +0 -333
  103. data/spec/basicsocket/shutdown_spec.rb +0 -5
  104. data/spec/constants/constants_spec.rb +0 -63
  105. data/spec/fixtures/classes.rb +0 -174
  106. data/spec/fixtures/send_io.txt +0 -1
  107. data/spec/ipsocket/addr_spec.rb +0 -72
  108. data/spec/ipsocket/getaddress_spec.rb +0 -26
  109. data/spec/ipsocket/peeraddr_spec.rb +0 -79
  110. data/spec/ipsocket/recvfrom_spec.rb +0 -64
  111. data/spec/option/int_spec.rb +0 -27
  112. data/spec/option/linger_spec.rb +0 -52
  113. data/spec/option/new_spec.rb +0 -32
  114. data/spec/shared/pack_sockaddr.rb +0 -26
  115. data/spec/shared/partially_closable_sockets.rb +0 -13
  116. data/spec/shared/recv_nonblock.rb +0 -33
  117. data/spec/shared/socketpair.rb +0 -35
  118. data/spec/socket/accept_nonblock_spec.rb +0 -27
  119. data/spec/socket/accept_spec.rb +0 -1
  120. data/spec/socket/bind_spec.rb +0 -80
  121. data/spec/socket/connect_nonblock_spec.rb +0 -62
  122. data/spec/socket/connect_spec.rb +0 -1
  123. data/spec/socket/for_fd_spec.rb +0 -29
  124. data/spec/socket/getaddrinfo_spec.rb +0 -120
  125. data/spec/socket/gethostbyaddr_spec.rb +0 -1
  126. data/spec/socket/gethostbyname_spec.rb +0 -26
  127. data/spec/socket/gethostname_spec.rb +0 -9
  128. data/spec/socket/getnameinfo_spec.rb +0 -57
  129. data/spec/socket/getservbyname_spec.rb +0 -24
  130. data/spec/socket/listen_spec.rb +0 -21
  131. data/spec/socket/new_spec.rb +0 -109
  132. data/spec/socket/pack_sockaddr_in_spec.rb +0 -6
  133. data/spec/socket/pack_sockaddr_un_spec.rb +0 -6
  134. data/spec/socket/pair_spec.rb +0 -6
  135. data/spec/socket/recvfrom_nonblock_spec.rb +0 -1
  136. data/spec/socket/recvfrom_spec.rb +0 -1
  137. data/spec/socket/sockaddr_in_spec.rb +0 -6
  138. data/spec/socket/sockaddr_un_spec.rb +0 -6
  139. data/spec/socket/socket_spec.rb +0 -37
  140. data/spec/socket/socketpair_spec.rb +0 -6
  141. data/spec/socket/sysaccept_spec.rb +0 -1
  142. data/spec/socket/unpack_sockaddr_in_spec.rb +0 -16
  143. data/spec/socket/unpack_sockaddr_un_spec.rb +0 -2
  144. data/spec/tcpserver/accept_nonblock_spec.rb +0 -30
  145. data/spec/tcpserver/accept_spec.rb +0 -60
  146. data/spec/tcpserver/gets_spec.rb +0 -17
  147. data/spec/tcpserver/listen_spec.rb +0 -1
  148. data/spec/tcpserver/new_spec.rb +0 -88
  149. data/spec/tcpserver/output_spec.rb +0 -8
  150. data/spec/tcpserver/readpartial_spec.rb +0 -8
  151. data/spec/tcpserver/sysaccept_spec.rb +0 -1
  152. data/spec/tcpsocket/gethostbyname_spec.rb +0 -62
  153. data/spec/tcpsocket/new_spec.rb +0 -5
  154. data/spec/tcpsocket/open_spec.rb +0 -5
  155. data/spec/tcpsocket/partially_closable_spec.rb +0 -20
  156. data/spec/tcpsocket/recv_nonblock_spec.rb +0 -31
  157. data/spec/tcpsocket/setsockopt_spec.rb +0 -49
  158. data/spec/tcpsocket/shared/new.rb +0 -85
  159. data/spec/udpsocket/bind_spec.rb +0 -33
  160. data/spec/udpsocket/connect_spec.rb +0 -1
  161. data/spec/udpsocket/new_spec.rb +0 -1
  162. data/spec/udpsocket/open_spec.rb +0 -12
  163. data/spec/udpsocket/recvfrom_nonblock_spec.rb +0 -1
  164. data/spec/udpsocket/send_spec.rb +0 -57
  165. data/spec/unixserver/accept_nonblock_spec.rb +0 -33
  166. data/spec/unixserver/accept_spec.rb +0 -64
  167. data/spec/unixserver/for_fd_spec.rb +0 -32
  168. data/spec/unixserver/new_spec.rb +0 -5
  169. data/spec/unixserver/open_spec.rb +0 -25
  170. data/spec/unixserver/shared/new.rb +0 -23
  171. data/spec/unixsocket/addr_spec.rb +0 -37
  172. data/spec/unixsocket/new_spec.rb +0 -5
  173. data/spec/unixsocket/open_spec.rb +0 -26
  174. data/spec/unixsocket/pair_spec.rb +0 -38
  175. data/spec/unixsocket/partially_closable_spec.rb +0 -25
  176. data/spec/unixsocket/path_spec.rb +0 -29
  177. data/spec/unixsocket/peeraddr_spec.rb +0 -29
  178. data/spec/unixsocket/recv_io_spec.rb +0 -40
  179. data/spec/unixsocket/recvfrom_spec.rb +0 -48
  180. data/spec/unixsocket/send_io_spec.rb +0 -30
  181. data/spec/unixsocket/shared/new.rb +0 -25
@@ -0,0 +1,96 @@
1
+ class Socket < BasicSocket
2
+ class Option
3
+ attr_reader :family, :level, :optname, :data
4
+
5
+ def self.bool(family, level, optname, bool)
6
+ new(family, level, optname, [bool ? 1 : 0].pack('i'))
7
+ end
8
+
9
+ def self.int(family, level, optname, integer)
10
+ new(family, level, optname, [integer].pack('i'))
11
+ end
12
+
13
+ def self.linger(onoff, secs)
14
+ linger = RubySL::Socket::Foreign::Linger.new
15
+
16
+ begin
17
+ linger.on_off = onoff
18
+ linger.linger = secs
19
+
20
+ new(:UNSPEC, :SOCKET, :LINGER, linger.to_s)
21
+ ensure
22
+ linger.free
23
+ end
24
+ end
25
+
26
+ def initialize(family, level, optname, data)
27
+ @family = RubySL::Socket.address_family(family)
28
+ @level = RubySL::Socket::SocketOptions.socket_level(level, @family)
29
+ @optname = RubySL::Socket::SocketOptions.socket_option(@level, optname)
30
+ @data = data
31
+ end
32
+
33
+ def unpack(template)
34
+ @data.unpack template
35
+ end
36
+
37
+ def inspect
38
+ "#<#{self.class}: #@family_name #@level_name #@opt_name #{@data.inspect}>"
39
+ end
40
+
41
+ def bool
42
+ expected_size = RubySL::Socket::Foreign::SIZEOF_INT
43
+
44
+ unless @data.bytesize == expected_size
45
+ raise TypeError,
46
+ "invalid size, expected #{expected_size} but got #{@data.bytesize}"
47
+ end
48
+
49
+ if @data.unpack('i')[0] > 0
50
+ true
51
+ else
52
+ false
53
+ end
54
+ end
55
+
56
+ def int
57
+ expected_size = RubySL::Socket::Foreign::SIZEOF_INT
58
+
59
+ unless @data.bytesize == expected_size
60
+ raise TypeError,
61
+ "invalid size, expected #{expected_size} but got #{@data.bytesize}"
62
+ end
63
+
64
+ @data.unpack('i')[0]
65
+ end
66
+
67
+ def linger
68
+ if @level != Socket::SOL_SOCKET || @optname != Socket::SO_LINGER
69
+ raise TypeError, 'linger socket option expected'
70
+ end
71
+
72
+ expected_size = RubySL::Socket::Foreign::Linger.size
73
+
74
+ if @data.bytesize != expected_size
75
+ raise TypeError,
76
+ "invalid size, expected #{expected_size} but got #{@data.bytesize}"
77
+ end
78
+
79
+ linger = RubySL::Socket::Foreign::Linger.from_string(@data)
80
+ onoff = nil
81
+
82
+ case linger.on_off
83
+ when 0
84
+ onoff = false
85
+ when 1
86
+ onoff = true
87
+ else
88
+ onoff = linger.onoff.to_i
89
+ end
90
+
91
+ [onoff, linger.linger]
92
+ end
93
+
94
+ alias :to_s :data
95
+ end
96
+ end
@@ -0,0 +1,353 @@
1
+ class Socket < BasicSocket
2
+ def self.ip_address_list
3
+ ips = []
4
+
5
+ getifaddrs.each do |ifaddr|
6
+ ips << ifaddr.addr if ifaddr.addr
7
+ end
8
+
9
+ ips
10
+ end
11
+
12
+ def self.getaddrinfo(host, service, family = 0, socktype = 0,
13
+ protocol = 0, flags = 0, reverse_lookup = nil)
14
+ if host
15
+ host = RubySL::Socket.coerce_to_string(host)
16
+ end
17
+
18
+ if host && (host.empty? || host == '<any>')
19
+ host = "0.0.0.0"
20
+ elsif host == '<broadcast>'
21
+ host = '255.255.255.255'
22
+ end
23
+
24
+ if service.kind_of?(Fixnum)
25
+ service = service.to_s
26
+ elsif service
27
+ service = RubySL::Socket.coerce_to_string(service)
28
+ end
29
+
30
+ family = RubySL::Socket.address_family(family)
31
+ socktype = RubySL::Socket.socket_type(socktype)
32
+ addrinfos = RubySL::Socket::Foreign
33
+ .getaddrinfo(host, service, family, socktype, protocol, flags)
34
+
35
+ reverse_lookup = RubySL::Socket
36
+ .convert_reverse_lookup(nil, reverse_lookup)
37
+
38
+ addrinfos.map do |ai|
39
+ addrinfo = []
40
+
41
+ unpacked = RubySL::Socket::Foreign
42
+ .unpack_sockaddr_in(ai[4], reverse_lookup)
43
+
44
+ addrinfo << Socket::Constants::AF_TO_FAMILY[ai[1]]
45
+ addrinfo << unpacked.pop # port
46
+
47
+ # Canonical host is present (e.g. when AI_CANONNAME was used)
48
+ if ai[5] and !reverse_lookup
49
+ unpacked[0] = ai[5]
50
+ end
51
+
52
+ addrinfo.concat(unpacked) # hosts
53
+
54
+ addrinfo << ai[1] # family
55
+ addrinfo << ai[2] # socktype
56
+ addrinfo << ai[3] # protocol
57
+
58
+ addrinfo
59
+ end
60
+ end
61
+
62
+ def self.getnameinfo(sockaddr, flags = 0)
63
+ port = nil
64
+ host = nil
65
+ family = Socket::AF_UNSPEC
66
+
67
+ if sockaddr.is_a?(Array)
68
+ if sockaddr.size == 3
69
+ af, port, host = sockaddr
70
+ elsif sockaddr.size == 4
71
+ af = sockaddr[0]
72
+ port = sockaddr[1]
73
+ host = sockaddr[3] || sockaddr[2]
74
+ else
75
+ raise ArgumentError,
76
+ "array size should be 3 or 4, #{sockaddr.size} given"
77
+ end
78
+
79
+ if af == 'AF_INET'
80
+ family = Socket::AF_INET
81
+ elsif af == 'AF_INET6'
82
+ family = Socket::AF_INET6
83
+ end
84
+
85
+ sockaddr = RubySL::Socket::Foreign
86
+ .pack_sockaddr_in(host, port, family, Socket::SOCK_STREAM, 0)
87
+ end
88
+
89
+ _, port, host, _ = RubySL::Socket::Foreign.getnameinfo(sockaddr, flags)
90
+
91
+ [host, port]
92
+ end
93
+
94
+ def self.gethostname
95
+ RubySL::Socket::Foreign.char_pointer(::Socket::NI_MAXHOST) do |pointer|
96
+ RubySL::Socket::Foreign.gethostname(pointer, pointer.total)
97
+
98
+ pointer.read_string
99
+ end
100
+ end
101
+
102
+ def self.gethostbyname(hostname)
103
+ addrinfos = Socket
104
+ .getaddrinfo(hostname, nil, nil, :STREAM, nil, Socket::AI_CANONNAME)
105
+
106
+ hostname = addrinfos[0][2]
107
+ family = addrinfos[0][4]
108
+ addresses = []
109
+ alternatives = RubySL::Socket.aliases_for_hostname(hostname)
110
+
111
+ addrinfos.each do |a|
112
+ sockaddr = Socket.sockaddr_in(0, a[3])
113
+
114
+ if a[4] == AF_INET
115
+ offset, size = RubySL::Socket::Foreign::SockaddrIn.layout[:sin_addr]
116
+
117
+ addresses << sockaddr.byteslice(offset, size)
118
+ elsif a[4] == AF_INET6
119
+ offset, size = RubySL::Socket::Foreign::SockaddrIn6.layout[:sin6_addr]
120
+
121
+ addresses << sockaddr.byteslice(offset, size)
122
+ end
123
+ end
124
+
125
+ [hostname, alternatives, family, *addresses]
126
+ end
127
+
128
+ def self.gethostbyaddr(addr, family = nil)
129
+ if !family and addr.bytesize == 16
130
+ family = Socket::AF_INET6
131
+ elsif !family
132
+ family = Socket::AF_INET
133
+ end
134
+
135
+ family = RubySL::Socket.address_family(family)
136
+
137
+ RubySL::Socket::Foreign.char_pointer(addr.bytesize) do |in_pointer|
138
+ in_pointer.write_string(addr)
139
+
140
+ out_pointer = RubySL::Socket::Foreign
141
+ .gethostbyaddr(in_pointer, in_pointer.total, family)
142
+
143
+ unless out_pointer
144
+ raise SocketError, "No host found for address #{addr.inspect}"
145
+ end
146
+
147
+ struct = RubySL::Socket::Foreign::Hostent.new(out_pointer)
148
+
149
+ [struct.hostname, struct.aliases, struct.type, *struct.addresses]
150
+ end
151
+ end
152
+
153
+ def self.getservbyname(service, proto = 'tcp')
154
+ pointer = RubySL::Socket::Foreign.getservbyname(service, proto)
155
+
156
+ raise SocketError, "no such service #{service}/#{proto}" unless pointer
157
+
158
+ struct = RubySL::Socket::Foreign::Servent.new(pointer)
159
+
160
+ RubySL::Socket::Foreign.ntohs(struct.port)
161
+ end
162
+
163
+ def self.getservbyport(port, proto = nil)
164
+ proto ||= 'tcp'
165
+ pointer = RubySL::Socket::Foreign.getservbyport(port, proto)
166
+
167
+ raise SocketError, "no such service for port #{port}/#{proto}" unless pointer
168
+
169
+ struct = RubySL::Socket::Foreign::Servent.new(pointer)
170
+
171
+ struct.name
172
+ end
173
+
174
+ def self.getifaddrs
175
+ initial = RubySL::Socket::Foreign::Ifaddrs.new
176
+ status = RubySL::Socket::Foreign.getifaddrs(initial)
177
+ ifaddrs = []
178
+ index = 1
179
+
180
+ Errno.handle('getifaddrs()') if status < 0
181
+
182
+ begin
183
+ initial.each_address do |ifaddrs_struct|
184
+ ifaddrs << Ifaddr.new(
185
+ addr: ifaddrs_struct.address_to_addrinfo,
186
+ broadaddr: ifaddrs_struct.broadcast_to_addrinfo,
187
+ dstaddr: ifaddrs_struct.destination_to_addrinfo,
188
+ netmask: ifaddrs_struct.netmask_to_addrinfo,
189
+ name: ifaddrs_struct.name,
190
+ flags: ifaddrs_struct.flags,
191
+ ifindex: index
192
+ )
193
+
194
+ index += 1
195
+ end
196
+
197
+ ifaddrs
198
+ ensure
199
+ RubySL::Socket::Foreign.freeifaddrs(initial)
200
+ end
201
+ end
202
+
203
+ def self.pack_sockaddr_in(port, host)
204
+ RubySL::Socket::Foreign.pack_sockaddr_in(host, port)
205
+ end
206
+
207
+ def self.unpack_sockaddr_in(sockaddr)
208
+ _, address, port = RubySL::Socket::Foreign
209
+ .unpack_sockaddr_in(sockaddr, false)
210
+
211
+ return port, address
212
+ rescue SocketError => e
213
+ if e.message =~ /ai_family not supported/
214
+ raise ArgumentError, 'not an AF_INET/AF_INET6 sockaddr'
215
+ else
216
+ raise e
217
+ end
218
+ end
219
+
220
+ def self.socketpair(family, type, protocol = 0)
221
+ family = RubySL::Socket.address_family(family)
222
+ type = RubySL::Socket.socket_type(type)
223
+
224
+ fd0, fd1 = RubySL::Socket::Foreign.socketpair(family, type, protocol)
225
+
226
+ [for_fd(fd0), for_fd(fd1)]
227
+ end
228
+
229
+ class << self
230
+ alias_method :sockaddr_in, :pack_sockaddr_in
231
+ alias_method :pair, :socketpair
232
+ end
233
+
234
+ if RubySL::Socket.unix_socket_support?
235
+ def self.pack_sockaddr_un(file)
236
+ sockaddr = [Socket::AF_UNIX].pack('s') + file
237
+ struct = RubySL::Socket::Foreign::SockaddrUn.with_sockaddr(sockaddr)
238
+
239
+ begin
240
+ struct.to_s
241
+ ensure
242
+ struct.free
243
+ end
244
+ end
245
+
246
+ def self.unpack_sockaddr_un(addr)
247
+ struct = RubySL::Socket::Foreign::SockaddrUn.with_sockaddr(addr)
248
+
249
+ begin
250
+ struct[:sun_path]
251
+ ensure
252
+ struct.free
253
+ end
254
+ end
255
+
256
+ class << self
257
+ alias_method :sockaddr_un, :pack_sockaddr_un
258
+ end
259
+ end
260
+
261
+ def initialize(family, socket_type, protocol = 0)
262
+ @no_reverse_lookup = self.class.do_not_reverse_lookup
263
+
264
+ @family = RubySL::Socket.protocol_family(family)
265
+ @socket_type = RubySL::Socket.socket_type(socket_type)
266
+
267
+ descriptor = RubySL::Socket::Foreign.socket(@family, @socket_type, protocol)
268
+
269
+ Errno.handle('socket(2)') if descriptor < 0
270
+
271
+ IO.setup(self, descriptor, nil, true)
272
+ end
273
+
274
+ def bind(addr)
275
+ if addr.is_a?(Addrinfo)
276
+ addr = addr.to_sockaddr
277
+ end
278
+
279
+ err = RubySL::Socket::Foreign.bind(descriptor, addr)
280
+
281
+ Errno.handle('bind(2)') unless err == 0
282
+
283
+ 0
284
+ end
285
+
286
+ def connect(sockaddr)
287
+ if sockaddr.is_a?(Addrinfo)
288
+ sockaddr = sockaddr.to_sockaddr
289
+ end
290
+
291
+ status = RubySL::Socket::Foreign.connect(descriptor, sockaddr)
292
+
293
+ RubySL::Socket::Error.write_error('connect(2)', self) if status < 0
294
+
295
+ 0
296
+ end
297
+
298
+ def connect_nonblock(sockaddr)
299
+ fcntl(Fcntl::F_SETFL, Fcntl::O_NONBLOCK)
300
+
301
+ if sockaddr.is_a?(Addrinfo)
302
+ sockaddr = sockaddr.to_sockaddr
303
+ end
304
+
305
+ status = RubySL::Socket::Foreign.connect(descriptor, sockaddr)
306
+
307
+ RubySL::Socket::Error.write_nonblock('connect(2)') if status < 0
308
+
309
+ 0
310
+ end
311
+
312
+ def local_address
313
+ sockaddr = RubySL::Socket::Foreign.getsockname(descriptor)
314
+
315
+ Addrinfo.new(sockaddr, @family, @socket_type, 0)
316
+ end
317
+
318
+ def remote_address
319
+ sockaddr = RubySL::Socket::Foreign.getpeername(descriptor)
320
+
321
+ Addrinfo.new(sockaddr, @family, @socket_type, 0)
322
+ end
323
+
324
+ def recvfrom(bytes, flags = 0)
325
+ message, addr = recvmsg(bytes, flags)
326
+
327
+ return message, addr
328
+ end
329
+
330
+ def recvfrom_nonblock(bytes, flags = 0)
331
+ message, addr = recvmsg_nonblock(bytes, flags)
332
+
333
+ return message, addr
334
+ end
335
+
336
+ def listen(backlog)
337
+ RubySL::Socket.listen(self, backlog)
338
+ end
339
+
340
+ def accept
341
+ RubySL::Socket.accept(self, Socket)
342
+ end
343
+
344
+ def accept_nonblock
345
+ RubySL::Socket.accept_nonblock(self, Socket)
346
+ end
347
+
348
+ def sysaccept
349
+ socket, addrinfo = accept
350
+
351
+ return socket.fileno, addrinfo
352
+ end
353
+ end
@@ -0,0 +1,2 @@
1
+ class SocketError < StandardError
2
+ end