mirror of
https://github.com/rwinkhart/sys.git
synced 2026-09-04 08:07:19 -04:00
windows: Add WSALookupService syscall wrappers
Create WSAQUERYSET struct, add LUP_XX constants, implement wrappers around WSALookupService functions. Fixes golang/go#54232 Change-Id: I26624df1b2b44cd8750350fe4526b806513913fe Reviewed-on: https://go-review.googlesource.com/c/sys/+/461296 Reviewed-by: Alex Brainman <alex.brainman@gmail.com> Auto-Submit: Bryan Mills <bcmills@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Reviewed-by: Bryan Mills <bcmills@google.com> Run-TryBot: Alex Brainman <alex.brainman@gmail.com> Reviewed-by: Than McIntosh <thanm@google.com>
This commit is contained in:
committed by
Gopher Robot
parent
c79a742fd1
commit
4fee21c923
@@ -1078,3 +1078,52 @@ func TestProcThreadAttributeHandleList(t *testing.T) {
|
||||
t.Fatalf("got %q; want %q", out, sentinel)
|
||||
}
|
||||
}
|
||||
|
||||
func TestWSALookupService(t *testing.T) {
|
||||
var flags uint32 = windows.LUP_CONTAINERS
|
||||
flags |= windows.LUP_RETURN_NAME
|
||||
flags |= windows.LUP_RETURN_ADDR
|
||||
|
||||
var querySet windows.WSAQUERYSET
|
||||
querySet.NameSpace = windows.NS_BTH
|
||||
querySet.Size = uint32(unsafe.Sizeof(windows.WSAQUERYSET{}))
|
||||
|
||||
var handle windows.Handle
|
||||
err := windows.WSALookupServiceBegin(&querySet, flags, &handle)
|
||||
if err != nil {
|
||||
if errors.Is(err, windows.WSASERVICE_NOT_FOUND) {
|
||||
t.Skip("WSA Service not found, so skip this test")
|
||||
}
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
defer windows.WSALookupServiceEnd(handle)
|
||||
|
||||
n := int32(unsafe.Sizeof(windows.WSAQUERYSET{}))
|
||||
buf := make([]byte, n)
|
||||
items_loop:
|
||||
for {
|
||||
q := (*windows.WSAQUERYSET)(unsafe.Pointer(&buf[0]))
|
||||
err := windows.WSALookupServiceNext(handle, flags, &n, q)
|
||||
switch err {
|
||||
case windows.WSA_E_NO_MORE, windows.WSAENOMORE:
|
||||
// no more data available - break the loop
|
||||
break items_loop
|
||||
case windows.WSAEFAULT:
|
||||
// buffer is too small - reallocate and try again
|
||||
buf = make([]byte, n)
|
||||
case nil:
|
||||
// found a record - display the item and fetch next item
|
||||
var addr string
|
||||
for _, e := range q.SaBuffer.RemoteAddr.Sockaddr.Addr.Data {
|
||||
if e != 0 {
|
||||
addr += fmt.Sprintf("%x", e)
|
||||
}
|
||||
}
|
||||
t.Logf("%s -> %s\n", windows.UTF16PtrToString(q.ServiceInstanceName), addr)
|
||||
|
||||
default:
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user