ObjFW  Check-in [9d10d73fcf]

Overview
Comment:Disable UNIX datagram sockets on Hurd
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | 1.1
Files: files | file ages | folders
SHA3-256: 9d10d73fcfc39b0b5b343c8bbf3483f7aa2fc7e3adbfbc5da14cd32c88f14232
User & Date: js on 2024-08-16 21:50:42
Other Links: branch diff | manifest | tags
Context
2024-08-16
22:13
runtime: Hide symbols for mutex / once / TLS key check-in: ed8107953d user: js tags: 1.1
21:50
Disable UNIX datagram sockets on Hurd check-in: 9d10d73fcf user: js tags: 1.1
21:50
Disable UNIX datagram sockets on Hurd check-in: 7de187fbde user: js tags: trunk
2024-08-11
13:33
Set version to 1.1.6 check-in: bbc2b6d3e0 user: js tags: 1.1, 1.1.6-release
Changes

Modified src/OFUNIXDatagramSocket.m from [86033fc2cb] to [bf02eb42d7].

18
19
20
21
22
23
24


25
26
27
28
29
30
31
32
33
34
35
36
37
38

39
40

41
42

43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

64
65
66

67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83










84
85
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

43
44

45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65

66
67
68

69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98







+
+














+

-
+

-
+




















-
+


-
+

















+
+
+
+
+
+
+
+
+
+


 */

#include "config.h"

#ifdef HAVE_FCNTL_H
# include <fcntl.h>
#endif

#include <errno.h>

#import "OFUNIXDatagramSocket.h"
#import "OFSocket.h"
#import "OFSocket+Private.h"
#import "OFString.h"

#import "OFAlreadyOpenException.h"
#import "OFBindUNIXSocketFailedException.h"

@implementation OFUNIXDatagramSocket
@dynamic delegate;

- (OFSocketAddress)bindToPath: (OFString *)path
{
#ifndef OF_HURD
	OFSocketAddress address;
#if SOCK_CLOEXEC == 0 && defined(HAVE_FCNTL_H) && defined(FD_CLOEXEC)
# if SOCK_CLOEXEC == 0 && defined(HAVE_FCNTL_H) && defined(FD_CLOEXEC)
	int flags;
#endif
# endif

	if (_socket != OFInvalidSocketHandle)
		@throw [OFAlreadyOpenException exceptionWithObject: self];

	if (path != nil)
		address = OFSocketAddressMakeUNIX(path);
	else {
		address.family = OFSocketAddressFamilyUnknown;
		address.length = 0;
	}

	if ((_socket = socket(AF_UNIX, SOCK_DGRAM | SOCK_CLOEXEC, 0)) ==
	    OFInvalidSocketHandle)
		@throw [OFBindUNIXSocketFailedException
		    exceptionWithPath: path
			       socket: self
				errNo: _OFSocketErrNo()];

	_canBlock = true;

#if SOCK_CLOEXEC == 0 && defined(HAVE_FCNTL_H) && defined(FD_CLOEXEC)
# 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
# endif

	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;
#else
	/*
	 * Datagram UNIX sockets on Hurd are broken and don't return the sender
	 * correctly when using recvfrom().
	 */
	@throw [OFBindUNIXSocketFailedException
	    exceptionWithPath: path
		       socket: self
			errNo: EAFNOSUPPORT];
#endif
}
@end