Add support to open, create and close file

This commit is contained in:
notkild 2016-02-28 15:22:09 +01:00
parent 0a0494feb8
commit 8a827fafa6
2 changed files with 87 additions and 0 deletions

View File

@ -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")

View File

@ -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{}