mirror of
https://codeberg.org/ziglang/zig.git
synced 2025-12-06 05:44:20 +00:00
Replace AT,W,SHUT,SOCK with a packed struct Flag type
Use the new Flag types in IoUring fix some test Signed-off-by: Bernard Assan <mega.alpha100@gmail.com>
This commit is contained in:
parent
86ed53e28f
commit
af2397777a
2 changed files with 121 additions and 87 deletions
|
|
@ -3476,41 +3476,41 @@ pub const STDIN_FILENO = 0;
|
|||
pub const STDOUT_FILENO = 1;
|
||||
pub const STDERR_FILENO = 2;
|
||||
|
||||
pub const AT = struct {
|
||||
/// Special value used to indicate openat should use the current working directory
|
||||
pub const FDCWD = -100;
|
||||
|
||||
/// matches AT_* and AT_STATX_*
|
||||
pub const At = packed struct(u32) {
|
||||
_reserved: u8 = 0,
|
||||
/// Do not follow symbolic links
|
||||
pub const SYMLINK_NOFOLLOW = 0x100;
|
||||
|
||||
symlink_nofollow: bool = false,
|
||||
/// Remove directory instead of unlinking file
|
||||
pub const REMOVEDIR = 0x200;
|
||||
|
||||
/// Or
|
||||
/// File handle is needed to compare object identity and may not be usable
|
||||
/// with open_by_handle_at(2)
|
||||
removedir_or_handle_fid: bool = false,
|
||||
/// Follow symbolic links.
|
||||
pub const SYMLINK_FOLLOW = 0x400;
|
||||
|
||||
symlink_follow: bool = false,
|
||||
/// Suppress terminal automount traversal
|
||||
pub const NO_AUTOMOUNT = 0x800;
|
||||
|
||||
no_automount: bool = false,
|
||||
/// Allow empty relative pathname
|
||||
pub const EMPTY_PATH = 0x1000;
|
||||
|
||||
/// Type of synchronisation required from statx()
|
||||
pub const STATX_SYNC_TYPE = 0x6000;
|
||||
|
||||
/// - Do whatever stat() does
|
||||
pub const STATX_SYNC_AS_STAT = 0x0000;
|
||||
|
||||
/// - Force the attributes to be sync'd with the server
|
||||
pub const STATX_FORCE_SYNC = 0x2000;
|
||||
|
||||
/// - Don't sync attributes with the server
|
||||
pub const STATX_DONT_SYNC = 0x4000;
|
||||
|
||||
empty_path: bool = false,
|
||||
/// Force the attributes to be sync'd with the server
|
||||
statx_force_sync: bool = false,
|
||||
/// Don't sync attributes with the server
|
||||
statx_dont_sync: bool = false,
|
||||
/// Apply to the entire subtree
|
||||
pub const RECURSIVE = 0x8000;
|
||||
recursive: bool = false,
|
||||
|
||||
pub const HANDLE_FID = REMOVEDIR;
|
||||
/// Special value used to indicate openat should use the current working directory
|
||||
pub const fdcwd = -100;
|
||||
|
||||
// https://github.com/torvalds/linux/blob/d3479214c05dbd07bc56f8823e7bd8719fcd39a9/tools/perf/trace/beauty/fs_at_flags.sh#L15
|
||||
/// AT_STATX_SYNC_TYPE is not a bit, its a mask of
|
||||
/// AT_STATX_SYNC_AS_STAT, AT_STATX_FORCE_SYNC and AT_STATX_DONT_SYNC
|
||||
/// Type of synchronisation required from statx()
|
||||
pub const statx_sync_type = 0x6000;
|
||||
|
||||
/// Do whatever stat() does
|
||||
/// This is the default and is very much filesystem-specific
|
||||
pub const statx_sync_as_stat: At = .{};
|
||||
};
|
||||
|
||||
pub const FALLOC = struct {
|
||||
|
|
@ -3656,30 +3656,36 @@ pub const X_OK = 1;
|
|||
pub const W_OK = 2;
|
||||
pub const R_OK = 4;
|
||||
|
||||
pub const W = struct {
|
||||
pub const NOHANG = 1;
|
||||
pub const UNTRACED = 2;
|
||||
pub const STOPPED = 2;
|
||||
pub const EXITED = 4;
|
||||
pub const CONTINUED = 8;
|
||||
pub const NOWAIT = 0x1000000;
|
||||
pub const W = packed struct(u32) {
|
||||
nohang: bool = false,
|
||||
untraced_or_stopped: bool = false,
|
||||
exited: bool = false,
|
||||
continued: bool = false,
|
||||
_unused: u20 = 0,
|
||||
nowait: bool = false,
|
||||
_unused_1: u7 = 0,
|
||||
|
||||
pub fn EXITSTATUS(s: u32) u8 {
|
||||
return @as(u8, @intCast((s & 0xff00) >> 8));
|
||||
pub fn EXITSTATUS(s: W) u8 {
|
||||
return @intCast((@as(u32, @bitCast(s)) & 0xff00) >> 8);
|
||||
}
|
||||
pub fn TERMSIG(s: u32) u32 {
|
||||
return s & 0x7f;
|
||||
|
||||
pub fn TERMSIG(s: W) u32 {
|
||||
return @as(u32, @bitCast(s)) & 0x7f;
|
||||
}
|
||||
pub fn STOPSIG(s: u32) u32 {
|
||||
|
||||
pub fn STOPSIG(s: W) u32 {
|
||||
return EXITSTATUS(s);
|
||||
}
|
||||
pub fn IFEXITED(s: u32) bool {
|
||||
|
||||
pub fn IFEXITED(s: W) bool {
|
||||
return TERMSIG(s) == 0;
|
||||
}
|
||||
pub fn IFSTOPPED(s: u32) bool {
|
||||
return @as(u16, @truncate(((s & 0xffff) *% 0x10001) >> 8)) > 0x7f00;
|
||||
|
||||
pub fn IFSTOPPED(s: W) bool {
|
||||
return @as(u16, @truncate(((@as(u32, @bitCast(s)) & 0xffff) *% 0x10001) >> 8)) > 0x7f00;
|
||||
}
|
||||
pub fn IFSIGNALED(s: u32) bool {
|
||||
|
||||
pub fn IFSIGNALED(s: W) bool {
|
||||
return (s & 0xffff) -% 1 < 0xff;
|
||||
}
|
||||
};
|
||||
|
|
@ -3885,16 +3891,44 @@ pub const SHUT = struct {
|
|||
pub const RDWR = 2;
|
||||
};
|
||||
|
||||
pub const SOCK = struct {
|
||||
pub const STREAM = if (is_mips) 2 else 1;
|
||||
pub const DGRAM = if (is_mips) 1 else 2;
|
||||
pub const RAW = 3;
|
||||
pub const RDM = 4;
|
||||
pub const SEQPACKET = 5;
|
||||
pub const DCCP = 6;
|
||||
pub const PACKET = 10;
|
||||
pub const CLOEXEC = if (is_sparc) 0o20000000 else 0o2000000;
|
||||
pub const NONBLOCK = if (is_mips) 0o200 else if (is_sparc) 0o40000 else 0o4000;
|
||||
/// SOCK_* Socket type and flags
|
||||
pub const Sock = packed struct(u32) {
|
||||
type: Type,
|
||||
flags: Flags = .{},
|
||||
|
||||
/// matches sock_type in kernel
|
||||
pub const Type = enum(u7) {
|
||||
stream = if (is_mips) 2 else 1,
|
||||
dgram = if (is_mips) 1 else 2,
|
||||
raw = 3,
|
||||
rdm = 4,
|
||||
seqpacket = 5,
|
||||
dccp = 6,
|
||||
packet = 10,
|
||||
|
||||
_,
|
||||
};
|
||||
|
||||
// bit range is (8 - 32] of the u32
|
||||
/// Flags for socket, socketpair, accept4
|
||||
pub const Flags = if (is_sparc) packed struct(u25) {
|
||||
_: u7 = 0, // start from u7 since Type comes before Flags
|
||||
nonblock: bool = false,
|
||||
_1: u7 = 0,
|
||||
cloexec: bool = false,
|
||||
_2: u9 = 0,
|
||||
} else if (is_mips) packed struct(u25) {
|
||||
nonblock: bool = false,
|
||||
_: u11 = 0,
|
||||
cloexec: bool = false,
|
||||
_1: u12 = 0,
|
||||
} else packed struct(u25) {
|
||||
_: u4 = 0,
|
||||
nonblock: bool = false,
|
||||
_1: u7 = 0,
|
||||
cloexec: bool = false,
|
||||
_2: u12 = 0,
|
||||
};
|
||||
};
|
||||
|
||||
pub const TCP = struct {
|
||||
|
|
|
|||
|
|
@ -492,7 +492,7 @@ pub fn accept(
|
|||
fd: linux.fd_t,
|
||||
addr: ?*posix.sockaddr,
|
||||
addrlen: ?*posix.socklen_t,
|
||||
flags: u32,
|
||||
flags: linux.Sock,
|
||||
) !*Sqe {
|
||||
const sqe = try self.get_sqe();
|
||||
sqe.prep_accept(fd, addr, addrlen, flags);
|
||||
|
|
@ -514,7 +514,7 @@ pub fn accept_multishot(
|
|||
fd: linux.fd_t,
|
||||
addr: ?*posix.sockaddr,
|
||||
addrlen: ?*posix.socklen_t,
|
||||
flags: u32,
|
||||
flags: linux.Sock,
|
||||
) !*Sqe {
|
||||
const sqe = try self.get_sqe();
|
||||
sqe.prep_multishot_accept(fd, addr, addrlen, flags);
|
||||
|
|
@ -539,7 +539,7 @@ pub fn accept_direct(
|
|||
fd: linux.fd_t,
|
||||
addr: ?*posix.sockaddr,
|
||||
addrlen: ?*posix.socklen_t,
|
||||
flags: u32,
|
||||
flags: linux.Sock,
|
||||
) !*Sqe {
|
||||
const sqe = try self.get_sqe();
|
||||
sqe.prep_accept_direct(fd, addr, addrlen, flags, constants.FILE_INDEX_ALLOC);
|
||||
|
|
@ -555,7 +555,7 @@ pub fn accept_multishot_direct(
|
|||
fd: linux.fd_t,
|
||||
addr: ?*posix.sockaddr,
|
||||
addrlen: ?*posix.socklen_t,
|
||||
flags: u32,
|
||||
flags: linux.Sock,
|
||||
) !*Sqe {
|
||||
const sqe = try self.get_sqe();
|
||||
sqe.prep_multishot_accept_direct(fd, addr, addrlen, flags);
|
||||
|
|
@ -931,7 +931,7 @@ pub fn statx(
|
|||
user_data: u64,
|
||||
fd: linux.fd_t,
|
||||
path: [:0]const u8,
|
||||
flags: u32,
|
||||
flags: linux.At,
|
||||
mask: linux.Statx.Mask,
|
||||
buf: *linux.Statx,
|
||||
) !*Sqe {
|
||||
|
|
@ -969,7 +969,7 @@ pub fn shutdown(
|
|||
self: *IoUring,
|
||||
user_data: u64,
|
||||
sockfd: posix.socket_t,
|
||||
how: u32,
|
||||
how: linux.At,
|
||||
) !*Sqe {
|
||||
const sqe = try self.get_sqe();
|
||||
sqe.prep_shutdown(sockfd, how);
|
||||
|
|
@ -1001,7 +1001,7 @@ pub fn unlinkat(
|
|||
user_data: u64,
|
||||
dir_fd: linux.fd_t,
|
||||
path: [*:0]const u8,
|
||||
flags: u32,
|
||||
flags: linux.At,
|
||||
) !*Sqe {
|
||||
const sqe = try self.get_sqe();
|
||||
sqe.prep_unlinkat(dir_fd, path, flags);
|
||||
|
|
@ -1048,7 +1048,7 @@ pub fn linkat(
|
|||
old_path: [*:0]const u8,
|
||||
new_dir_fd: linux.fd_t,
|
||||
new_path: [*:0]const u8,
|
||||
flags: u32,
|
||||
flags: linux.At,
|
||||
) !*Sqe {
|
||||
const sqe = try self.get_sqe();
|
||||
sqe.prep_linkat(old_dir_fd, old_path, new_dir_fd, new_path, flags);
|
||||
|
|
@ -1329,7 +1329,7 @@ pub fn socket(
|
|||
self: *IoUring,
|
||||
user_data: u64,
|
||||
domain: linux.AF,
|
||||
socket_type: linux.SOCK,
|
||||
socket_type: linux.Sock,
|
||||
protocol: u32,
|
||||
flags: u32,
|
||||
) !*Sqe {
|
||||
|
|
@ -2079,7 +2079,7 @@ test "accept/connect/send/recv" {
|
|||
try testing.expectEqual(Cqe{
|
||||
.user_data = 0xeeeeeeee,
|
||||
.res = buffer_send.len,
|
||||
.flags = 0,
|
||||
.flags = .{},
|
||||
}, cqe_send);
|
||||
|
||||
const cqe_recv = try ring.copy_cqe();
|
||||
|
|
@ -2171,7 +2171,7 @@ test "sendmsg/recvmsg" {
|
|||
try testing.expectEqual(Cqe{
|
||||
.user_data = 0x11111111,
|
||||
.res = buffer_send.len,
|
||||
.flags = 0,
|
||||
.flags = .{},
|
||||
}, cqe_sendmsg);
|
||||
|
||||
const cqe_recvmsg = try ring.copy_cqe();
|
||||
|
|
@ -2306,7 +2306,7 @@ test "timeout_remove" {
|
|||
try testing.expectEqual(Cqe{
|
||||
.user_data = 0x99999999,
|
||||
.res = 0,
|
||||
.flags = 0,
|
||||
.flags = .{},
|
||||
}, cqe);
|
||||
}
|
||||
}
|
||||
|
|
@ -2457,7 +2457,7 @@ test "statx" {
|
|||
try testing.expectEqual(Cqe{
|
||||
.user_data = 0xaaaaaaaa,
|
||||
.res = 0,
|
||||
.flags = 0,
|
||||
.flags = .{},
|
||||
}, cqe);
|
||||
|
||||
try testing.expect(buf.mask & linux.STATX_SIZE == linux.STATX_SIZE);
|
||||
|
|
@ -2504,13 +2504,13 @@ test "accept/connect/recv/cancel" {
|
|||
try testing.expectEqual(Cqe{
|
||||
.user_data = 0xffffffff,
|
||||
.res = -@as(i32, @intFromEnum(linux.E.CANCELED)),
|
||||
.flags = 0,
|
||||
.flags = .{},
|
||||
}, cqe_recv);
|
||||
|
||||
try testing.expectEqual(Cqe{
|
||||
.user_data = 0x99999999,
|
||||
.res = 0,
|
||||
.flags = 0,
|
||||
.flags = .{},
|
||||
}, cqe_cancel);
|
||||
}
|
||||
|
||||
|
|
@ -2645,7 +2645,7 @@ test "shutdown" {
|
|||
try testing.expectEqual(Cqe{
|
||||
.user_data = 0x445445445,
|
||||
.res = 0,
|
||||
.flags = 0,
|
||||
.flags = .{},
|
||||
}, cqe);
|
||||
}
|
||||
|
||||
|
|
@ -2715,7 +2715,7 @@ test "renameat" {
|
|||
try testing.expectEqual(Cqe{
|
||||
.user_data = 0x12121212,
|
||||
.res = 0,
|
||||
.flags = 0,
|
||||
.flags = .{},
|
||||
}, cqe);
|
||||
|
||||
// Validate that the old file doesn't exist anymore
|
||||
|
|
@ -2768,7 +2768,7 @@ test "unlinkat" {
|
|||
try testing.expectEqual(Cqe{
|
||||
.user_data = 0x12121212,
|
||||
.res = 0,
|
||||
.flags = 0,
|
||||
.flags = .{},
|
||||
}, cqe);
|
||||
|
||||
// Validate that the file doesn't exist anymore
|
||||
|
|
@ -2917,7 +2917,7 @@ test "linkat" {
|
|||
try testing.expectEqual(Cqe{
|
||||
.user_data = 0x12121212,
|
||||
.res = 0,
|
||||
.flags = 0,
|
||||
.flags = .{},
|
||||
}, cqe);
|
||||
|
||||
// Validate the second file
|
||||
|
|
@ -3365,7 +3365,7 @@ fn createSocketTestHarness(ring: *IoUring) !SocketTestHarness {
|
|||
try testing.expectEqual(Cqe{
|
||||
.user_data = 0xcccccccc,
|
||||
.res = 0,
|
||||
.flags = 0,
|
||||
.flags = .{},
|
||||
}, cqe_connect);
|
||||
|
||||
// All good
|
||||
|
|
@ -3811,7 +3811,7 @@ test "waitid" {
|
|||
}
|
||||
|
||||
var siginfo: posix.siginfo_t = undefined;
|
||||
_ = try ring.waitid(0, .PID, pid, &siginfo, posix.W.EXITED, 0);
|
||||
_ = try ring.waitid(0, .PID, pid, &siginfo, .{ .exited = true }, 0);
|
||||
|
||||
try testing.expectEqual(1, try ring.submit());
|
||||
|
||||
|
|
@ -3884,7 +3884,7 @@ test BufferGroup {
|
|||
try testing.expectEqual(1, submitted);
|
||||
const cqe_send = try ring.copy_cqe();
|
||||
if (cqe_send.err() == .INVAL) return error.SkipZigTest;
|
||||
try testing.expectEqual(Cqe{ .user_data = 1, .res = data.len, .flags = 0 }, cqe_send);
|
||||
try testing.expectEqual(Cqe{ .user_data = 1, .res = data.len, .flags = .{} }, cqe_send);
|
||||
}
|
||||
|
||||
// Server uses buffer group receive
|
||||
|
|
@ -3954,7 +3954,7 @@ test "ring mapped buffers recv" {
|
|||
try testing.expectEqual(@as(u32, 1), try ring.submit());
|
||||
const cqe_send = try ring.copy_cqe();
|
||||
if (cqe_send.err() == .INVAL) return error.SkipZigTest;
|
||||
try testing.expectEqual(Cqe{ .user_data = user_data, .res = data.len, .flags = 0 }, cqe_send);
|
||||
try testing.expectEqual(Cqe{ .user_data = user_data, .res = data.len, .flags = .{} }, cqe_send);
|
||||
}
|
||||
var pos: usize = 0;
|
||||
|
||||
|
|
@ -4043,7 +4043,7 @@ test "ring mapped buffers multishot recv" {
|
|||
try testing.expectEqual(@as(u32, 1), try ring.submit());
|
||||
const cqe_send = try ring.copy_cqe();
|
||||
if (cqe_send.err() == .INVAL) return error.SkipZigTest;
|
||||
try testing.expectEqual(Cqe{ .user_data = user_data, .res = data.len, .flags = 0 }, cqe_send);
|
||||
try testing.expectEqual(Cqe{ .user_data = user_data, .res = data.len, .flags = .{} }, cqe_send);
|
||||
}
|
||||
|
||||
// start multishot recv
|
||||
|
|
@ -4251,7 +4251,7 @@ test "bind/listen/connect" {
|
|||
|
||||
const listen_fd = brk: {
|
||||
// Create socket
|
||||
_ = try ring.socket(1, addr.family, linux.SOCK.STREAM | linux.SOCK.CLOEXEC, proto, 0);
|
||||
_ = try ring.socket(1, addr.any.family, .{ .type = .stream, .flags = .{ .cloexec = true } }, proto, 0);
|
||||
try testing.expectEqual(1, try ring.submit());
|
||||
var cqe = try ring.copy_cqe();
|
||||
try testing.expectEqual(1, cqe.user_data);
|
||||
|
|
@ -4653,7 +4653,7 @@ pub const Sqe = extern struct {
|
|||
fd: linux.fd_t,
|
||||
addr: ?*linux.sockaddr,
|
||||
addrlen: ?*linux.socklen_t,
|
||||
flags: linux.SOCK,
|
||||
flags: linux.Sock,
|
||||
) void {
|
||||
// `addr` holds a pointer to `sockaddr`, and `addr2` holds a pointer to socklen_t`.
|
||||
// `addr2` maps to `sqe.off` (u64) instead of `sqe.len` (which is only a u32).
|
||||
|
|
@ -4667,7 +4667,7 @@ pub const Sqe = extern struct {
|
|||
fd: linux.fd_t,
|
||||
addr: ?*linux.sockaddr,
|
||||
addrlen: ?*linux.socklen_t,
|
||||
flags: linux.SOCK,
|
||||
flags: linux.Sock,
|
||||
file_index: u32,
|
||||
) void {
|
||||
prep_accept(sqe, fd, addr, addrlen, flags);
|
||||
|
|
@ -4679,7 +4679,7 @@ pub const Sqe = extern struct {
|
|||
fd: linux.fd_t,
|
||||
addr: ?*linux.sockaddr,
|
||||
addrlen: ?*linux.socklen_t,
|
||||
flags: linux.SOCK,
|
||||
flags: linux.Sock,
|
||||
) void {
|
||||
prep_accept(sqe, fd, addr, addrlen, flags);
|
||||
sqe.ioprio = .{ .accept = .{ .MULTISHOT = true } };
|
||||
|
|
@ -4691,7 +4691,7 @@ pub const Sqe = extern struct {
|
|||
fd: linux.fd_t,
|
||||
addr: ?*linux.sockaddr,
|
||||
addrlen: ?*linux.socklen_t,
|
||||
flags: linux.SOCK,
|
||||
flags: linux.Sock,
|
||||
) void {
|
||||
prep_multishot_accept(sqe, fd, addr, addrlen, flags);
|
||||
set_target_fixed_file(sqe, constants.FILE_INDEX_ALLOC);
|
||||
|
|
@ -4994,9 +4994,9 @@ pub const Sqe = extern struct {
|
|||
pub fn prep_shutdown(
|
||||
sqe: *Sqe,
|
||||
sockfd: linux.socket_t,
|
||||
how: linux.SHUT,
|
||||
how: linux.Shut,
|
||||
) void {
|
||||
sqe.prep_rw(.SHUTDOWN, sockfd, 0, how, 0);
|
||||
sqe.prep_rw(.SHUTDOWN, sockfd, 0, @intFromEnum(how), 0);
|
||||
}
|
||||
|
||||
pub fn prep_renameat(
|
||||
|
|
@ -5015,7 +5015,7 @@ pub const Sqe = extern struct {
|
|||
@intFromPtr(new_path),
|
||||
);
|
||||
sqe.len = @bitCast(new_dir_fd);
|
||||
sqe.rw_flags = flags;
|
||||
sqe.rw_flags = @bitCast(flags);
|
||||
}
|
||||
|
||||
pub fn prep_unlinkat(
|
||||
|
|
@ -5058,7 +5058,7 @@ pub const Sqe = extern struct {
|
|||
old_path: [*:0]const u8,
|
||||
new_dir_fd: linux.fd_t,
|
||||
new_path: [*:0]const u8,
|
||||
flags: linux.AT, // only AT_EMPTY_PATH, AT_SYMLINK_FOLLOW
|
||||
flags: linux.At, // only AT_EMPTY_PATH, AT_SYMLINK_FOLLOW
|
||||
) void {
|
||||
sqe.prep_rw(
|
||||
.LINKAT,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue