1// Copyright 2009 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package os
6
7import (
8	"internal/syscall/windows"
9	"syscall"
10)
11
12func hostname() (name string, err error) {
13	// Use PhysicalDnsHostname to uniquely identify host in a cluster
14	const format = windows.ComputerNamePhysicalDnsHostname
15
16	n := uint32(64)
17	for {
18		b := make([]uint16, n)
19		err := windows.GetComputerNameEx(format, &b[0], &n)
20		if err == nil {
21			return syscall.UTF16ToString(b[:n]), nil
22		}
23		if err != syscall.ERROR_MORE_DATA {
24			return "", NewSyscallError("ComputerNameEx", err)
25		}
26
27		// If we received an ERROR_MORE_DATA, but n doesn't get larger,
28		// something has gone wrong and we may be in an infinite loop
29		if n <= uint32(len(b)) {
30			return "", NewSyscallError("ComputerNameEx", err)
31		}
32	}
33}
34