Function createFileZ [src]

Same as createFile but the path parameter is null-terminated.

Prototype

pub fn createFileZ(self: Dir, sub_path_c: [*:0]const u8, flags: File.CreateFlags) File.OpenError!File

Parameters

self: Dirsub_path_c: [*:0]const u8flags: File.CreateFlags

Source

pub fn createFileZ(self: Dir, sub_path_c: [*:0]const u8, flags: File.CreateFlags) File.OpenError!File { switch (native_os) { .windows => { const path_w = try windows.cStrToPrefixedFileW(self.fd, sub_path_c); return self.createFileW(path_w.span(), flags); }, .wasi => { return createFile(self, mem.sliceTo(sub_path_c, 0), flags); }, else => {}, } var os_flags: posix.O = .{ .ACCMODE = if (flags.read) .RDWR else .WRONLY, .CREAT = true, .TRUNC = flags.truncate, .EXCL = flags.exclusive, }; if (@hasField(posix.O, "LARGEFILE")) os_flags.LARGEFILE = true; if (@hasField(posix.O, "CLOEXEC")) os_flags.CLOEXEC = true; // Use the O locking flags if the os supports them to acquire the lock // atomically. Note that the NONBLOCK flag is removed after the openat() // call is successful. const has_flock_open_flags = @hasField(posix.O, "EXLOCK"); if (has_flock_open_flags) switch (flags.lock) { .none => {}, .shared => { os_flags.SHLOCK = true; os_flags.NONBLOCK = flags.lock_nonblocking; }, .exclusive => { os_flags.EXLOCK = true; os_flags.NONBLOCK = flags.lock_nonblocking; }, }; const fd = try posix.openatZ(self.fd, sub_path_c, os_flags, flags.mode); errdefer posix.close(fd); if (have_flock and !has_flock_open_flags and flags.lock != .none) { // TODO: integrate async I/O const lock_nonblocking: i32 = if (flags.lock_nonblocking) posix.LOCK.NB else 0; try posix.flock(fd, switch (flags.lock) { .none => unreachable, .shared => posix.LOCK.SH | lock_nonblocking, .exclusive => posix.LOCK.EX | lock_nonblocking, }); } if (has_flock_open_flags and flags.lock_nonblocking) { var fl_flags = posix.fcntl(fd, posix.F.GETFL, 0) catch |err| switch (err) { error.FileBusy => unreachable, error.Locked => unreachable, error.PermissionDenied => unreachable, error.DeadLock => unreachable, error.LockedRegionLimitExceeded => unreachable, else => |e| return e, }; fl_flags &= ~@as(usize, 1 << @bitOffsetOf(posix.O, "NONBLOCK")); _ = posix.fcntl(fd, posix.F.SETFL, fl_flags) catch |err| switch (err) { error.FileBusy => unreachable, error.Locked => unreachable, error.PermissionDenied => unreachable, error.DeadLock => unreachable, error.LockedRegionLimitExceeded => unreachable, else => |e| return e, }; } return .{ .handle = fd }; }