33#ifndef __SOCKET_HELPERS__
44#define __SOCKET_HELPERS__
55
6+ #include <sys/un.h>
67#include <linux/vm_sockets.h>
78
89/* include/linux/net.h */
@@ -169,6 +170,15 @@ static inline void init_addr_loopback6(struct sockaddr_storage *ss,
169170 * len = sizeof (* addr6 );
170171}
171172
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+
172182static inline void init_addr_loopback_vsock (struct sockaddr_storage * ss ,
173183 socklen_t * len )
174184{
@@ -190,6 +200,9 @@ static inline void init_addr_loopback(int family, struct sockaddr_storage *ss,
190200 case AF_INET6 :
191201 init_addr_loopback6 (ss , len );
192202 return ;
203+ case AF_UNIX :
204+ init_addr_loopback_unix (ss , len );
205+ return ;
193206 case AF_VSOCK :
194207 init_addr_loopback_vsock (ss , len );
195208 return ;
@@ -315,21 +328,27 @@ static inline int create_pair(int family, int sotype, int *p0, int *p1)
315328{
316329 __close_fd int s , c = -1 , p = -1 ;
317330 struct sockaddr_storage addr ;
318- socklen_t len = sizeof ( addr ) ;
331+ socklen_t len ;
319332 int err ;
320333
321334 s = socket_loopback (family , sotype );
322335 if (s < 0 )
323336 return s ;
324337
325- err = xgetsockname (s , sockaddr (& addr ), & len );
326- if (err )
327- return err ;
328-
329338 c = xsocket (family , sotype , 0 );
330339 if (c < 0 )
331340 return c ;
332341
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+
333352 err = connect (c , sockaddr (& addr ), len );
334353 if (err ) {
335354 if (errno != EINPROGRESS ) {
0 commit comments