Annotation of embedaddon/strongswan/src/libstrongswan/utils/compat/windows.h, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2013 Martin Willi
! 3: * Copyright (C) 2013 revosec AG
! 4: *
! 5: * This program is free software; you can redistribute it and/or modify it
! 6: * under the terms of the GNU General Public License as published by the
! 7: * Free Software Foundation; either version 2 of the License, or (at your
! 8: * option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
! 9: *
! 10: * This program is distributed in the hope that it will be useful, but
! 11: * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
! 12: * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
! 13: * for more details.
! 14: */
! 15:
! 16: /**
! 17: * @defgroup windows windows
! 18: * @{ @ingroup compat
! 19: */
! 20:
! 21: #ifndef WINDOWS_H_
! 22: #define WINDOWS_H_
! 23:
! 24: #include <winsock2.h>
! 25: #include <ws2tcpip.h>
! 26: #include <direct.h>
! 27: #include <inttypes.h>
! 28: #include <unistd.h>
! 29: #include <sys/stat.h>
! 30:
! 31: /* undef Windows variants evaluating values more than once */
! 32: #undef min
! 33: #undef max
! 34:
! 35: /* interface is defined as an alias to "struct" in basetypes.h, but
! 36: * we use it here and there as ordinary identifier. */
! 37: #undef interface
! 38:
! 39: /* used by Windows API, but we have our own */
! 40: #undef CALLBACK
! 41:
! 42: /* UID/GID types for capabilities, even if not supported */
! 43: typedef u_int uid_t;
! 44: typedef u_int gid_t;
! 45:
! 46: /**
! 47: * Initialize Windows libraries
! 48: */
! 49: void windows_init();
! 50:
! 51: /**
! 52: * Deinitialize windows libraries
! 53: */
! 54: void windows_deinit();
! 55:
! 56: /**
! 57: * Replacement for random(3)
! 58: */
! 59: static inline long random(void)
! 60: {
! 61: return rand();
! 62: }
! 63:
! 64: /**
! 65: * Replacement for srandom(3)
! 66: */
! 67: static inline void srandom(unsigned int seed)
! 68: {
! 69: srand(seed);
! 70: }
! 71:
! 72: /**
! 73: * Replacement of sched_yield(2) from <sched.h>
! 74: */
! 75: static inline int sched_yield(void)
! 76: {
! 77: Sleep(0);
! 78: return 0;
! 79: }
! 80:
! 81: /**
! 82: * Replacement of sleep(3), cancellable by thread_cancel()
! 83: */
! 84: #define sleep sleep_cancellable
! 85: static inline int sleep_cancellable(unsigned int seconds)
! 86: {
! 87: SleepEx(seconds * 1000, TRUE);
! 88: return 0;
! 89: }
! 90:
! 91: /**
! 92: * Replacement of usleep(3), cancellable, ms resolution only
! 93: */
! 94: int usleep(useconds_t usec);
! 95:
! 96: /**
! 97: * strdup(3), the Windows variant can't free(strdup("")) and others
! 98: */
! 99: #define strdup strdup_windows
! 100: static inline char* strdup_windows(const char *src)
! 101: {
! 102: size_t len;
! 103: char *dst;
! 104:
! 105: len = strlen(src) + 1;
! 106: dst = malloc(len);
! 107: memcpy(dst, src, len);
! 108: return dst;
! 109: }
! 110:
! 111: /**
! 112: * strndup(3)
! 113: */
! 114: char* strndup(const char *s, size_t n);
! 115:
! 116: /**
! 117: * From winsock2.h
! 118: */
! 119: #ifndef IPPROTO_IPIP
! 120: #define IPPROTO_IPIP IPPROTO_IPV4
! 121: #endif
! 122:
! 123: /**
! 124: * Provided via ws2_32
! 125: */
! 126: #ifndef InetNtop
! 127: const char WINAPI *inet_ntop(int af, const void *src, char *dst, socklen_t size);
! 128: #endif
! 129:
! 130: /**
! 131: * Provided via ws2_32
! 132: */
! 133: #ifndef InetPton
! 134: int WINAPI inet_pton(int af, const char *src, void *dst);
! 135: #endif
! 136:
! 137: /**
! 138: * Provided by printf hook backend
! 139: */
! 140: int asprintf(char **strp, const char *fmt, ...);
! 141:
! 142: /**
! 143: * Provided by printf hook backend
! 144: */
! 145: int vasprintf(char **strp, const char *fmt, va_list ap);
! 146:
! 147: /**
! 148: * timeradd(3) from <sys/time.h>
! 149: */
! 150: static inline void timeradd(struct timeval *a, struct timeval *b,
! 151: struct timeval *res)
! 152: {
! 153: res->tv_sec = a->tv_sec + b->tv_sec;
! 154: res->tv_usec = a->tv_usec + b->tv_usec;
! 155: if (res->tv_usec >= 1000000)
! 156: {
! 157: res->tv_usec -= 1000000;
! 158: res->tv_sec++;
! 159: }
! 160: }
! 161:
! 162: /**
! 163: * timersub(3) from <sys/time.h>
! 164: */
! 165: static inline void timersub(struct timeval *a, struct timeval *b,
! 166: struct timeval *res)
! 167: {
! 168: res->tv_sec = a->tv_sec - b->tv_sec;
! 169: res->tv_usec = a->tv_usec - b->tv_usec;
! 170: if (res->tv_usec < 0)
! 171: {
! 172: res->tv_usec += 1000000;
! 173: res->tv_sec--;
! 174: }
! 175: }
! 176:
! 177: /**
! 178: * gmtime_r(3) from <time.h>
! 179: */
! 180: static inline struct tm *gmtime_r(const time_t *timep, struct tm *result)
! 181: {
! 182: struct tm *ret;
! 183:
! 184: /* gmtime_s() and friends seem not to be implemented/functioning.
! 185: * Relying on gmtime() on Windows works as well, as it uses thread
! 186: * specific buffers. */
! 187: ret = gmtime(timep);
! 188: if (ret)
! 189: {
! 190: memcpy(result, ret, sizeof(*result));
! 191: }
! 192: return ret;
! 193: }
! 194:
! 195: /**
! 196: * localtime_r(3) from <time.h>
! 197: */
! 198: static inline struct tm *localtime_r(const time_t *timep, struct tm *result)
! 199: {
! 200: struct tm *ret;
! 201:
! 202: /* localtime_s() and friends seem not to be implemented/functioning.
! 203: * Relying on localtime() on Windows works as well, as it uses thread
! 204: * specific buffers. */
! 205: ret = localtime(timep);
! 206: if (ret)
! 207: {
! 208: memcpy(result, ret, sizeof(*result));
! 209: }
! 210: return ret;
! 211: }
! 212:
! 213: /**
! 214: * setenv(3) from <stdlib.h>, overwrite flag is ignored
! 215: */
! 216: static inline int setenv(const char *name, const char *value, int overwrite)
! 217: {
! 218: if (SetEnvironmentVariableA(name, value) == 0)
! 219: { /* failed */
! 220: return -1;
! 221: }
! 222: return 0;
! 223: }
! 224:
! 225: /**
! 226: * stat(2) behaves like lstat(2) for symbolic links on Windows
! 227: */
! 228: #define lstat stat
! 229:
! 230: /**
! 231: * Lazy binding, ignored on Windows
! 232: */
! 233: #define RTLD_LAZY 1
! 234:
! 235: /**
! 236: * Immediate binding, ignored on Windows
! 237: */
! 238: #define RTLD_NOW 2
! 239:
! 240: /**
! 241: * Default handle targeting .exe
! 242: */
! 243: #define RTLD_DEFAULT (NULL)
! 244:
! 245: /**
! 246: * Find symbol in next library
! 247: */
! 248: #define RTLD_NEXT ((void*)~(uintptr_t)0)
! 249:
! 250: /**
! 251: * dlopen(3) from <dlfcn.h>
! 252: */
! 253: void* dlopen(const char *filename, int flag);
! 254:
! 255: /**
! 256: * dlsym() from <dlfcn.h>
! 257: */
! 258: void* dlsym(void *handle, const char *symbol);
! 259:
! 260: /**
! 261: * dlerror(3) from <dlfcn.h>, currently not thread save
! 262: */
! 263: char* dlerror(void);
! 264:
! 265: /**
! 266: * dlclose() from <dlfcn.h>
! 267: */
! 268: int dlclose(void *handle);
! 269:
! 270: /**
! 271: * socketpair(2) for SOCK_STREAM, uses TCP on loopback
! 272: */
! 273: int socketpair(int domain, int type, int protocol, int sv[2]);
! 274:
! 275: /**
! 276: * getpass(3) on Windows consoles
! 277: */
! 278: char* getpass(const char *prompt);
! 279: #define HAVE_GETPASS
! 280:
! 281: /**
! 282: * Map MSG_DONTWAIT to the reserved, but deprecated MSG_INTERRUPT
! 283: */
! 284: #define MSG_DONTWAIT MSG_INTERRUPT
! 285:
! 286: /**
! 287: * shutdown(2) "how"-aliases, to use Unix variant on Windows
! 288: */
! 289: #define SHUT_RD SD_RECEIVE
! 290: #define SHUT_WR SD_SEND
! 291: #define SHUT_RDWR SD_BOTH
! 292:
! 293: /**
! 294: * shutdown(2) setting errno
! 295: */
! 296: #define shutdown windows_shutdown
! 297: int windows_shutdown(int sockfd, int how);
! 298:
! 299: /**
! 300: * accept(2) setting errno
! 301: */
! 302: #define accept windows_accept
! 303: int windows_accept(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
! 304:
! 305: /**
! 306: * bind(2) setting errno
! 307: */
! 308: #define bind windows_bind
! 309: int windows_bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
! 310:
! 311: /**
! 312: * connect(2) setting errno
! 313: */
! 314: #define connect windows_connect
! 315: int windows_connect(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
! 316:
! 317: /**
! 318: * getsockname(2) setting errno
! 319: */
! 320: #define getsockname windows_getsockname
! 321: int windows_getsockname(int sockfd, struct sockaddr *addr, socklen_t *addrlen);
! 322:
! 323: /**
! 324: * getsockopt(2) setting errno
! 325: */
! 326: #define getsockopt windows_getsockopt
! 327: int windows_getsockopt(int sockfd, int level, int optname,
! 328: void *optval, socklen_t *optlen);
! 329:
! 330: /**
! 331: * setsockopt(2) setting errno
! 332: */
! 333: #define setsockopt windows_setsockopt
! 334: int windows_setsockopt(int sockfd, int level, int optname,
! 335: const void *optval, socklen_t optlen);
! 336:
! 337: /**
! 338: * socket(2) setting errno
! 339: */
! 340: #define socket windows_socket
! 341: int windows_socket(int domain, int type, int protocol);
! 342:
! 343: /**
! 344: * select(2) setting errno
! 345: */
! 346: #define select windows_select
! 347: int windows_select(int nfds, fd_set *readfds, fd_set *writefds,
! 348: fd_set *exceptfds, struct timeval *timeout);
! 349:
! 350: /**
! 351: * close(2) working for file handles and Winsock sockets
! 352: */
! 353: #define close windows_close
! 354: int windows_close(int fd);
! 355:
! 356: /**
! 357: * recv(2) with support for MSG_DONTWAIT
! 358: */
! 359: #define recv windows_recv
! 360: ssize_t windows_recv(int sockfd, void *buf, size_t len, int flags);
! 361:
! 362: /**
! 363: * recvfrom(2) with support for MSG_DONTWAIT
! 364: */
! 365: #define recvfrom windows_recvfrom
! 366: ssize_t windows_recvfrom(int sockfd, void *buf, size_t len, int flags,
! 367: struct sockaddr *src_addr, socklen_t *addrlen);
! 368:
! 369: /**
! 370: * recvfrom(2) with support for MSG_DONTWAIT
! 371: */
! 372: #define send windows_send
! 373: ssize_t windows_send(int sockfd, const void *buf, size_t len, int flags);
! 374:
! 375: /**
! 376: * recvfrom(2) with support for MSG_DONTWAIT
! 377: */
! 378: #define sendto windows_send
! 379: ssize_t windows_sendto(int sockfd, const void *buf, size_t len, int flags,
! 380: const struct sockaddr *dest_addr, socklen_t addrlen);
! 381:
! 382: /**
! 383: * read(2) working on files and sockets, cancellable on sockets only
! 384: *
! 385: * On Windows, there does not seem to be a way how a cancellable read can
! 386: * be implemented on Low level I/O functions for files, _pipe()s or stdio.
! 387: */
! 388: #define read windows_read
! 389: ssize_t windows_read(int fd, void *buf, size_t count);
! 390:
! 391: /**
! 392: * write(2) working on files and sockets
! 393: */
! 394: #define write windows_write
! 395: ssize_t windows_write(int fd, void *buf, size_t count);
! 396:
! 397: #if _WIN32_WINNT < 0x0600
! 398: /**
! 399: * Define pollfd and flags on our own if not specified
! 400: */
! 401: struct pollfd {
! 402: SOCKET fd;
! 403: short events;
! 404: short revents;
! 405: };
! 406: enum {
! 407: POLLERR = 0x0001,
! 408: POLLHUP = 0x0002,
! 409: POLLNVAL = 0x0004,
! 410: POLLWRNORM = 0x0010,
! 411: POLLWRBAND = 0x0020,
! 412: POLLPRI = 0x0400,
! 413: POLLRDNORM = 0x0100,
! 414: POLLRDBAND = 0x0200,
! 415: POLLIN = POLLRDNORM | POLLRDBAND,
! 416: POLLOUT = POLLWRNORM,
! 417: };
! 418: #endif /* _WIN32_WINNT < 0x0600 */
! 419:
! 420: /**
! 421: * poll(2), implemented using Winsock2 WSAPoll()
! 422: */
! 423: int poll(struct pollfd *fds, int nfds, int timeout);
! 424:
! 425: /**
! 426: * Declaration missing on older WinGW
! 427: */
! 428: _CRTIMP errno_t strerror_s(char *buf, size_t size, int errnum);
! 429:
! 430: /**
! 431: * strerror_s, but supporting POSIX compatibility errno >= 100
! 432: */
! 433: #define strerror_s strerror_s_extended
! 434: int strerror_s_extended(char *buf, size_t buflen, int errnum);
! 435:
! 436: /**
! 437: * strerror_r(2) replacement, XSI variant
! 438: */
! 439: static inline int strerror_r(int errnum, char *buf, size_t buflen)
! 440: {
! 441: return strerror_s(buf, buflen, errnum);
! 442: }
! 443: #define HAVE_STRERROR_R /* but not STRERROR_R_CHAR_P */
! 444:
! 445: /**
! 446: * MinGW does provide extended errno values. Windows itself knowns them
! 447: * for POSIX compatibility; we define them as well.
! 448: */
! 449: #ifndef EADDRINUSE
! 450: #define EADDRINUSE 100
! 451: #endif
! 452: #ifndef EADDRNOTAVAIL
! 453: #define EADDRNOTAVAIL 101
! 454: #endif
! 455: #ifndef EAFNOSUPPORT
! 456: #define EAFNOSUPPORT 102
! 457: #endif
! 458: #ifndef EALREADY
! 459: #define EALREADY 103
! 460: #endif
! 461: #ifndef EBADMSG
! 462: #define EBADMSG 104
! 463: #endif
! 464: #ifndef ECANCELED
! 465: #define ECANCELED 105
! 466: #endif
! 467: #ifndef ECONNABORTED
! 468: #define ECONNABORTED 106
! 469: #endif
! 470: #ifndef ECONNREFUSED
! 471: #define ECONNREFUSED 107
! 472: #endif
! 473: #ifndef ECONNRESET
! 474: #define ECONNRESET 108
! 475: #endif
! 476: #ifndef EDESTADDRREQ
! 477: #define EDESTADDRREQ 109
! 478: #endif
! 479: #ifndef EHOSTUNREACH
! 480: #define EHOSTUNREACH 110
! 481: #endif
! 482: #ifndef EIDRM
! 483: #define EIDRM 111
! 484: #endif
! 485: #ifndef EINPROGRESS
! 486: #define EINPROGRESS 112
! 487: #endif
! 488: #ifndef EISCONN
! 489: #define EISCONN 113
! 490: #endif
! 491: #ifndef ELOOP
! 492: #define ELOOP 114
! 493: #endif
! 494: #ifndef EMSGSIZE
! 495: #define EMSGSIZE 115
! 496: #endif
! 497: #ifndef ENETDOWN
! 498: #define ENETDOWN 116
! 499: #endif
! 500: #ifndef ENETRESET
! 501: #define ENETRESET 117
! 502: #endif
! 503: #ifndef ENETUNREACH
! 504: #define ENETUNREACH 118
! 505: #endif
! 506: #ifndef ENOBUFS
! 507: #define ENOBUFS 119
! 508: #endif
! 509: #ifndef ENODATA
! 510: #define ENODATA 120
! 511: #endif
! 512: #ifndef ENOLINK
! 513: #define ENOLINK 121
! 514: #endif
! 515: #ifndef ENOMSG
! 516: #define ENOMSG 122
! 517: #endif
! 518: #ifndef ENOPROTOOPT
! 519: #define ENOPROTOOPT 123
! 520: #endif
! 521: #ifndef ENOSR
! 522: #define ENOSR 124
! 523: #endif
! 524: #ifndef ENOSTR
! 525: #define ENOSTR 125
! 526: #endif
! 527: #ifndef ENOTCONN
! 528: #define ENOTCONN 126
! 529: #endif
! 530: #ifndef ENOTRECOVERABLE
! 531: #define ENOTRECOVERABLE 127
! 532: #endif
! 533: #ifndef ENOTSOCK
! 534: #define ENOTSOCK 128
! 535: #endif
! 536: #ifndef ENOTSUP
! 537: #define ENOTSUP 129
! 538: #endif
! 539: #ifndef EOPNOTSUPP
! 540: #define EOPNOTSUPP 130
! 541: #endif
! 542: #ifndef EOTHER
! 543: #define EOTHER 131
! 544: #endif
! 545: #ifndef EOVERFLOW
! 546: #define EOVERFLOW 132
! 547: #endif
! 548: #ifndef EOWNERDEAD
! 549: #define EOWNERDEAD 133
! 550: #endif
! 551: #ifndef EPROTO
! 552: #define EPROTO 134
! 553: #endif
! 554: #ifndef EPROTONOSUPPORT
! 555: #define EPROTONOSUPPORT 135
! 556: #endif
! 557: #ifndef EPROTOTYPE
! 558: #define EPROTOTYPE 136
! 559: #endif
! 560: #ifndef ETIME
! 561: #define ETIME 137
! 562: #endif
! 563: #ifndef ETIMEDOUT
! 564: #define ETIMEDOUT 138
! 565: #endif
! 566: #ifndef ETXTBSY
! 567: #define ETXTBSY 139
! 568: #endif
! 569: #ifndef EWOULDBLOCK
! 570: #define EWOULDBLOCK 140
! 571: #endif
! 572:
! 573:
! 574: /* Windows does not support "ll" format printf length modifiers. Mingw
! 575: * therefore maps these to the Windows specific I64 length modifier. That
! 576: * won't work for us, as we use our own printf backend on Windows, which works
! 577: * just fine with "ll". */
! 578: #undef PRId64
! 579: #define PRId64 "lld"
! 580: #undef PRId64
! 581: #define PRId64 "lld"
! 582: #undef PRIdLEAST64
! 583: #define PRIdLEAST64 "lld"
! 584: #undef PRIdFAST64
! 585: #define PRIdFAST64 "lld"
! 586: #undef PRIdMAX
! 587: #define PRIdMAX "lld"
! 588: #undef PRIi64
! 589: #define PRIi64 "lli"
! 590: #undef PRIiLEAST64
! 591: #define PRIiLEAST64 "lli"
! 592: #undef PRIiFAST64
! 593: #define PRIiFAST64 "lli"
! 594: #undef PRIiMAX
! 595: #define PRIiMAX "lli"
! 596: #undef PRIo64
! 597: #define PRIo64 "llo"
! 598: #undef PRIoLEAST64
! 599: #define PRIoLEAST64 "llo"
! 600: #undef PRIoFAST64
! 601: #define PRIoFAST64 "llo"
! 602: #undef PRIoMAX
! 603: #define PRIoMAX "llo"
! 604: #undef PRIu64
! 605: #define PRIu64 "llu"
! 606: #undef PRIuLEAST64
! 607: #define PRIuLEAST64 "llu"
! 608: #undef PRIuFAST64
! 609: #define PRIuFAST64 "llu"
! 610: #undef PRIuMAX
! 611: #define PRIuMAX "llu"
! 612: #undef PRIx64
! 613: #define PRIx64 "llx"
! 614: #undef PRIxLEAST64
! 615: #define PRIxLEAST64 "llx"
! 616: #undef PRIxFAST64
! 617: #define PRIxFAST64 "llx"
! 618: #undef PRIxMAX
! 619: #define PRIxMAX "llx"
! 620: #undef PRIX64
! 621: #define PRIX64 "llX"
! 622: #undef PRIXLEAST64
! 623: #define PRIXLEAST64 "llX"
! 624: #undef PRIXFAST64
! 625: #define PRIXFAST64 "llX"
! 626: #undef PRIXMAX
! 627: #define PRIXMAX "llX"
! 628:
! 629: #ifdef _WIN64
! 630: # undef PRIdPTR
! 631: # define PRIdPTR "lld"
! 632: # undef PRIiPTR
! 633: # define PRIiPTR "lli"
! 634: # undef PRIoPTR
! 635: # define PRIoPTR "llo"
! 636: # undef PRIuPTR
! 637: # define PRIuPTR "llu"
! 638: # undef PRIxPTR
! 639: # define PRIxPTR "llx"
! 640: # undef PRIXPTR
! 641: # define PRIXPTR "llX"
! 642: #endif /* _WIN64 */
! 643:
! 644: #endif /** WINDOWS_H_ @}*/
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>