Index: src/OFDatagramSocket.m ================================================================== --- src/OFDatagramSocket.m +++ src/OFDatagramSocket.m @@ -196,38 +196,43 @@ requestedLength: length errNo: OFSocketErrNo()]; #endif if (sender != NULL) { - switch (((struct sockaddr *)&sender->sockaddr)->sa_family) { - case AF_INET: - sender->family = OFSocketAddressFamilyIPv4; - break; + struct sockaddr *sa = (struct sockaddr *)&sender->sockaddr; + + if (sender->length >= sizeof(sa->sa_family)) { + switch (sa->sa_family) { + case AF_INET: + sender->family = OFSocketAddressFamilyIPv4; + break; #ifdef OF_HAVE_IPV6 - case AF_INET6: - sender->family = OFSocketAddressFamilyIPv6; - break; + case AF_INET6: + sender->family = OFSocketAddressFamilyIPv6; + break; #endif #ifdef OF_HAVE_UNIX_SOCKETS - case AF_UNIX: - sender->family = OFSocketAddressFamilyUNIX; - break; + case AF_UNIX: + sender->family = OFSocketAddressFamilyUNIX; + break; #endif #ifdef OF_HAVE_IPX - case AF_IPX: - sender->family = OFSocketAddressFamilyIPX; - break; + case AF_IPX: + sender->family = OFSocketAddressFamilyIPX; + break; #endif #ifdef OF_HAVE_APPLETALK - case AF_APPLETALK: - sender->family = OFSocketAddressFamilyAppleTalk; - break; + case AF_APPLETALK: + sender->family = OFSocketAddressFamilyAppleTalk; + break; #endif - default: + default: + sender->family = OFSocketAddressFamilyUnknown; + break; + } + } else sender->family = OFSocketAddressFamilyUnknown; - break; - } } return ret; } Index: src/OFSocket.h ================================================================== --- src/OFSocket.h +++ src/OFSocket.h @@ -316,11 +316,11 @@ * @brief Gets the UNIX socket path of the specified @ref OFSocketAddress. * * @param address The address on which to get the UNIX socket path * @return The UNIX socket path */ -extern OFString *_Nullable OFSocketAddressUNIXPath( +extern OFString *OFSocketAddressUNIXPath( const OFSocketAddress *_Nonnull address); /** * @brief Sets the IPX network of the specified @ref OFSocketAddress. * Index: src/OFSocket.m ================================================================== --- src/OFSocket.m +++ src/OFSocket.m @@ -977,10 +977,12 @@ switch (address->family) { case OFSocketAddressFamilyIPv4: return IPv4String(address); case OFSocketAddressFamilyIPv6: return IPv6String(address); + case OFSocketAddressFamilyUNIX: + return OFSocketAddressUNIXPath(address); case OFSocketAddressFamilyIPX: return IPXString(address); case OFSocketAddressFamilyAppleTalk: return appleTalkString(address); default: @@ -1028,13 +1030,10 @@ for (socklen_t i = 0; i < length; i++) if (address->sockaddr.un.sun_path[i] == 0) length = i; - if (length <= 0) - return nil; - return [OFString stringWithCString: address->sockaddr.un.sun_path encoding: [OFLocale encoding] length: length]; } Index: src/OFUNIXDatagramSocket.h ================================================================== --- src/OFUNIXDatagramSocket.h +++ src/OFUNIXDatagramSocket.h @@ -61,14 +61,15 @@ id delegate; /** * @brief Bind the socket to the specified path. * - * @param path The path to bind to - * @return The address on which this socket can be reached + * @param path The path to bind to or `nil` for an anonymous socket + * @return The address on which this socket can be reached, if a path was + * specified * @throw OFBindUNIXSocketFailedException Binding failed * @throw OFAlreadyOpenException The socket is already bound */ -- (OFSocketAddress)bindToPath: (OFString *)path; +- (OFSocketAddress)bindToPath: (nullable OFString *)path; @end OF_ASSUME_NONNULL_END Index: src/OFUNIXDatagramSocket.m ================================================================== --- src/OFUNIXDatagramSocket.m +++ src/OFUNIXDatagramSocket.m @@ -38,14 +38,19 @@ #endif if (_socket != OFInvalidSocketHandle) @throw [OFAlreadyOpenException exceptionWithObject: self]; - address = OFSocketAddressMakeUNIX(path); + if (path != nil) + address = OFSocketAddressMakeUNIX(path); + else { + address.family = OFSocketAddressFamilyUnknown; + address.length = 0; + } - if ((_socket = socket(address.sockaddr.un.sun_family, - SOCK_DGRAM | SOCK_CLOEXEC, 0)) == OFInvalidSocketHandle) + if ((_socket = socket(AF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC, 0)) == + OFInvalidSocketHandle) @throw [OFBindUNIXSocketFailedException exceptionWithPath: path socket: self errNo: OFSocketErrNo()]; @@ -54,21 +59,23 @@ #if SOCK_CLOEXEC == 0 && defined(HAVE_FCNTL_H) && defined(FD_CLOEXEC) if ((flags = fcntl(_socket, F_GETFD, 0)) != -1) fcntl(_socket, F_SETFD, flags | FD_CLOEXEC); #endif - if (bind(_socket, (struct sockaddr *)&address.sockaddr, - address.length) != 0) { - int errNo = OFSocketErrNo(); - - closesocket(_socket); - _socket = OFInvalidSocketHandle; - - @throw [OFBindUNIXSocketFailedException - exceptionWithPath: path - socket: self - errNo: errNo]; + if (path != nil) { + if (bind(_socket, (struct sockaddr *)&address.sockaddr, + address.length) != 0) { + int errNo = OFSocketErrNo(); + + closesocket(_socket); + _socket = OFInvalidSocketHandle; + + @throw [OFBindUNIXSocketFailedException + exceptionWithPath: path + socket: self + errNo: errNo]; + } } return address; } @end Index: tests/OFUNIXStreamSocketTests.m ================================================================== --- tests/OFUNIXStreamSocketTests.m +++ tests/OFUNIXStreamSocketTests.m @@ -79,16 +79,16 @@ TEST(@"-[readIntoBuffer:length:]", [sockClient readIntoBuffer: buffer length: 5] == 5 && memcmp(buffer, "Hello", 5) == 0) - TEST(@"-[remoteAddress]", - OFSocketAddressUNIXPath(sockAccepted.remoteAddress) == nil) + TEST(@"-[remoteAddress]", OFSocketAddressUNIXPath( + sockAccepted.remoteAddress).length == 0) } @finally { #ifdef OF_HAVE_FILES [[OFFileManager defaultManager] removeItemAtPath: path]; #endif } objc_autoreleasePoolPop(pool); } @end