feature. See also
. The project being documented here (as the example) is the Zig library itself.
Threaded.netInterfaceName
fn netInterfaceName(userdata: ?*anyopaque, interface: net.Interface) net.Interface.NameError!net.Interface.Name
File
Code
fn netInterfaceName(userdata: ?*anyopaque, interface: net.Interface) net.Interface.NameError!net.Interface.Name {
const t: *Threaded = @ptrCast(@alignCast(userdata));
if (native_os == .linux) {
try Thread.checkCancel();
@panic("TODO implement netInterfaceName for linux");
}
if (is_windows) {
var ConvertInterfaceIndexToLuid = t.dl.ConvertInterfaceIndexToLuid.load(.acquire);
var ConvertInterfaceLuidToNameW = t.dl.ConvertInterfaceLuidToNameW.load(.acquire);
if (ConvertInterfaceIndexToLuid == null or ConvertInterfaceLuidToNameW == null) {
const iphlpapi_dll = t.dl.iphlpapi_dll.load(.acquire) orelse iphlpapi_dll: {
try Thread.checkCancel();
var iphlpapi_dll: *anyopaque = undefined;
switch (windows.ntdll.LdrLoadDll(null, null, &.init(
&.{ 'I', 'P', 'H', 'L', 'P', 'A', 'P', 'I', '.', 'D', 'L', 'L' },
), &iphlpapi_dll)) {
.SUCCESS => {},
.DLL_NOT_FOUND => return error.Unexpected,
else => |status| return windows.unexpectedStatus(status),
}
const handle = t.dl.iphlpapi_dll.cmpxchgStrong(null, iphlpapi_dll, .release, .monotonic) orelse
break :iphlpapi_dll iphlpapi_dll;
switch (windows.ntdll.LdrUnloadDll(iphlpapi_dll)) {
.SUCCESS => break :iphlpapi_dll handle.?,
else => |status| return windows.unexpectedStatus(status),
}
};
switch (windows.ntdll.LdrGetProcedureAddress(iphlpapi_dll, &.init(
&.{
'C', 'o', 'n', 'v', 'e', 'r', 't', 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e',
'I', 'n', 'd', 'e', 'x', 'T', 'o', 'L', 'u', 'i', 'd',
},
), 0, @ptrCast(&ConvertInterfaceIndexToLuid))) {
.SUCCESS => t.dl.ConvertInterfaceIndexToLuid.store(ConvertInterfaceIndexToLuid, .release),
else => |status| return windows.unexpectedStatus(status),
}
switch (windows.ntdll.LdrGetProcedureAddress(iphlpapi_dll, &.init(
&.{
'C', 'o', 'n', 'v', 'e', 'r', 't', 'I', 'n', 't', 'e', 'r', 'f', 'a', 'c', 'e',
'L', 'u', 'i', 'd', 'T', 'o', 'N', 'a', 'm', 'e', 'W',
},
), 0, @ptrCast(&ConvertInterfaceLuidToNameW))) {
.SUCCESS => t.dl.ConvertInterfaceLuidToNameW.store(ConvertInterfaceLuidToNameW, .release),
else => |status| return windows.unexpectedStatus(status),
}
}
try Thread.checkCancel();
var luid: windows.NET.LUID = undefined;
switch (ConvertInterfaceIndexToLuid.?(@fromBackingInt(@intCast(interface.index)), &luid)) {
.SUCCESS => {},
.FILE_NOT_FOUND => return error.InterfaceNotFound,
.INVALID_PARAMETER => unreachable,
else => |err| return windows.unexpectedError(err),
}
var name_w: [net.Interface.Name.max_len:0]windows.WCHAR = undefined;
switch (ConvertInterfaceLuidToNameW.?(&luid, &name_w, name_w.len)) {
.SUCCESS => {},
.INVALID_PARAMETER => unreachable,
.NOT_ENOUGH_MEMORY => return error.NameTooLong,
else => |err| return windows.unexpectedError(err),
}
var name: [3 * net.Interface.Name.max_len]u8 = undefined;
return .fromSlice(name[0..std.unicode.wtf16LeToWtf8(&name, std.mem.sliceTo(&name_w, 0))]);
}
if (builtin.link_libc) {
try Thread.checkCancel();
@panic("TODO implement netInterfaceName for libc");
}
@panic("unimplemented");
}