Add support to open, create and close file
parent
0a0494feb8
commit
8a827fafa6
24
std/std.zig
24
std/std.zig
|
@ -121,6 +121,18 @@ pub struct OutStream {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn close(os: &OutStream) -> %void {
|
||||
const closed = close(os.fd);
|
||||
if (closed < 0) {
|
||||
return switch (-closed) {
|
||||
EIO => error.Io,
|
||||
EBADF => error.BadFd,
|
||||
EINTR => error.SigInterrupt,
|
||||
else => error.Unexpected,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub struct InStream {
|
||||
|
@ -140,6 +152,18 @@ pub struct InStream {
|
|||
}
|
||||
return amt_read;
|
||||
}
|
||||
|
||||
pub fn close(is: &InStream) -> %void {
|
||||
const closed = close(is.fd);
|
||||
if (closed < 0) {
|
||||
return switch (-closed) {
|
||||
EIO => error.Io,
|
||||
EBADF => error.BadFd,
|
||||
EINTR => error.SigInterrupt,
|
||||
else => error.Unexpected,
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#attribute("cold")
|
||||
|
|
|
@ -8,6 +8,26 @@ const SYS_write = switch (@compile_var("arch")) {
|
|||
i386 => 4,
|
||||
else => unreachable{},
|
||||
};
|
||||
const SYS_open = switch (@compile_var("arch")) {
|
||||
x86_64 => 2,
|
||||
i386 => 5,
|
||||
else => unreachable{},
|
||||
};
|
||||
const SYS_close = switch (@compile_var("arch")) {
|
||||
x86_64 => 3,
|
||||
i386 => 6,
|
||||
else => unreachable{},
|
||||
};
|
||||
const SYS_creat = switch (@compile_var("arch")) {
|
||||
x86_64 => 85,
|
||||
i386 => 8,
|
||||
else => unreachable{},
|
||||
};
|
||||
const SYS_lseek = switch (@compile_var("arch")) {
|
||||
x86_64 => 8,
|
||||
i386 => 19,
|
||||
else => unreachable{},
|
||||
};
|
||||
const SYS_mmap = switch (@compile_var("arch")) {
|
||||
x86_64 => 9,
|
||||
i386 => 90,
|
||||
|
@ -53,6 +73,11 @@ const SYS_tgkill = switch (@compile_var("arch")) {
|
|||
i386 => 270,
|
||||
else => unreachable{},
|
||||
};
|
||||
const SYS_openat = switch (@compile_var("arch")) {
|
||||
x86_64 => 257,
|
||||
i386 => 295,
|
||||
else => unreachable{},
|
||||
};
|
||||
const SYS_getrandom = switch (@compile_var("arch")) {
|
||||
x86_64 => 318,
|
||||
i386 => 355,
|
||||
|
@ -70,6 +95,15 @@ pub const MMAP_MAP_PRIVATE = 2;
|
|||
pub const MMAP_MAP_FIXED = 16;
|
||||
pub const MMAP_MAP_ANON = 32;
|
||||
|
||||
pub const O_RDONLY = 0x0;
|
||||
pub const O_WRONLY = 0x1;
|
||||
pub const O_RDWR = 0x2;
|
||||
pub const O_CREAT = 0x40;
|
||||
pub const O_EXCL = 0x80;
|
||||
pub const O_TRUNC = 0x200;
|
||||
pub const O_APPEND = 0x400;
|
||||
pub const O_SYNC = 0x101000;
|
||||
|
||||
pub const SIGHUP = 1;
|
||||
pub const SIGINT = 2;
|
||||
pub const SIGQUIT = 3;
|
||||
|
@ -268,6 +302,35 @@ pub fn write(fd: isize, buf: &const u8, count: isize) -> isize {
|
|||
syscall3(SYS_write, isize(fd), isize(buf), count)
|
||||
}
|
||||
|
||||
pub fn open(path: []u8, flags: isize, perm: isize) -> isize {
|
||||
var buf: [path.len + 1]u8 = undefined;
|
||||
@memcpy(&buf[0], &path[0], path.len);
|
||||
buf[path.len] = 0;
|
||||
syscall3(SYS_open, isize(&buf[0]), flags, perm)
|
||||
}
|
||||
|
||||
pub fn create(path: []u8, perm: isize) -> isize {
|
||||
var buf: [path.len + 1]u8 = undefined;
|
||||
@memcpy(&buf[0], &path[0], path.len);
|
||||
buf[path.len] = 0;
|
||||
syscall2(SYS_creat, isize(&buf[0]), perm)
|
||||
}
|
||||
|
||||
pub fn openat(dirfd: isize, path: []u8, flags: isize, mode: isize) -> isize {
|
||||
var buf: [path.len + 1]u8 = undefined;
|
||||
@memcpy(&buf[0], &path[0], path.len);
|
||||
buf[path.len] = 0;
|
||||
syscall4(SYS_openat, dirfd, isize(&buf[0]), flags, mode)
|
||||
}
|
||||
|
||||
pub fn close(fd: isize) -> isize {
|
||||
syscall1(SYS_close, fd)
|
||||
}
|
||||
|
||||
pub fn lseek(fd: isize, offset: isize, ref_pos: isize) -> isize {
|
||||
syscall3(SYS_lseek, fd, offset, ref_pos)
|
||||
}
|
||||
|
||||
pub fn exit(status: i32) -> unreachable {
|
||||
syscall1(SYS_exit, isize(status));
|
||||
unreachable{}
|
||||
|
|
Loading…
Reference in New Issue