authorgravatar for kenta@lithdew.netlithdew <kenta@lithdew.net> 2021-04-30 21:59:02+09:00
committergravatar for kenta@lithdew.netlithdew <kenta@lithdew.net> 2021-05-03 14:49:10+09:00
log8ef9d98e6dd24bf9c3def1e938e3eab66b39667c
tree5e5934b5b530a535ec6158f4e27d50c25bd36067
parent76304a36afb6d2cc77902a0e60906382b53d7baa

x/os: fix compile errors on mac and linux

Use i32 instead of isize for os.timeval's for socket read/write timeouts. Add a comptime check to resolveScopeID to see if `IFNAMESIZE` is available on the host. If it is not available, return an error indicating that resolving the scope ID of a IPv6 address is not yet supported on the host platform.

2 files changed, 15 insertions(+), 12 deletions(-)

lib/std/x/os/Socket.zig+4-4
......@@ -273,8 +273,8 @@ pub fn setReadBufferSize(self: Socket, size: u32) !void {
273273/// to the socket will thereafter return `error.WouldBlock` should the timeout be exceeded.
274274pub fn setWriteTimeout(self: Socket, milliseconds: usize) !void {
275275 const timeout = os.timeval{
276 .tv_sec = @intCast(isize, milliseconds / time.ms_per_s),
277 .tv_usec = @intCast(isize, (milliseconds % time.ms_per_s) * time.us_per_ms),
276 .tv_sec = @intCast(i32, milliseconds / time.ms_per_s),
277 .tv_usec = @intCast(i32, (milliseconds % time.ms_per_s) * time.us_per_ms),
278278 };
279279
280280 return os.setsockopt(self.fd, os.SOL_SOCKET, os.SO_SNDTIMEO, mem.asBytes(&timeout));
......@@ -286,8 +286,8 @@ pub fn setWriteTimeout(self: Socket, milliseconds: usize) !void {
286286/// exceeded.
287287pub fn setReadTimeout(self: Socket, milliseconds: usize) !void {
288288 const timeout = os.timeval{
289 .tv_sec = @intCast(isize, milliseconds / time.ms_per_s),
290 .tv_usec = @intCast(isize, (milliseconds % time.ms_per_s) * time.us_per_ms),
289 .tv_sec = @intCast(i32, milliseconds / time.ms_per_s),
290 .tv_usec = @intCast(i32, (milliseconds % time.ms_per_s) * time.us_per_ms),
291291 };
292292
293293 return os.setsockopt(self.fd, os.SOL_SOCKET, os.SO_RCVTIMEO, mem.asBytes(&timeout));
lib/std/x/os/net.zig+11-8
......@@ -17,18 +17,21 @@ const testing = std.testing;
1717/// an error if either resolution fails, or if the interface name is
1818/// too long.
1919pub fn resolveScopeID(name: []const u8) !u32 {
20 if (name.len >= os.IFNAMESIZE - 1) return error.NameTooLong;
20 if (comptime @hasDecl(os, "IFNAMESIZE")) {
21 if (name.len >= os.IFNAMESIZE - 1) return error.NameTooLong;
2122
22 const fd = try os.socket(os.AF_UNIX, os.SOCK_DGRAM, 0);
23 defer os.closeSocket(fd);
23 const fd = try os.socket(os.AF_UNIX, os.SOCK_DGRAM, 0);
24 defer os.closeSocket(fd);
2425
25 var f: os.ifreq = undefined;
26 mem.copy(u8, &f.ifrn.name, name);
27 f.ifrn.name[name.len] = 0;
26 var f: os.ifreq = undefined;
27 mem.copy(u8, &f.ifrn.name, name);
28 f.ifrn.name[name.len] = 0;
2829
29 try os.ioctl_SIOCGIFINDEX(fd, &f);
30 try os.ioctl_SIOCGIFINDEX(fd, &f);
3031
31 return @bitCast(u32, f.ifru.ivalue);
32 return @bitCast(u32, f.ifru.ivalue);
33 }
34 return error.Unsupported;
3235}
3336
3437/// An IPv4 address comprised of 4 bytes.