39
39
#include < fcntl.h>
40
40
#include < errno.h>
41
41
42
+ int mockSockSetup (int sock)
43
+ {
44
+ if (fcntl (sock, F_SETFL, O_NONBLOCK) == -1 )
45
+ {
46
+ fprintf (stderr, MOCK " socket fcntl(O_NONBLOCK): %s\n " , strerror (errno));
47
+ close (sock);
48
+ return -1 ;
49
+ }
50
+
51
+ #ifndef MSG_NOSIGNAL
52
+ int i = 1 ;
53
+ if (setsockopt (sock, SOL_SOCKET, SO_NOSIGPIPE, &i, sizeof i) == -1 )
54
+ {
55
+ fprintf (stderr, MOCK " sockopt( SO_NOSIGPIPE)(macOS): %s\n " , strerror (errno));
56
+ return -1 ;
57
+ }
58
+ #endif
59
+
60
+ return sock;
61
+ }
62
+
42
63
int mockConnect (uint32_t ipv4, int & sock, int port)
43
64
{
44
65
struct sockaddr_in server;
@@ -56,14 +77,7 @@ int mockConnect (uint32_t ipv4, int& sock, int port)
56
77
return 0 ;
57
78
}
58
79
59
- if (fcntl (sock, F_SETFL, O_NONBLOCK) == -1 )
60
- {
61
- fprintf (stderr, MOCK " ClientContext::connect: fcntl(O_NONBLOCK): %s\n " , strerror (errno));
62
- close (sock);
63
- return 0 ;
64
- }
65
-
66
- return 1 ;
80
+ return mockSockSetup (sock) == -1 ? 0 : 1 ;
67
81
}
68
82
69
83
ssize_t mockFillInBuf (int sock, char * ccinbuf, size_t & ccinbufsize)
@@ -142,8 +156,11 @@ ssize_t mockWrite (int sock, const uint8_t* data, size_t size, int timeout_ms)
142
156
}
143
157
if (ret)
144
158
{
145
- // ret = ::write(sock, data, size);
159
+ #ifndef MSG_NOSIGNAL
160
+ ret = ::write (sock, data, size);
161
+ #else
146
162
ret = ::send (sock, data, size, MSG_NOSIGNAL);
163
+ #endif
147
164
if (ret == -1 )
148
165
{
149
166
fprintf (stderr, MOCK " ClientContext::read: write(%d): %s\n " , sock, strerror (errno));
0 commit comments