diff options
Diffstat (limited to 'lib/windows/winlean.nim')
-rwxr-xr-x | lib/windows/winlean.nim | 146 |
1 files changed, 145 insertions, 1 deletions
diff --git a/lib/windows/winlean.nim b/lib/windows/winlean.nim index f384a04e8..ebf0fdc96 100755 --- a/lib/windows/winlean.nim +++ b/lib/windows/winlean.nim @@ -1,7 +1,7 @@ # # # Nimrod's Runtime Library -# (c) Copyright 2009 Andreas Rumpf +# (c) Copyright 2010 Andreas Rumpf # # See the file "copying.txt", included in this # distribution, for details about the copyright. @@ -197,3 +197,147 @@ proc ShellExecute*(HWND: THandle, lpOperation, lpFile, nShowCmd: int32): THandle{. stdcall, dynlib: "shell32.dll", importc: "ShellExecuteA".} +const + WSADESCRIPTION_LEN* = 256 + WSASYS_STATUS_LEN* = 128 + FD_SETSIZE* = 64 + MSG_PEEK* = 2 + + INADDR_ANY* = 0 + INADDR_LOOPBACK* = 0x7F000001 + INADDR_BROADCAST* = -1 + INADDR_NONE* = -1 + +type + TWSAData* {.pure, final.} = object + wVersion, wHighVersion: int16 + szDescription: array[0..WSADESCRIPTION_LEN, char] + szSystemStatus: array[0..WSASYS_STATUS_LEN, char] + iMaxSockets, iMaxUdpDg: int16 + lpVendorInfo: cstring + + TSockAddr* {.pure, final.} = object + sa_family*: int16 # unsigned + sa_data: array[0..13, char] + + TInAddr* {.pure, final.} = object ## struct in_addr + s_addr*: int32 # IP address + + Tsockaddr_in* {.pure, final.} = object + sin_family*: int16 + sin_port*: int16 # unsigned + sin_addr*: TInAddr + sin_zero*: array[0..7, char] + + Tin6_addr* {.pure, final.} = object + bytes*: array[0..15, char] + + Tsockaddr_in6* {.pure, final.} = object + sin6_family*: int16 + sin6_port*: int16 # unsigned + sin6_flowinfo*: int32 # unsigned + sin6_addr*: Tin6_addr + sin6_scope_id*: int32 # unsigned + + Tsockaddr_in6_old* {.pure, final.} = object + sin6_family*: int16 + sin6_port*: int16 # unsigned + sin6_flowinfo*: int32 # unsigned + sin6_addr*: Tin6_addr + + TServent* {.pure, final.} = object + s_name*: cstring + s_aliases*: cstringArray + when defined(cpu64): + s_proto*: cstring + s_port*: int16 + else: + s_port*: int16 + s_proto*: cstring + + Thostent* {.pure, final.} = object + h_name*: cstring + h_aliases*: cstringArray + h_addrtype*: int16 + h_length*: int16 + h_addr_list*: cstringArray + + TWinSocket* = cint + + TFdSet* {.pure, final.} = object + fd_count*: cint # unsigned + fd_array*: array[0..FD_SETSIZE-1, TWinSocket] + + TTimeval* {.pure, final.} = object + tv_sec*, tv_usec*: int32 + +proc getservbyname*(name, proto: cstring): ptr TServent {. + stdcall, importc: "getservbyname", dynlib: "Ws2_32.dll".} + +proc getservbyport*(port: cint, proto: cstring): ptr TServent {. + stdcall, importc: "getservbyport", dynlib: "Ws2_32.dll".} + +proc gethostbyname*(name: cstring): ptr THostEnt {. + stdcall, importc: "gethostbyname", dynlib: "Ws2_32.dll".} + +proc socket*(af, typ, protocol: cint): TWinSocket {. + stdcall, importc: "socket", dynlib: "Ws2_32.dll".} + +proc closesocket*(s: TWinSocket): cint {. + stdcall, importc: "closesocket", dynlib: "Ws2_32.dll".} + +proc accept*(s: TWinSocket, a: ptr TSockAddr, addrlen: ptr cint): TWinSocket {. + stdcall, importc: "accept", dynlib: "Ws2_32.dll".} +proc bindSocket*(s: TWinSocket, name: ptr TSockAddr, namelen: cint): cint {. + stdcall, importc: "bind", dynlib: "Ws2_32.dll".} +proc connect*(s: TWinSocket, name: ptr TSockAddr, namelen: cint): cint {. + stdcall, importc: "connect", dynlib: "Ws2_32.dll".} +proc getsockname*(s: TWinSocket, name: ptr TSockAddr, + namelen: ptr cint): cint {. + stdcall, importc: "getsockname", dynlib: "Ws2_32.dll".} +proc getsockopt*(s: TWinSocket, level, optname: cint, optval: pointer, + optlen: ptr cint): cint {. + stdcall, importc: "getsockopt", dynlib: "Ws2_32.dll".} +proc setsockopt*(s: TWinSocket, level, optname: cint, optval: pointer, + optlen: cint): cint {. + stdcall, importc: "setsockopt", dynlib: "Ws2_32.dll".} + +proc listen*(s: TWinSocket, backlog: cint): cint {. + stdcall, importc: "listen", dynlib: "Ws2_32.dll".} +proc recv*(s: TWinSocket, buf: pointer, len, flags: cint): cint {. + stdcall, importc: "recv", dynlib: "Ws2_32.dll".} +proc recvfrom*(s: TWinSocket, buf: cstring, len, flags: cint, + fromm: ptr TSockAddr, fromlen: ptr cint): cint {. + stdcall, importc: "recvfrom", dynlib: "Ws2_32.dll".} +proc select*(nfds: cint, readfds, writefds, exceptfds: ptr TFdSet, + timeout: ptr TTimeval): cint {. + stdcall, importc: "select", dynlib: "Ws2_32.dll".} +proc send*(s: TWinSocket, buf: pointer, len, flags: cint): cint {. + stdcall, importc: "send", dynlib: "Ws2_32.dll".} +proc sendto*(s: TWinSocket, buf: cstring, len, flags: cint, + to: ptr TSockAddr, tolen: cint): cint {. + stdcall, importc: "sendto", dynlib: "Ws2_32.dll".} + +proc shutdown*(s: TWinSocket, how: cint): cint {. + stdcall, importc: "shutdown", dynlib: "Ws2_32.dll".} + +proc inet_addr*(cp: cstring): int32 {. + stdcall, importc: "inet_addr", dynlib: "Ws2_32.dll".} + +proc WSAFDIsSet(s: TWinSocket, FDSet: var TFDSet): bool {. + stdcall, importc: "__WSAFDIsSet", dynlib: "Ws2_32.dll".} + +proc FD_ISSET*(Socket: TWinSocket, FDSet: var TFDSet): cint = + result = if WSAFDIsSet(Socket, FDSet): 1'i32 else: 0'i32 + +proc FD_SET*(Socket: TWinSocket, FDSet: var TFDSet) = + if FDSet.fd_count < FD_SETSIZE: + FDSet.fd_array[int(FDSet.fd_count)] = Socket + inc(FDSet.fd_count) + +proc FD_ZERO*(FDSet: var TFDSet) = + FDSet.fd_count = 0 + +proc WSAStartup*(wVersionRequired: int16, WSData: var TWSAData): cint {. + stdcall, importc: "WSAStartup", dynlib: "Ws2_32.dll".} + |