From dd4d47c671827148bdaf478c7a37460931cd242c Mon Sep 17 00:00:00 2001 From: Federico Ceratto Date: Wed, 1 Mar 2017 08:44:24 +0000 Subject: [PATCH] Add gethostname to nativesockets (#5443) --- lib/pure/nativesockets.nim | 16 ++++++++++++++++ lib/windows/winlean.nim | 3 +++ tests/stdlib/tnativesockets.nim | 8 ++++++++ 3 files changed, 27 insertions(+) create mode 100644 tests/stdlib/tnativesockets.nim diff --git a/lib/pure/nativesockets.nim b/lib/pure/nativesockets.nim index d51dbd4750..0a7ffb3b36 100644 --- a/lib/pure/nativesockets.nim +++ b/lib/pure/nativesockets.nim @@ -374,6 +374,22 @@ proc getHostByName*(name: string): Hostent {.tags: [ReadIOEffect].} = result.addrList = cstringArrayToSeq(s.h_addr_list) result.length = int(s.h_length) +proc getHostname*(): string {.tags: [ReadIOEffect].} = + ## Returns the local hostname (not the FQDN) + # https://tools.ietf.org/html/rfc1035#section-2.3.1 + # https://tools.ietf.org/html/rfc2181#section-11 + const size = 64 + result = newString(size) + when useWinVersion: + let success = winlean.getHostname(result, size) + else: + # Posix + let success = posix.getHostname(result, size) + if success != 0.cint: + raiseOSError(osLastError()) + let x = len(cstring(result)) + result.setLen(x) + proc getSockDomain*(socket: SocketHandle): Domain = ## returns the socket's domain (AF_INET or AF_INET6). var name: SockAddr diff --git a/lib/windows/winlean.nim b/lib/windows/winlean.nim index fa9ce9eed6..1a251d0cc3 100644 --- a/lib/windows/winlean.nim +++ b/lib/windows/winlean.nim @@ -542,6 +542,9 @@ proc gethostbyaddr*(ip: ptr InAddr, len: cuint, theType: cint): ptr Hostent {. proc gethostbyname*(name: cstring): ptr Hostent {. stdcall, importc: "gethostbyname", dynlib: ws2dll.} +proc gethostname*(hostname: cstring, len: cint): cint {. + stdcall, importc: "gethostname", dynlib: ws2dll.} + proc socket*(af, typ, protocol: cint): SocketHandle {. stdcall, importc: "socket", dynlib: ws2dll.} diff --git a/tests/stdlib/tnativesockets.nim b/tests/stdlib/tnativesockets.nim new file mode 100644 index 0000000000..c683647bc0 --- /dev/null +++ b/tests/stdlib/tnativesockets.nim @@ -0,0 +1,8 @@ +import nativesockets, unittest + +suite "nativesockets": + test "getHostname": + let hostname = getHostname() + check hostname.len > 0 + check hostname.len < 64 +