diff --git a/lib/std/os/linux.zig b/lib/std/os/linux.zig index 1e94d02138..7a802e8065 100644 --- a/lib/std/os/linux.zig +++ b/lib/std/os/linux.zig @@ -3476,6 +3476,7 @@ pub const STDIN_FILENO = 0; pub const STDOUT_FILENO = 1; pub const STDERR_FILENO = 2; +/// Deprecated alias to At pub const AT = At; /// matches AT_* and AT_STATX_* pub const At = packed struct(u32) { @@ -3516,6 +3517,44 @@ pub const At = packed struct(u32) { /// Do whatever stat() does /// This is the default and is very much filesystem-specific pub const statx_sync_as_stat: At = .{}; + + // DEPRECATED ALIASES + // + // + /// Special value used to indicate openat should use the current working directory + pub const FDCWD = fdcwd; + + /// Do not follow symbolic links + pub const SYMLINK_NOFOLLOW: u32 = @bitCast(At{ .symlink_nofollow = true }); + + /// Remove directory instead of unlinking file + pub const REMOVEDIR: u32 = @bitCast(At{ .removedir_or_handle_fid = .{ .removedir = true } }); + + pub const HANDLE_FID = At{ .removedir_or_handle_fid = .{ .handle_fid = true } }; + + /// Follow symbolic links. + pub const SYMLINK_FOLLOW: u32 = @bitCast(At{ .symlink_follow = true }); + + /// Suppress terminal automount traversal + pub const NO_AUTOMOUNT: u32 = @bitCast(At{ .no_automount = true }); + + /// Allow empty relative pathname + pub const EMPTY_PATH: u32 = @bitCast(At{ .empty_path = true }); + + /// Type of synchronisation required from statx() + pub const STATX_SYNC_TYPE: u32 = @bitCast(statx_sync_type); + + /// - Do whatever stat() does + pub const STATX_SYNC_AS_STAT: u32 = @bitCast(statx_sync_as_stat); + + /// - Force the attributes to be sync'd with the server + pub const STATX_FORCE_SYNC: u32 = @bitCast(At{ .statx_force_sync = true }); + + /// - Don't sync attributes with the server + pub const STATX_DONT_SYNC: u32 = @bitCast(At{ .statx_dont_sync = true }); + + /// Apply to the entire subtree + pub const RECURSIVE: u32 = @bitCast(At{ .recursive = true }); }; pub const FALLOC = struct { @@ -3673,6 +3712,14 @@ pub const W = packed struct(u32) { nowait: bool = false, _unused_1: u7 = 0, + // Deprecated aliases + pub const NOHANG: u32 = @bitCast(W{ .nohang = true }); + pub const UNTRACED: u32 = @bitCast(W{ .untraced_or_stopped = .{ .untraced = true } }); + pub const STOPPED: u32 = @bitCast(W{ .untraced_or_stopped = .{ .stopped = true } }); + pub const EXITED: u32 = @bitCast(W{ .exited = true }); + pub const CONTINUED: u32 = @bitCast(W{ .continued = true }); + pub const NOWAIT: u32 = @bitCast(W{ .nowait = true }); + pub fn EXITSTATUS(s: W) u8 { return @intCast((@as(u32, @bitCast(s)) & 0xff00) >> 8); } @@ -3893,6 +3940,7 @@ pub const SEEK = struct { pub const END = 2; }; +/// Deprecated alias to Shut pub const SHUT = Shut; /// enum sock_shutdown_cmd - Shutdown types /// matches SHUT_* in kenel @@ -3905,16 +3953,22 @@ pub const Shut = enum(u32) { rdwr = 2, _, + + // deprecated constants of the fields + pub const RD: u32 = @intFromEnum(Shut.rd); + pub const WR: u32 = @intFromEnum(Shut.wd); + pub const RDWR: u32 = @intFromEnum(Shut.rdwr); }; pub const SOCK = Sock; /// SOCK_* Socket type and flags pub const Sock = packed struct(u32) { - type: Type, + type: Type = .default, flags: Flags = .{}, /// matches sock_type in kernel pub const Type = enum(u7) { + default = 0, stream = if (is_mips) 2 else 1, dgram = if (is_mips) 1 else 2, raw = 3, @@ -3946,6 +4000,17 @@ pub const Sock = packed struct(u32) { cloexec: bool = false, _2: u12 = 0, }; + + // Deprecated aliases for SOCK + pub const STREAM: u32 = @intFromEnum(Type.stream); + pub const DGRAM: u32 = @intFromEnum(Type.dgram); + pub const RAW: u32 = @intFromEnum(Type.raw); + pub const RDM: u32 = @intFromEnum(Type.rdm); + pub const SEQPACKET: u32 = @intFromEnum(Type.seqpacket); + pub const DCCP: u32 = @intFromEnum(Type.dccp); + pub const PACKET: u32 = @intFromEnum(Type.packet); + pub const CLOEXEC: u32 = (@as(u25, @bitCast(Flags{ .cloexec = true })) << 7); + pub const NONBLOCK: u32 = (@as(u25, @bitCast(Flags{ .nonblock = true })) << 7); }; pub const TCP = struct { @@ -4048,8 +4113,13 @@ pub const UDP_ENCAP = struct { pub const RXRPC = 6; }; +// Deprecated Alias +pub const AF = Af; +pub const PF = Af; +/// Protocol Family (same values as Protocol Family) +pub const Pf = Af; /// Address Family -pub const AF = enum(u16) { +pub const Af = enum(u16) { unspec = 0, unix = 1, inet = 2, @@ -4099,13 +4169,61 @@ pub const AF = enum(u16) { _, // Aliases - pub const local = AF.unix; - pub const file = AF.unix; - pub const netlink = AF.route; -}; + pub const local = Af.unix; + pub const file = Af.unix; + pub const netlink = Af.route; -/// Protocol Family (same values as Protocol Family) -pub const PF = AF; + // Deprecated constants for backward compatibility + pub const UNSPEC: u16 = @intFromEnum(Af.unspec); + pub const UNIX: u16 = @intFromEnum(Af.unix); + pub const LOCAL: u16 = @intFromEnum(local); + pub const FILE: u16 = @intFromEnum(file); + pub const INET: u16 = @intFromEnum(Af.inet); + pub const AX25: u16 = @intFromEnum(Af.ax25); + pub const IPX: u16 = @intFromEnum(Af.ipx); + pub const APPLETALK: u16 = @intFromEnum(Af.appletalk); + pub const NETROM: u16 = @intFromEnum(Af.netrom); + pub const BRIDGE: u16 = @intFromEnum(Af.bridge); + pub const ATMPVC: u16 = @intFromEnum(Af.atmpvc); + pub const X25: u16 = @intFromEnum(Af.x25); + pub const INET6: u16 = @intFromEnum(Af.inet6); + pub const ROSE: u16 = @intFromEnum(Af.rose); + pub const DECnet: u16 = @intFromEnum(Af.decnet); + pub const NETBEUI: u16 = @intFromEnum(Af.netbeui); + pub const SECURITY: u16 = @intFromEnum(Af.security); + pub const KEY: u16 = @intFromEnum(Af.key); + pub const ROUTE: u16 = @intFromEnum(Af.route); + pub const NETLINK: u16 = @intFromEnum(netlink); + pub const PACKET: u16 = @intFromEnum(Af.packet); + pub const ASH: u16 = @intFromEnum(Af.ash); + pub const ECONET: u16 = @intFromEnum(Af.econet); + pub const ATMSVC: u16 = @intFromEnum(Af.atmsvc); + pub const RDS: u16 = @intFromEnum(Af.rds); + pub const SNA: u16 = @intFromEnum(Af.sna); + pub const IRDA: u16 = @intFromEnum(Af.irda); + pub const PPPOX: u16 = @intFromEnum(Af.pppox); + pub const WANPIPE: u16 = @intFromEnum(Af.wanpipe); + pub const LLC: u16 = @intFromEnum(Af.llc); + pub const IB: u16 = @intFromEnum(Af.ib); + pub const MPLS: u16 = @intFromEnum(Af.mpls); + pub const CAN: u16 = @intFromEnum(Af.can); + pub const TIPC: u16 = @intFromEnum(Af.tipc); + pub const BLUETOOTH: u16 = @intFromEnum(Af.bluetooth); + pub const IUCV: u16 = @intFromEnum(Af.iucv); + pub const RXRPC: u16 = @intFromEnum(Af.rxrpc); + pub const ISDN: u16 = @intFromEnum(Af.isdn); + pub const PHONET: u16 = @intFromEnum(Af.phonet); + pub const IEEE802154: u16 = @intFromEnum(Af.ieee802154); + pub const CAIF: u16 = @intFromEnum(Af.caif); + pub const ALG: u16 = @intFromEnum(Af.alg); + pub const NFC: u16 = @intFromEnum(Af.nfc); + pub const VSOCK: u16 = @intFromEnum(Af.vsock); + pub const KCM: u16 = @intFromEnum(Af.kcm); + pub const QIPCRTR: u16 = @intFromEnum(Af.qipcrtr); + pub const SMC: u16 = @intFromEnum(Af.smc); + pub const XDP: u16 = @intFromEnum(Af.xdp); + pub const MAX: u16 = @intFromEnum(Af.max); +}; pub const SO = if (is_mips) struct { pub const DEBUG = 1; @@ -5863,7 +5981,8 @@ pub const signalfd_siginfo = extern struct { }; pub const in_port_t = u16; -pub const sa_family_t = AF; +// TODO: change to AF type +pub const sa_family_t = u16; pub const socklen_t = u32; pub const sockaddr = extern struct { @@ -5883,7 +6002,7 @@ pub const sockaddr = extern struct { /// IPv4 socket address pub const in = extern struct { - family: sa_family_t = AF.INET, + family: sa_family_t = Af.INET, port: in_port_t, addr: u32, zero: [8]u8 = [8]u8{ 0, 0, 0, 0, 0, 0, 0, 0 }, @@ -5891,7 +6010,7 @@ pub const sockaddr = extern struct { /// IPv6 socket address pub const in6 = extern struct { - family: sa_family_t = AF.INET6, + family: sa_family_t = Af.INET6, port: in_port_t, flowinfo: u32, addr: [16]u8, @@ -5900,13 +6019,13 @@ pub const sockaddr = extern struct { /// UNIX domain socket address pub const un = extern struct { - family: sa_family_t = AF.UNIX, + family: sa_family_t = Af.UNIX, path: [108]u8, }; /// Packet socket address pub const ll = extern struct { - family: sa_family_t = AF.PACKET, + family: sa_family_t = Af.PACKET, protocol: u16, ifindex: i32, hatype: u16, @@ -5917,7 +6036,7 @@ pub const sockaddr = extern struct { /// Netlink socket address pub const nl = extern struct { - family: sa_family_t = AF.NETLINK, + family: sa_family_t = Af.NETLINK, __pad1: c_ushort = 0, /// port ID @@ -5928,7 +6047,7 @@ pub const sockaddr = extern struct { }; pub const xdp = extern struct { - family: u16 = AF.XDP, + family: u16 = Af.XDP, flags: u16, ifindex: u32, queue_id: u32, @@ -5937,7 +6056,7 @@ pub const sockaddr = extern struct { /// Address structure for vSockets pub const vm = extern struct { - family: sa_family_t = AF.VSOCK, + family: sa_family_t = Af.VSOCK, reserved1: u16 = 0, port: u32, cid: u32, @@ -7111,6 +7230,38 @@ pub const Statx = extern struct { }; }; +// DEPRECATED aliases to Statx.Mask and Statx.Attr +const STATX_TYPE: u32 = @bitCast(Statx.Mask{ .type = true }); +const STATX_MODE: u32 = @bitCast(Statx.Mask{ .mode = true }); +const STATX_NLINK: u32 = @bitCast(Statx.Mask{ .nlink = true }); +const STATX_UID: u32 = @bitCast(Statx.Mask{ .uid = true }); +const STATX_GID: u32 = @bitCast(Statx.Mask{ .gid = true }); +const STATX_ATIME: u32 = @bitCast(Statx.Mask{ .atime = true }); +const STATX_MTIME: u32 = @bitCast(Statx.Mask{ .mtime = true }); +const STATX_CTIME: u32 = @bitCast(Statx.Mask{ .ctime = true }); +const STATX_INO: u32 = @bitCast(Statx.Mask{ .ino = true }); +const STATX_SIZE: u32 = @bitCast(Statx.Mask{ .size = true }); +const STATX_BLOCKS: u32 = @bitCast(Statx.Mask{ .blocks = true }); +const STATX_BASIC_STATS: u32 = @bitCast(Statx.Mask.basic_stats); +const STATX_BTIME: u32 = @bitCast(Statx.Mask{ .btime = true }); +const STATX_MNT_ID: u32 = @bitCast(Statx.Mask{ .mnt_id = true }); +const STATX_DIOALIGN: u32 = @bitCast(Statx.Mask{ .dioalign = true }); +const STATX_MNT_ID_UNIQUE: u32 = @bitCast(Statx.Mask{ .mnt_id_unique = true }); +const STATX_SUBVOL: u32 = @bitCast(Statx.Mask{ .subvol = true }); +const STATX_WRITE_ATOMIC: u32 = @bitCast(Statx.Mask{ .write_atomic = true }); +const STATX_DIO_READ_ALIGN: u32 = @bitCast(Statx.Mask{ .dio_read_align = true }); + +const STATX_ATTR_COMPRESSED: u64 = @bitCast(Statx.Attr{ .compressed = true }); +const STATX_ATTR_IMMUTABLE: u64 = @bitCast(Statx.Attr{ .immutable = true }); +const STATX_ATTR_APPEND: u64 = @bitCast(Statx.Attr{ .append = true }); +const STATX_ATTR_NODUMP: u64 = @bitCast(Statx.Attr{ .nodump = true }); +const STATX_ATTR_ENCRYPTED: u64 = @bitCast(Statx.Attr{ .encrypted = true }); +const STATX_ATTR_AUTOMOUNT: u64 = @bitCast(Statx.Attr{ .automount = true }); +const STATX_ATTR_MOUNT_ROOT: u64 = @bitCast(Statx.Attr{ .mount_root = true }); +const STATX_ATTR_VERITY: u64 = @bitCast(Statx.Attr{ .verity = true }); +const STATX_ATTR_DAX: u64 = @bitCast(Statx.Attr{ .dax = true }); +const STATX_ATTR_WRITE_ATOMIC: u64 = @bitCast(Statx.Attr{ .write_atomic = true }); + pub const addrinfo = extern struct { flags: AI, family: i32, @@ -7136,6 +7287,8 @@ pub const AI = packed struct(u32) { pub const IPPORT_RESERVED = 1024; +/// Deprecated alias to IpProto +pub const IPPROTO = IpProto; /// IP Protocol numbers pub const IpProto = enum(u16) { ip = 0, @@ -7175,6 +7328,42 @@ pub const IpProto = enum(u16) { // Aliases pub const hopopts = IpProto.ip; pub const default = IpProto.ip; + + // Deprecated constants use enum instead + // Legacy constants for backward compatibility + pub const IP: u16 = @intFromEnum(IpProto.ip); + pub const HOPOPTS: u16 = @intFromEnum(hopopts); + pub const ICMP: u16 = @intFromEnum(IpProto.icmp); + pub const IGMP: u16 = @intFromEnum(IpProto.igmp); + pub const IPIP: u16 = @intFromEnum(IpProto.ipip); + pub const TCP: u16 = @intFromEnum(IpProto.tcp); + pub const EGP: u16 = @intFromEnum(IpProto.egp); + pub const PUP: u16 = @intFromEnum(IpProto.pup); + pub const UDP: u16 = @intFromEnum(IpProto.udp); + pub const IDP: u16 = @intFromEnum(IpProto.idp); + pub const TP: u16 = @intFromEnum(IpProto.tp); + pub const DCCP: u16 = @intFromEnum(IpProto.dccp); + pub const IPV6: u16 = @intFromEnum(IpProto.ipv6); + pub const ROUTING: u16 = @intFromEnum(IpProto.routing); + pub const FRAGMENT: u16 = @intFromEnum(IpProto.fragment); + pub const RSVP: u16 = @intFromEnum(IpProto.rsvp); + pub const GRE: u16 = @intFromEnum(IpProto.gre); + pub const ESP: u16 = @intFromEnum(IpProto.esp); + pub const AH: u16 = @intFromEnum(IpProto.ah); + pub const ICMPV6: u16 = @intFromEnum(IpProto.icmpv6); + pub const NONE: u16 = @intFromEnum(IpProto.none); + pub const DSTOPTS: u16 = @intFromEnum(IpProto.DSTOPTS); + pub const MTP: u16 = @intFromEnum(IpProto.mtp); + pub const BEETPH: u16 = @intFromEnum(IpProto.beetph); + pub const ENCAP: u16 = @intFromEnum(IpProto.encap); + pub const PIM: u16 = @intFromEnum(IpProto.pim); + pub const COMP: u16 = @intFromEnum(IpProto.comp); + pub const SCTP: u16 = @intFromEnum(IpProto.sctp); + pub const MH: u16 = @intFromEnum(IpProto.mh); + pub const UDPLITE: u16 = @intFromEnum(IpProto.udplite); + pub const MPLS: u16 = @intFromEnum(IpProto.mpls); + pub const RAW: u16 = @intFromEnum(IpProto.raw); + pub const MAX: u16 = @intFromEnum(IpProto.max); }; pub const tcp_repair_opt = extern struct { diff --git a/lib/std/os/linux/IoUring.zig b/lib/std/os/linux/IoUring.zig index 7ca59b1f33..a28df8c880 100644 --- a/lib/std/os/linux/IoUring.zig +++ b/lib/std/os/linux/IoUring.zig @@ -1328,7 +1328,7 @@ pub fn unregister_files(self: *IoUring) !void { pub fn socket( self: *IoUring, user_data: u64, - domain: linux.AF, + domain: linux.Af, socket_type: linux.Sock, protocol: linux.IpProto, /// flags is unused @@ -1345,7 +1345,7 @@ pub fn socket( pub fn socket_direct( self: *IoUring, user_data: u64, - domain: linux.AF, + domain: linux.Af, socket_type: linux.Sock, protocol: linux.IpProto, /// flags is unused @@ -2657,7 +2657,7 @@ test "shutdown" { const server = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0); defer posix.close(server); - const shutdown_sqe = ring.shutdown(0x445445445, server, linux.SHUT.RD) catch |err| switch (err) { + const shutdown_sqe = ring.shutdown(0x445445445, server, .rd) catch |err| switch (err) { else => |errno| std.debug.panic("unhandled errno: {}", .{errno}), }; try testing.expectEqual(Op.SHUTDOWN, shutdown_sqe.opcode); @@ -3339,7 +3339,7 @@ fn createSocketTestHarness(ring: *IoUring) !SocketTestHarness { // Submit 1 accept var accept_addr: posix.sockaddr = undefined; var accept_addr_len: posix.socklen_t = @sizeOf(@TypeOf(accept_addr)); - _ = try ring.accept(0xaaaaaaaa, listener_socket, &accept_addr, &accept_addr_len, 0); + _ = try ring.accept(0xaaaaaaaa, listener_socket, &accept_addr, &accept_addr_len, .{}); // Create a TCP client socket const client = try posix.socket(address.family, posix.SOCK.STREAM | posix.SOCK.CLOEXEC, 0); @@ -3417,7 +3417,7 @@ test "accept multishot" { var addr: posix.sockaddr = undefined; var addr_len: posix.socklen_t = @sizeOf(@TypeOf(addr)); const userdata: u64 = 0xaaaaaaaa; - _ = try ring.accept_multishot(userdata, listener_socket, &addr, &addr_len, 0); + _ = try ring.accept_multishot(userdata, listener_socket, &addr, &addr_len, .{}); try testing.expectEqual(@as(u32, 1), try ring.submit()); var nr: usize = 4; // number of clients to connect @@ -3525,7 +3525,7 @@ test "accept_direct" { const buffer_send: []const u8 = data[0 .. data.len - i]; // make it different at each loop // submit accept, will chose registered fd and return index in cqe - _ = try ring.accept_direct(accept_userdata, listener_socket, null, null, 0); + _ = try ring.accept_direct(accept_userdata, listener_socket, null, null, .{}); try testing.expectEqual(@as(u32, 1), try ring.submit()); // connect @@ -3608,7 +3608,7 @@ test "accept_multishot_direct" { for (0..2) |_| { // submit multishot accept // Will chose registered fd and return index of the selected registered file in cqe. - _ = try ring.accept_multishot_direct(accept_userdata, listener_socket, null, null, 0); + _ = try ring.accept_multishot_direct(accept_userdata, listener_socket, null, null, .{}); try testing.expectEqual(@as(u32, 1), try ring.submit()); for (registered_fds) |_| { @@ -3654,7 +3654,7 @@ test "socket" { defer ring.deinit(); // prepare, submit socket operation - _ = try ring.socket(0, linux.AF.INET, .{ .type = .stream }, 0, 0); + _ = try ring.socket(0, .{ .inet = true }, .{ .type = .stream }, 0, 0); try testing.expectEqual(@as(u32, 1), try ring.submit()); // test completion @@ -3687,7 +3687,7 @@ test "socket_direct/socket_direct_alloc/close_direct" { try testing.expect(cqe_socket.res == 0); // create socket in registered file descriptor at index 1 (last param) - _ = try ring.socket_direct(0, linux.AF.INET, posix.SOCK.STREAM, 0, 0, 1); + _ = try ring.socket_direct(0, linux.Af.INET, posix.SOCK.STREAM, 0, 0, 1); try testing.expectEqual(@as(u32, 1), try ring.submit()); cqe_socket = try ring.copy_cqe(); try testing.expectEqual(posix.E.SUCCESS, cqe_socket.err()); @@ -3695,7 +3695,7 @@ test "socket_direct/socket_direct_alloc/close_direct" { // create socket in kernel chosen file descriptor index (_alloc version) // completion res has index from registered files - _ = try ring.socket_direct_alloc(0, linux.AF.INET, posix.SOCK.STREAM, 0, 0); + _ = try ring.socket_direct_alloc(0, linux.Af.INET, posix.SOCK.STREAM, 0, 0); try testing.expectEqual(@as(u32, 1), try ring.submit()); cqe_socket = try ring.copy_cqe(); try testing.expectEqual(posix.E.SUCCESS, cqe_socket.err()); @@ -5114,21 +5114,21 @@ pub const Sqe = extern struct { pub fn prep_socket( sqe: *Sqe, - domain: linux.AF, - socket_type: linux.SOCK, - protocol: u32, // Enumerate https://github.com/kraj/musl/blob/kraj/master/src/network/proto.c#L7 + domain: linux.Af, + socket_type: linux.Sock, + protocol: linux.IpProto, // Enumerate https://github.com/kraj/musl/blob/kraj/master/src/network/proto.c#L7 /// flags is unused flags: u32, ) void { - sqe.prep_rw(.SOCKET, @intCast(domain), 0, protocol, socket_type); + sqe.prep_rw(.SOCKET, @intCast(domain), 0, @intFromEnum(protocol), @intCast(@as(u32, @bitCast(socket_type)))); sqe.rw_flags = flags; } pub fn prep_socket_direct( sqe: *Sqe, - domain: linux.AF, + domain: linux.Af, socket_type: linux.Sock, - protocol: u32, // Enumerate https://github.com/kraj/musl/blob/kraj/master/src/network/proto.c#L7 + protocol: linux.IpProto, // Enumerate https://github.com/kraj/musl/blob/kraj/master/src/network/proto.c#L7 /// flags is unused flags: u32, file_index: u32, @@ -5139,7 +5139,7 @@ pub const Sqe = extern struct { pub fn prep_socket_direct_alloc( sqe: *Sqe, - domain: linux.AF, + domain: linux.Af, socket_type: linux.SOCK, protocol: u32, // Enumerate https://github.com/kraj/musl/blob/kraj/master/src/network/proto.c#L7 flags: u32, // flags is unused