3
3
#ifndef __SOCKET_HELPERS__
4
4
#define __SOCKET_HELPERS__
5
5
6
+ #include <sys/un.h>
6
7
#include <linux/vm_sockets.h>
7
8
8
9
/* include/linux/net.h */
@@ -169,6 +170,15 @@ static inline void init_addr_loopback6(struct sockaddr_storage *ss,
169
170
* len = sizeof (* addr6 );
170
171
}
171
172
173
+ static inline void init_addr_loopback_unix (struct sockaddr_storage * ss ,
174
+ socklen_t * len )
175
+ {
176
+ struct sockaddr_un * addr = memset (ss , 0 , sizeof (* ss ));
177
+
178
+ addr -> sun_family = AF_UNIX ;
179
+ * len = sizeof (sa_family_t );
180
+ }
181
+
172
182
static inline void init_addr_loopback_vsock (struct sockaddr_storage * ss ,
173
183
socklen_t * len )
174
184
{
@@ -190,6 +200,9 @@ static inline void init_addr_loopback(int family, struct sockaddr_storage *ss,
190
200
case AF_INET6 :
191
201
init_addr_loopback6 (ss , len );
192
202
return ;
203
+ case AF_UNIX :
204
+ init_addr_loopback_unix (ss , len );
205
+ return ;
193
206
case AF_VSOCK :
194
207
init_addr_loopback_vsock (ss , len );
195
208
return ;
@@ -315,21 +328,27 @@ static inline int create_pair(int family, int sotype, int *p0, int *p1)
315
328
{
316
329
__close_fd int s , c = -1 , p = -1 ;
317
330
struct sockaddr_storage addr ;
318
- socklen_t len = sizeof ( addr ) ;
331
+ socklen_t len ;
319
332
int err ;
320
333
321
334
s = socket_loopback (family , sotype );
322
335
if (s < 0 )
323
336
return s ;
324
337
325
- err = xgetsockname (s , sockaddr (& addr ), & len );
326
- if (err )
327
- return err ;
328
-
329
338
c = xsocket (family , sotype , 0 );
330
339
if (c < 0 )
331
340
return c ;
332
341
342
+ init_addr_loopback (family , & addr , & len );
343
+ err = xbind (c , sockaddr (& addr ), len );
344
+ if (err )
345
+ return err ;
346
+
347
+ len = sizeof (addr );
348
+ err = xgetsockname (s , sockaddr (& addr ), & len );
349
+ if (err )
350
+ return err ;
351
+
333
352
err = connect (c , sockaddr (& addr ), len );
334
353
if (err ) {
335
354
if (errno != EINPROGRESS ) {
0 commit comments