Overview
Context
Changes
Modified configure.ac
from [75effab5fc]
to [99b94f26ce].
︙ | | |
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
|
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
|
+
|
AC_SUBST(USE_SRCS_IPX, '${SRCS_IPX}')
])
])
AC_CHECK_MEMBER(struct sockaddr_un.sun_path, [
AC_DEFINE(OF_HAVE_UNIX_SOCKETS, 1,
[Whether we have UNIX sockets])
AC_SUBST(USE_SRCS_UNIX_SOCKETS, '${SRCS_UNIX_SOCKETS}')
], [], [
#ifdef OF_HAVE_SYS_UN_H
# include <sys/un.h>
#endif
])
AC_CHECK_FUNCS(paccept accept4, break)
|
︙ | | |
Modified extra.mk.in
from [40ab3148ac]
to [07cebcd27b].
︙ | | |
68
69
70
71
72
73
74
75
76
|
68
69
70
71
72
73
74
75
76
77
|
+
|
UNICODE_M = @UNICODE_M@
USE_INCLUDES_ATOMIC = @USE_INCLUDES_ATOMIC@
USE_SRCS_FILES = @USE_SRCS_FILES@
USE_SRCS_IPX = @USE_SRCS_IPX@
USE_SRCS_PLUGINS = @USE_SRCS_PLUGINS@
USE_SRCS_SOCKETS = @USE_SRCS_SOCKETS@
USE_SRCS_THREADS = @USE_SRCS_THREADS@
USE_SRCS_UNIX_SOCKETS = @USE_SRCS_UNIX_SOCKETS@
USE_SRCS_WINDOWS = @USE_SRCS_WINDOWS@
WRAPPER = @WRAPPER@
|
Modified src/Makefile
from [47315f910b]
to [651753ff6c].
︙ | | |
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
|
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
-
-
-
-
+
+
+
+
+
+
|
${USE_SRCS_THREADS} \
${USE_SRCS_WINDOWS}
SRCS_FILES = OFFile.m \
OFINICategory.m \
OFINIFile.m \
OFSettings.m \
OFString+PathAdditions.m
SRCS_IPX = OFIPXSocket.m \
OFSPXSocket.m \
OFSPXStreamSocket.m
SRCS_PLUGINS = OFPlugin.m
SRCS_SOCKETS = OFDNSQuery.m \
OFDNSResolver.m \
OFDNSResourceRecord.m \
OFDNSResponse.m \
OFDatagramSocket.m \
OFHTTPClient.m \
OFHTTPCookie.m \
OFHTTPCookieManager.m \
OFHTTPRequest.m \
OFHTTPResponse.m \
OFHTTPServer.m \
OFSequencedPacketSocket.m \
OFSocket.m \
OFStreamSocket.m \
OFTCPSocket.m \
OFUDPSocket.m \
${USE_SRCS_IPX}
${USE_SRCS_IPX} \
${USE_SRCS_UNIX_SOCKETS}
SRCS_IPX = OFIPXSocket.m \
OFSPXSocket.m \
OFSPXStreamSocket.m
SRCS_UNIX_SOCKETS = OFUNIXDatagramSocket.m
SRCS_THREADS = OFCondition.m \
OFMutex.m \
OFPlainCondition.m \
OFPlainMutex.m \
OFPlainThread.m \
OFRecursiveMutex.m \
OFTLSKey.m \
|
︙ | | |
Modified src/OFDatagramSocket.m
from [a53bf3d04b]
to [dbfe918d5b].
︙ | | |
203
204
205
206
207
208
209
210
211
212
213
214
215
216
|
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
|
+
+
+
+
+
|
sender->family = OFSocketAddressFamilyIPv6;
break;
#endif
#ifdef OF_HAVE_IPX
case AF_IPX:
sender->family = OFSocketAddressFamilyIPX;
break;
#endif
#ifdef OF_HAVE_UNIX_SOCKETS
case AF_UNIX:
sender->family = OFSocketAddressFamilyUNIX;
break;
#endif
default:
sender->family = OFSocketAddressFamilyUnknown;
break;
}
return ret;
|
︙ | | |
Modified src/OFSocket.m
from [25a9151924]
to [0370baa1c4].
︙ | | |
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
|
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
|
-
-
-
-
-
-
-
-
-
-
+
-
+
-
-
-
-
-
+
|
return false;
if (memcmp(addrIPX1->sipx_node, addrIPX2->sipx_node,
IPX_NODE_LEN) != 0)
return false;
return true;
case OFSocketAddressFamilyUNIX:
/*
* This is a bit tricky. The only thing that is well-defined is
* the path. So compare the path, and if both don't have a
* path, compare bytes.
*/
if (address1->length != address2->length)
return false;
pool = objc_autoreleasePoolPush();
path1 = OFSocketAddressUNIXPath(address1);
path2 = OFSocketAddressUNIXPath(address2);
if (path1 == nil && path2 == nil) {
if (path1 == nil || path2 == nil) {
objc_autoreleasePoolPop(pool);
return (memcmp(&address1->sockaddr.un,
return false;
&address2->sockaddr.un, address1->length) == 0);
}
if (path1 == nil || path2 == nil)
ret = false;
else
ret = [path1 isEqual: path2];
ret = [path1 isEqual: path2];
objc_autoreleasePoolPop(pool);
return ret;
default:
@throw [OFInvalidArgumentException exception];
}
|
︙ | | |
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
|
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
|
-
-
-
-
-
-
-
+
-
-
-
-
-
-
-
+
-
|
OFHashAdd(&hash, network[i]);
for (size_t i = 0; i < IPX_NODE_LEN; i++)
OFHashAdd(&hash, address->sockaddr.ipx.sipx_node[i]);
break;
case OFSocketAddressFamilyUNIX:;
/*
* This is a bit tricky. The only thing that is well-defined is
* the path. So hash the path if we have one, otherwise the
* bytes.
*/
void *pool = objc_autoreleasePoolPush();
OFString *path = OFSocketAddressUNIXPath(address);
if (path != nil) {
hash = path.hash;
hash = path.hash;
objc_autoreleasePoolPop(pool);
return hash;
}
objc_autoreleasePoolPop(pool);
for (socklen_t i = 0; i < address->length; i++)
OFHashAdd(&hash,
((const char *)&address->sockaddr.un)[i]);
return hash;
break;
default:
@throw [OFInvalidArgumentException exception];
}
OFHashFinalize(&hash);
return hash;
|
︙ | | |
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
|
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
|
-
+
+
+
+
|
memcpy(node, address->sockaddr.ipx.sipx_node, IPX_NODE_LEN);
}
OFString *
OFSocketAddressUNIXPath(const OFSocketAddress *_Nonnull address)
{
socklen_t maxLength = (socklen_t)sizeof(address->sockaddr.un);
const socklen_t maxLength = (socklen_t)sizeof(address->sockaddr.un);
size_t length;
if (address->family != OFSocketAddressFamilyUNIX ||
address->length > maxLength)
@throw [OFInvalidArgumentException exception];
length = sizeof(address->sockaddr.un.sun_path) -
(maxLength - address->length);
if (length == 0)
return nil;
while (address->sockaddr.un.sun_path[length - 1] == '\0')
length--;
return [OFString stringWithCString: address->sockaddr.un.sun_path
encoding: [OFLocale encoding]
length: length];
}
|
Added src/OFUNIXDatagramSocket.h version [e445b19690].
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
|
/*
* Copyright (c) 2008-2021 Jonathan Schleifer <js@nil.im>
*
* All rights reserved.
*
* This file is part of ObjFW. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE.QPL included in
* the packaging of this file.
*
* Alternatively, it may be distributed under the terms of the GNU General
* Public License, either version 2 or 3, which can be found in the file
* LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
* file.
*/
#import "OFDatagramSocket.h"
OF_ASSUME_NONNULL_BEGIN
@class OFString;
/**
* @protocol OFUNIXDatagramSocketDelegate OFUNIXDatagramSocket.h \
* ObjFW/OFUNIXDatagramSocket.h
*
* @brief A delegate for OFUNIXDatagramSocket.
*/
@protocol OFUNIXDatagramSocketDelegate <OFDatagramSocketDelegate>
@end
/**
* @class OFUNIXDatagramSocket OFUNIXDatagramSocket.h \
* ObjFW/OFUNIXDatagramSocket.h
*
* @brief A class which provides methods to create and use UNIX datagram
* sockets.
*
* Addresses are of type @ref OFSocketAddress. You can use
* @ref OFSocketAddressMakeUNIX to create an address or
* @ref OFSocketAddressUNIXPath to get the socket path.
*
* @warning Even though the OFCopying protocol is implemented, it does *not*
* return an independent copy of the socket, but instead retains it.
* This is so that the socket can be used as a key for a dictionary,
* so context can be associated with a socket. Using a socket in more
* than one thread at the same time is not thread-safe, even if copy
* was called to create one "instance" for every thread!
*/
@interface OFUNIXDatagramSocket: OFDatagramSocket
{
OF_RESERVE_IVARS(OFUNIXDatagramSocket, 4)
}
/**
* @brief The delegate for asynchronous operations on the socket.
*
* @note The delegate is retained for as long as asynchronous operations are
* still ongoing.
*/
@property OF_NULLABLE_PROPERTY (assign, nonatomic)
id <OFUNIXDatagramSocketDelegate> 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
*/
- (OFSocketAddress)bindToPath: (OFString *)path;
@end
OF_ASSUME_NONNULL_END
|
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
Added src/OFUNIXDatagramSocket.m version [44180adae5].
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
|
/*
* Copyright (c) 2008-2021 Jonathan Schleifer <js@nil.im>
*
* All rights reserved.
*
* This file is part of ObjFW. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE.QPL included in
* the packaging of this file.
*
* Alternatively, it may be distributed under the terms of the GNU General
* Public License, either version 2 or 3, which can be found in the file
* LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
* file.
*/
#include "config.h"
#include <errno.h>
#ifdef HAVE_FCNTL_H
# include <fcntl.h>
#endif
#import "OFUNIXDatagramSocket.h"
#import "OFSocket.h"
#import "OFSocket+Private.h"
#import "OFAlreadyConnectedException.h"
#import "OFBindFailedException.h"
@implementation OFUNIXDatagramSocket
@dynamic delegate;
- (OFSocketAddress)bindToPath: (OFString *)path
{
OFSocketAddress address;
#if SOCK_CLOEXEC == 0 && defined(HAVE_FCNTL_H) && defined(FD_CLOEXEC)
int flags;
#endif
if (_socket != OFInvalidSocketHandle)
@throw [OFAlreadyConnectedException exceptionWithSocket: self];
address = OFSocketAddressMakeUNIX(path);
if ((_socket = socket(address.sockaddr.sockaddr.sa_family,
SOCK_DGRAM | SOCK_CLOEXEC, 0)) == OFInvalidSocketHandle)
@throw [OFBindFailedException
exceptionWithPath: path
socket: self
errNo: OFSocketErrNo()];
_canBlock = true;
#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, &address.sockaddr.sockaddr, address.length) != 0) {
int errNo = OFSocketErrNo();
closesocket(_socket);
_socket = OFInvalidSocketHandle;
@throw [OFBindFailedException exceptionWithPath: path
socket: self
errNo: errNo];
}
return address;
}
@end
|
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
Modified src/ObjFW.h
from [59913cb5c3]
to [df01551874].
︙ | | |
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
|
+
+
+
|
# import "OFDNSResponse.h"
# import "OFDNSResolver.h"
# ifdef OF_HAVE_IPX
# import "OFIPXSocket.h"
# import "OFSPXSocket.h"
# import "OFSPXStreamSocket.h"
# endif
# ifdef OF_HAVE_UNIX_SOCKETS
# import "OFUNIXDatagramSocket.h"
# endif
#endif
#ifdef OF_HAVE_SOCKETS
# ifdef OF_HAVE_THREADS
# import "OFHTTPClient.h"
# endif
# import "OFHTTPCookie.h"
# import "OFHTTPCookieManager.h"
|
︙ | | |
Modified src/exceptions/OFBindFailedException.h
from [fa6db74dc4]
to [8271ed1427].
︙ | | |
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
|
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
|
-
+
+
+
+
+
+
+
+
|
* @class OFBindFailedException \
* OFBindFailedException.h ObjFW/OFBindFailedException.h
*
* @brief An exception indicating that binding a socket failed.
*/
@interface OFBindFailedException: OFException
{
id _socket;
/* IP */
OFString *_host;
uint16_t _port;
/* IPX */
uint8_t _packetType;
/* UNIX socket */
OFString *_Nullable _path;
id _socket;
int _errNo;
}
/**
* @brief The host on which binding failed.
*/
@property (readonly, nonatomic) OFString *host;
/**
* @brief The port on which binding failed.
*/
@property (readonly, nonatomic) uint16_t port;
/**
* @brief The IPX packet type for which binding failed.
*/
@property (readonly, nonatomic) uint8_t packetType;
/**
* @brief The path on which binding failed.
*/
@property OF_NULLABLE_PROPERTY (readonly, nonatomic) OFString *path;
/**
* @brief The socket which could not be bound.
*/
@property (readonly, nonatomic) id socket;
/**
* @brief The errno of the error that occurred.
|
︙ | | |
91
92
93
94
95
96
97
98
99
100
101
102
103
104
|
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
+
+
+
+
+
+
+
+
+
+
+
+
|
* @return A new, autoreleased bind failed exception
*/
+ (instancetype)exceptionWithPort: (uint16_t)port
packetType: (uint8_t)packetType
socket: (id)socket
errNo: (int)errNo;
/**
* @brief Creates a new, autoreleased bind failed exception.
*
* @param path The path on which binding failed
* @param socket The socket which could not be bound
* @param errNo The errno of the error that occurred
* @return A new, autoreleased bind failed exception
*/
+ (instancetype)exceptionWithPath: (OFString *)path
socket: (id)socket
errNo: (int)errNo;
- (instancetype)init OF_UNAVAILABLE;
/**
* @brief Initializes an already allocated bind failed exception.
*
* @param host The host on which binding failed
* @param port The port on which binding failed
|
︙ | | |
120
121
122
123
124
125
126
127
128
129
|
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
|
+
+
+
+
+
+
+
+
+
+
+
|
* @param errNo The errno of the error that occurred
* @return An initialized bind failed exception
*/
- (instancetype)initWithPort: (uint16_t)port
packetType: (uint8_t)packetType
socket: (id)socket
errNo: (int)errNo;
/**
* @brief Initializes an already allocated bind failed exception.
*
* @param path The path on which binding failed
* @param socket The socket which could not be bound
* @param errNo The errno of the error that occurred
* @return An initialized bind failed exception
*/
- (instancetype)initWithPath: (OFString *)path
socket: (id)socket
errNo: (int)errNo;
@end
OF_ASSUME_NONNULL_END
|
Modified src/exceptions/OFBindFailedException.m
from [5d40ea5e4f]
to [a976d8cd94].
︙ | | |
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
-
+
|
#include "config.h"
#import "OFBindFailedException.h"
#import "OFString.h"
@implementation OFBindFailedException
@synthesize host = _host, port = _port, packetType = _packetType;
@synthesize host = _host, port = _port, packetType = _packetType, path = _path;
@synthesize socket = _socket, errNo = _errNo;
+ (instancetype)exception
{
OF_UNRECOGNIZED_SELECTOR
}
|
︙ | | |
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
|
+
+
+
+
+
+
+
+
+
|
errNo: (int)errNo
{
return [[[self alloc] initWithPort: port
packetType: packetType
socket: sock
errNo: errNo] autorelease];
}
+ (instancetype)exceptionWithPath: (OFString *)path
socket: (id)sock
errNo: (int)errNo
{
return [[[self alloc] initWithPath: path
socket: sock
errNo: errNo] autorelease];
}
- (instancetype)init
{
OF_INVALID_INIT_METHOD
}
- (instancetype)initWithHost: (OFString *)host
|
︙ | | |
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
|
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
|
} @catch (id e) {
[self release];
@throw e;
}
return self;
}
- (instancetype)initWithPath: (OFString *)path
socket: (id)sock
errNo: (int)errNo
{
self = [super init];
@try {
_path = [path copy];
_socket = [sock retain];
_errNo = errNo;
} @catch (id e) {
[self release];
@throw e;
}
return self;
}
- (void)dealloc
{
[_host release];
[_path release];
[_socket release];
[super dealloc];
}
- (OFString *)description
{
if (_path != nil)
return [OFString stringWithFormat:
@"Binding to path %@ failed in socket of type %@: %@",
_path, [_socket class], OFStrError(_errNo)];
if (_host != nil)
else if (_host != nil)
return [OFString stringWithFormat:
@"Binding to port %" @PRIu16 @" on host %@ failed in "
@"socket of type %@: %@",
_port, _host, [_socket class], OFStrError(_errNo)];
else
return [OFString stringWithFormat:
@"Binding to port %" @PRIx16 @" for packet type %" @PRIx8
@" failed in socket of type %@: %@",
_port, _packetType, [_socket class], OFStrError(_errNo)];
}
@end
|
Modified tests/Makefile
from [c0f76538e2]
to [97e65714fd].
︙ | | |
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
|
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
|
-
-
-
-
+
+
+
+
+
+
|
OFRIPEMD160HashTests.m \
OFSerializationTests.m \
OFSHA1HashTests.m \
OFSHA224HashTests.m \
OFSHA256HashTests.m \
OFSHA384HashTests.m \
OFSHA512HashTests.m
SRCS_IPX = OFIPXSocketTests.m \
OFSPXSocketTests.m \
OFSPXStreamSocketTests.m
SRCS_PLUGINS = OFPluginTests.m
SRCS_SOCKETS = OFDNSResolverTests.m \
${OF_HTTP_CLIENT_TESTS_M} \
OFHTTPCookieTests.m \
OFHTTPCookieManagerTests.m \
OFKernelEventObserverTests.m \
OFSocketTests.m \
OFTCPSocketTests.m \
OFUDPSocketTests.m \
${USE_SRCS_IPX}
${USE_SRCS_IPX} \
${USE_SRCS_UNIX_SOCKETS}
SRCS_IPX = OFIPXSocketTests.m \
OFSPXSocketTests.m \
OFSPXStreamSocketTests.m
SRCS_UNIX_SOCKETS = OFUNIXDatagramSocketTests.m
SRCS_THREADS = OFThreadTests.m
SRCS_WINDOWS = OFWindowsRegistryKeyTests.m
IOS_USER ?= mobile
IOS_TMP ?= /tmp/objfw-test
include ../buildsys.mk
|
︙ | | |
Added tests/OFUNIXDatagramSocketTests.m version [66faa10762].
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
|
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
|
/*
* Copyright (c) 2008-2021 Jonathan Schleifer <js@nil.im>
*
* All rights reserved.
*
* This file is part of ObjFW. It may be distributed under the terms of the
* Q Public License 1.0, which can be found in the file LICENSE.QPL included in
* the packaging of this file.
*
* Alternatively, it may be distributed under the terms of the GNU General
* Public License, either version 2 or 3, which can be found in the file
* LICENSE.GPLv2 or LICENSE.GPLv3 respectively included in the packaging of this
* file.
*/
#include "config.h"
#include <errno.h>
#import "TestsAppDelegate.h"
static OFString *const module = @"OFUNIXDatagramSocket";
@implementation TestsAppDelegate (OFUNIXDatagramSocketTests)
- (void)UNIXDatagramSocketTests
{
void *pool = objc_autoreleasePoolPush();
OFString *path;
OFUNIXDatagramSocket *sock;
OFSocketAddress address1, address2;
char buffer[5];
path = [[OFSystemInfo temporaryDirectoryPath]
stringByAppendingPathComponent: [[OFUUID UUID] UUIDString]];
TEST(@"+[socket]", (sock = [OFUNIXDatagramSocket socket]))
TEST(@"-[bindToPath:]", R(address1 = [sock bindToPath: path]))
TEST(@"-[sendBuffer:length:receiver:]",
R([sock sendBuffer: "Hello" length: 5 receiver: &address1]))
TEST(@"-[receiveIntoBuffer:length:sender:]",
[sock receiveIntoBuffer: buffer length: 5 sender: &address2] == 5 &&
memcmp(buffer, "Hello", 5) == 0 &&
OFSocketAddressEqual(&address1, &address2) &&
OFSocketAddressHash(&address1) == OFSocketAddressHash(&address2))
objc_autoreleasePoolPop(pool);
}
@end
|
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
Modified tests/TestsAppDelegate.h
from [36680e2682]
to [8a125e86de].
︙ | | |
238
239
240
241
242
243
244
245
246
247
248
249
250
251
|
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
|
+
+
+
+
|
@interface TestsAppDelegate (OFThreadTests)
- (void)threadTests;
@end
@interface TestsAppDelegate (OFUDPSocketTests)
- (void)UDPSocketTests;
@end
@interface TestsAppDelegate (OFUNIXDatagramSocketTests)
- (void)UNIXDatagramSocketTests;
@end
@interface TestsAppDelegate (OFURLTests)
- (void)URLTests;
@end
@interface TestsAppDelegate (OFValueTests)
- (void)valueTests;
|
︙ | | |
Modified tests/TestsAppDelegate.m
from [1130ab2e6c]
to [9499e9e013].
︙ | | |
351
352
353
354
355
356
357
358
359
360
361
362
363
364
|
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
|
+
+
+
|
[self TCPSocketTests];
[self UDPSocketTests];
# ifdef OF_HAVE_IPX
[self IPXSocketTests];
[self SPXSocketTests];
[self SPXStreamSocketTests];
# endif
# ifdef OF_HAVE_UNIX_SOCKETS
[self UNIXDatagramSocketTests];
# endif
[self kernelEventObserverTests];
#endif
#ifdef OF_HAVE_THREADS
[self threadTests];
#endif
[self URLTests];
#if defined(OF_HAVE_SOCKETS) && defined(OF_HAVE_THREADS)
|
︙ | | |