Annotation of embedaddon/strongswan/src/libstrongswan/utils/compat/windows.h, revision 1.1.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>