9 #include "../src/windows.hpp"
10 #if defined ZMQ_HAVE_WINDOWS
11 #if defined ZMQ_HAVE_IPC
16 #pragma warning(disable : 4996)
18 #if _WIN32_WINNT > _WIN32_WINNT_WINXP
19 #pragma comment(lib, "iphlpapi")
29 #include <sys/socket.h>
30 #include <sys/types.h>
31 #include <netinet/in.h>
32 #include <arpa/inet.h>
37 #if defined(ZMQ_HAVE_AIX)
38 #include <sys/types.h>
39 #include <sys/socketvar.h>
61 size_t sz =
sizeof (rcvmore);
71 void bounce (
void *server_,
void *client_)
138 va_start (ap, socket_);
139 const char *
data = va_arg (ap,
const char *);
141 const char *prev =
data;
142 data = va_arg (ap,
const char *);
164 size_t more_size =
sizeof (more);
167 va_start (ap, socket_);
168 const char *
data = va_arg (ap,
const char *);
178 data = va_arg (ap,
const char *);
205 _set_abort_behavior (0, _WRITE_ABORT_MSG);
206 _CrtSetReportMode (_CRT_ASSERT, _CRTDBG_MODE_FILE);
207 _CrtSetReportFile (_CRT_ASSERT, _CRTDBG_FILE_STDERR);
210 #if defined ZMQ_HAVE_CYGWIN
214 #if !defined ZMQ_DISABLE_TEST_TIMEOUT
216 alarm (timeout_seconds_);
223 signal (SIGPIPE, SIG_IGN);
229 #ifdef ZMQ_HAVE_WINDOWS
230 Sleep (milliseconds_);
232 usleep (
static_cast<useconds_t
> (milliseconds_) * 1000);
238 #if defined(ZMQ_HAVE_WINDOWS) && (_WIN32_WINNT < 0x0600)
246 inet_pton (AF_INET6,
"::1", &(
test_addr.sin6_addr));
248 fd_t fd = socket (AF_INET6, SOCK_STREAM, IPPROTO_IP);
252 #ifdef ZMQ_HAVE_WINDOWS
253 setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, (
const char *) &ipv6,
255 rc = setsockopt (fd, IPPROTO_IPV6, IPV6_V6ONLY, (
const char *) &ipv6,
257 if (rc == SOCKET_ERROR)
261 if (rc == SOCKET_ERROR)
265 setsockopt (fd, SOL_SOCKET, SO_REUSEADDR, &ipv6,
sizeof (
int));
266 rc = setsockopt (fd, IPPROTO_IPV6, IPV6_V6ONLY, &ipv6,
sizeof (
int));
270 rc = bind (fd,
reinterpret_cast<struct sockaddr *
> (&
test_addr),
280 #endif // _WIN32_WINNT < 0x0600
285 #ifndef ZMQ_HAVE_TIPC
300 #endif // ZMQ_HAVE_TIPC
305 #if defined(ZMQ_HAVE_WINDOWS) && (_WIN32_WINNT < 0x0600)
306 if (af_ == AF_INET) {
307 struct in_addr *ip4addr = (
struct in_addr *) dst_;
309 ip4addr->s_addr = inet_addr (src_);
313 if (ip4addr->s_addr == INADDR_NONE
314 && strcmp (src_,
"255.255.255.255") != 0) {
325 return inet_pton (af_, src_, dst_);
331 struct sockaddr_in saddr;
332 memset (&saddr, 0,
sizeof (saddr));
333 saddr.sin_family = AF_INET;
334 saddr.sin_addr.s_addr = INADDR_ANY;
335 #if !defined(_WIN32_WINNT) || (_WIN32_WINNT >= 0x0600)
338 saddr.sin_port = htons (
PORT_6);
342 bind (socket_, (
struct sockaddr *) &saddr,
sizeof (saddr)));
344 #if !defined(_WIN32_WINNT) || (_WIN32_WINNT >= 0x0600)
345 socklen_t saddr_len =
sizeof (saddr);
347 getsockname (socket_, (
struct sockaddr *) &saddr, &saddr_len));
355 struct sockaddr_storage addr;
358 const fd_t s_pre = socket (af_, SOCK_STREAM,
359 protocol_ == IPPROTO_UDP ? IPPROTO_UDP
360 : protocol_ == IPPROTO_TCP ? IPPROTO_TCP
362 #ifdef ZMQ_HAVE_WINDOWS
368 if (af_ == AF_INET || af_ == AF_INET6) {
369 const char *port = strrchr (endpoint_,
':') + 1;
372 if (*strchr (endpoint_,
'/') + 2 ==
'[') {
373 strcpy (
address, strchr (endpoint_,
'[') + 1);
376 strcpy (
address, strchr (endpoint_,
'/') + 2);
380 struct addrinfo *in, hint;
381 memset (&hint, 0,
sizeof (
struct addrinfo));
383 hint.ai_family = af_;
384 hint.ai_socktype = protocol_ == IPPROTO_UDP ? SOCK_DGRAM : SOCK_STREAM;
385 hint.ai_protocol = protocol_ == IPPROTO_UDP ? IPPROTO_UDP : IPPROTO_TCP;
388 getaddrinfo (
address, port, &hint, &in));
390 memcpy (&addr, in->ai_addr, in->ai_addrlen);
391 addr_len = (socklen_t) in->ai_addrlen;
394 #if defined(ZMQ_HAVE_IPC)
396 (*(
struct sockaddr_un *) &addr).sun_family = AF_UNIX;
397 strcpy ((*(
struct sockaddr_un *) &addr).sun_path, endpoint_);
398 addr_len =
sizeof (
struct sockaddr_un);
405 connect (s_pre, (
struct sockaddr *) &addr, addr_len));
416 struct sockaddr_storage addr;
419 const fd_t s_pre = socket (af_, SOCK_STREAM,
420 protocol_ == IPPROTO_UDP ? IPPROTO_UDP
421 : protocol_ == IPPROTO_TCP ? IPPROTO_TCP
423 #ifdef ZMQ_HAVE_WINDOWS
429 if (af_ == AF_INET || af_ == AF_INET6) {
430 #ifdef ZMQ_HAVE_WINDOWS
431 const char flag =
'\1';
432 #elif defined ZMQ_HAVE_VXWORKS
437 struct addrinfo *in, hint;
438 memset (&hint, 0,
sizeof (
struct addrinfo));
440 hint.ai_family = af_;
441 hint.ai_socktype = protocol_ == IPPROTO_UDP ? SOCK_DGRAM : SOCK_STREAM;
442 hint.ai_protocol = protocol_ == IPPROTO_UDP ? IPPROTO_UDP : IPPROTO_TCP;
445 setsockopt (s_pre, SOL_SOCKET, SO_REUSEADDR, &flag,
sizeof (
int)));
447 getaddrinfo (address_, port_, &hint, &in));
449 memcpy (&addr, in->ai_addr, in->ai_addrlen);
450 addr_len = (socklen_t) in->ai_addrlen;
453 #if defined(ZMQ_HAVE_IPC)
455 (*(
struct sockaddr_un *) &addr).sun_family = AF_UNIX;
456 addr_len =
sizeof (
struct sockaddr_un);
457 #if defined ZMQ_HAVE_WINDOWS
458 char buffer[MAX_PATH] =
"";
465 strcpy (
buffer,
"tmpXXXXXX");
468 strcat (
buffer,
"/socket");
470 int fd = mkstemp (
buffer);
475 strcpy ((*(
struct sockaddr_un *) &addr).sun_path,
buffer);
476 memcpy (my_endpoint_,
"ipc://", 7);
477 strcat (my_endpoint_,
buffer);
487 bind (s_pre, (
struct sockaddr *) &addr, addr_len));
490 if (af_ == AF_INET || af_ == AF_INET6) {
491 addr_len =
sizeof (
struct sockaddr_storage);
493 getsockname (s_pre, (
struct sockaddr *) &addr, &addr_len));
495 my_endpoint_, 6 + strlen (address_) + 7 *
sizeof (
char),
"%s://%s:%u",
496 protocol_ == IPPROTO_TCP ?
"tcp"
497 : protocol_ == IPPROTO_UDP ?
"udp"
501 af_ == AF_INET ? ntohs ((*(
struct sockaddr_in *) &addr).sin_port)
502 : ntohs ((*(
struct sockaddr_in6 *) &addr).sin6_port));
510 return strcmp (lhs_,
rhs_) == 0;
515 return strcmp (lhs_,
rhs_) != 0;
553 if (!strcmp (ent->
d_name,
".") || !strcmp (ent->
d_name,
".."))
557 (
char *) malloc (strlen (dirname) + strlen (ent->
d_name) + 2);
559 strcpy (filename, dirname);
560 strcat (filename,
"/");
561 strcat (filename, ent->
d_name);
562 FILE *
f = fopen (filename,
"r");
567 fseek (
f, 0, SEEK_END);
568 size_t file_len = ftell (
f);
569 fseek (
f, 0, SEEK_SET);
575 *
len = (
size_t *) realloc (*
len, (*num_cases + 1) *
sizeof (size_t));
577 *(*
len + *num_cases) = file_len;
579 (uint8_t **) realloc (*
data, (*num_cases + 1) *
sizeof (uint8_t *));
581 *(*
data + *num_cases) =
582 (uint8_t *) malloc (file_len *
sizeof (uint8_t));
584 size_t read_bytes = 0;
585 read_bytes = fread (*(*
data + *num_cases), 1, file_len,
f);