mswsock.h 3.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. /**
  2. * @file mswsock.h
  3. * @author Ambroz Bizjak <ambrop7@gmail.com>
  4. *
  5. * @section LICENSE
  6. *
  7. * This file is part of BadVPN.
  8. *
  9. * BadVPN is free software: you can redistribute it and/or modify
  10. * it under the terms of the GNU General Public License version 2
  11. * as published by the Free Software Foundation.
  12. *
  13. * BadVPN is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License along
  19. * with this program; if not, write to the Free Software Foundation, Inc.,
  20. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  21. *
  22. * @section DESCRIPTION
  23. *
  24. * WinSock MS extensions definitions.
  25. *
  26. * This file exists because MinGW's headers are unpredictable and don't
  27. * contain everything we need.
  28. */
  29. #ifndef BADVPN_MISC_MSWSOCK_H
  30. #define BADVPN_MISC_MSWSOCK_H
  31. #if !defined(__GNUC__) || defined(BADVPN_USE_SYSTEM_MSWSOCK_H)
  32. #include <mswsock.h>
  33. #else
  34. #include <windows.h>
  35. #include <winsock2.h>
  36. #ifdef _WIN64
  37. #define BADVPN_MAX_NATURAL_ALIGNMENT sizeof(ULONGLONG)
  38. #define BADVPN_MEMORY_ALLOCATION_ALIGNMENT 16
  39. #else
  40. #define BADVPN_MAX_NATURAL_ALIGNMENT sizeof(DWORD)
  41. #define BADVPN_MEMORY_ALLOCATION_ALIGNMENT 8
  42. #endif
  43. #ifdef __cplusplus
  44. #define BADVPN_TYPE_ALIGNMENT(t) __alignof__ (t)
  45. #else
  46. #define BADVPN_TYPE_ALIGNMENT(t) FIELD_OFFSET(struct { char x; t test; },test)
  47. #endif
  48. typedef struct _WSAMSG {
  49. LPSOCKADDR name;
  50. INT namelen;
  51. LPWSABUF lpBuffers;
  52. DWORD dwBufferCount;
  53. WSABUF Control;
  54. DWORD dwFlags;
  55. } WSAMSG,*PWSAMSG,*LPWSAMSG;
  56. typedef struct _WSACMSGHDR {
  57. SIZE_T cmsg_len;
  58. INT cmsg_level;
  59. INT cmsg_type;
  60. } WSACMSGHDR,*PWSACMSGHDR,*LPWSACMSGHDR;
  61. #define WSA_CMSGHDR_ALIGN(length) (((length) + BADVPN_TYPE_ALIGNMENT(WSACMSGHDR)-1) & (~(BADVPN_TYPE_ALIGNMENT(WSACMSGHDR)-1)))
  62. #define WSA_CMSGDATA_ALIGN(length) (((length) + BADVPN_MAX_NATURAL_ALIGNMENT-1) & (~(BADVPN_MAX_NATURAL_ALIGNMENT-1)))
  63. #define WSA_CMSG_FIRSTHDR(msg) (((msg)->Control.len >= sizeof(WSACMSGHDR)) ? (LPWSACMSGHDR)(msg)->Control.buf : (LPWSACMSGHDR)NULL)
  64. #define WSA_CMSG_NXTHDR(msg,cmsg) ((!(cmsg)) ? WSA_CMSG_FIRSTHDR(msg) : ((((u_char *)(cmsg) + WSA_CMSGHDR_ALIGN((cmsg)->cmsg_len) + sizeof(WSACMSGHDR)) > (u_char *)((msg)->Control.buf) + (msg)->Control.len) ? (LPWSACMSGHDR)NULL : (LPWSACMSGHDR)((u_char *)(cmsg) + WSA_CMSGHDR_ALIGN((cmsg)->cmsg_len))))
  65. #define WSA_CMSG_DATA(cmsg) ((u_char *)(cmsg) + WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR)))
  66. #define WSA_CMSG_SPACE(length) (WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR) + WSA_CMSGHDR_ALIGN(length)))
  67. #define WSA_CMSG_LEN(length) (WSA_CMSGDATA_ALIGN(sizeof(WSACMSGHDR)) + length)
  68. #define WSAID_WSARECVMSG {0xf689d7c8,0x6f1f,0x436b,{0x8a,0x53,0xe5,0x4f,0xe3,0x51,0xc3,0x22}}
  69. typedef INT (WINAPI *LPFN_WSARECVMSG)(SOCKET s, LPWSAMSG lpMsg, LPDWORD lpdwNumberOfBytesRecvd,
  70. LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
  71. #define WSAID_WSASENDMSG {0xa441e712,0x754f,0x43ca,{0x84,0xa7,0x0d,0xee,0x44,0xcf,0x60,0x6d}}
  72. typedef INT (WINAPI *LPFN_WSASENDMSG)(SOCKET s, LPWSAMSG lpMsg, DWORD dwFlags, LPDWORD lpNumberOfBytesSent,
  73. LPWSAOVERLAPPED lpOverlapped, LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine);
  74. #endif
  75. #endif