Add support to open, create and close file
This commit is contained in:
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 {
|
pub struct InStream {
|
||||||
|
@ -140,6 +152,18 @@ pub struct InStream {
|
||||||
}
|
}
|
||||||
return amt_read;
|
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")
|
#attribute("cold")
|
||||||
|
|
|
@ -8,6 +8,26 @@ const SYS_write = switch (@compile_var("arch")) {
|
||||||
i386 => 4,
|
i386 => 4,
|
||||||
else => unreachable{},
|
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")) {
|
const SYS_mmap = switch (@compile_var("arch")) {
|
||||||
x86_64 => 9,
|
x86_64 => 9,
|
||||||
i386 => 90,
|
i386 => 90,
|
||||||
|
@ -53,6 +73,11 @@ const SYS_tgkill = switch (@compile_var("arch")) {
|
||||||
i386 => 270,
|
i386 => 270,
|
||||||
else => unreachable{},
|
else => unreachable{},
|
||||||
};
|
};
|
||||||
|
const SYS_openat = switch (@compile_var("arch")) {
|
||||||
|
x86_64 => 257,
|
||||||
|
i386 => 295,
|
||||||
|
else => unreachable{},
|
||||||
|
};
|
||||||
const SYS_getrandom = switch (@compile_var("arch")) {
|
const SYS_getrandom = switch (@compile_var("arch")) {
|
||||||
x86_64 => 318,
|
x86_64 => 318,
|
||||||
i386 => 355,
|
i386 => 355,
|
||||||
|
@ -70,6 +95,15 @@ pub const MMAP_MAP_PRIVATE = 2;
|
||||||
pub const MMAP_MAP_FIXED = 16;
|
pub const MMAP_MAP_FIXED = 16;
|
||||||
pub const MMAP_MAP_ANON = 32;
|
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 SIGHUP = 1;
|
||||||
pub const SIGINT = 2;
|
pub const SIGINT = 2;
|
||||||
pub const SIGQUIT = 3;
|
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)
|
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 {
|
pub fn exit(status: i32) -> unreachable {
|
||||||
syscall1(SYS_exit, isize(status));
|
syscall1(SYS_exit, isize(status));
|
||||||
unreachable{}
|
unreachable{}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user