authorgravatar for notkild@gmail.comnotkild <notkild@gmail.com> 2016-02-28 15:22:09+01:00
committergravatar for notkild@gmail.comnotkild <notkild@gmail.com> 2016-02-28 23:12:58+01:00
log8a827fafa6054c567419114d073c5691dd3291d5
treebdfc21949c0086fa26fc16990a09fc2de1c8b8e4
parent0a0494feb899d19ef05bac08d1b4db729e699c53

Add support to open, create and close file


2 files changed, 87 insertions(+), 0 deletions(-)

std/std.zig+24
......@@ -121,6 +121,18 @@ pub struct OutStream {
121121 }
122122 }
123123 }
124
125 pub fn close(os: &OutStream) -> %void {
126 const closed = close(os.fd);
127 if (closed < 0) {
128 return switch (-closed) {
129 EIO => error.Io,
130 EBADF => error.BadFd,
131 EINTR => error.SigInterrupt,
132 else => error.Unexpected,
133 }
134 }
135 }
124136}
125137
126138pub struct InStream {
......@@ -140,6 +152,18 @@ pub struct InStream {
140152 }
141153 return amt_read;
142154 }
155
156 pub fn close(is: &InStream) -> %void {
157 const closed = close(is.fd);
158 if (closed < 0) {
159 return switch (-closed) {
160 EIO => error.Io,
161 EBADF => error.BadFd,
162 EINTR => error.SigInterrupt,
163 else => error.Unexpected,
164 }
165 }
166 }
143167}
144168
145169#attribute("cold")
std/syscall.zig+63
......@@ -8,6 +8,26 @@ const SYS_write = switch (@compile_var("arch")) {
88 i386 => 4,
99 else => unreachable{},
1010};
11const SYS_open = switch (@compile_var("arch")) {
12 x86_64 => 2,
13 i386 => 5,
14 else => unreachable{},
15};
16const SYS_close = switch (@compile_var("arch")) {
17 x86_64 => 3,
18 i386 => 6,
19 else => unreachable{},
20};
21const SYS_creat = switch (@compile_var("arch")) {
22 x86_64 => 85,
23 i386 => 8,
24 else => unreachable{},
25};
26const SYS_lseek = switch (@compile_var("arch")) {
27 x86_64 => 8,
28 i386 => 19,
29 else => unreachable{},
30};
1131const SYS_mmap = switch (@compile_var("arch")) {
1232 x86_64 => 9,
1333 i386 => 90,
......@@ -53,6 +73,11 @@ const SYS_tgkill = switch (@compile_var("arch")) {
5373 i386 => 270,
5474 else => unreachable{},
5575};
76const SYS_openat = switch (@compile_var("arch")) {
77 x86_64 => 257,
78 i386 => 295,
79 else => unreachable{},
80};
5681const SYS_getrandom = switch (@compile_var("arch")) {
5782 x86_64 => 318,
5883 i386 => 355,
......@@ -70,6 +95,15 @@ pub const MMAP_MAP_PRIVATE = 2;
7095pub const MMAP_MAP_FIXED = 16;
7196pub const MMAP_MAP_ANON = 32;
7297
98pub const O_RDONLY = 0x0;
99pub const O_WRONLY = 0x1;
100pub const O_RDWR = 0x2;
101pub const O_CREAT = 0x40;
102pub const O_EXCL = 0x80;
103pub const O_TRUNC = 0x200;
104pub const O_APPEND = 0x400;
105pub const O_SYNC = 0x101000;
106
73107pub const SIGHUP = 1;
74108pub const SIGINT = 2;
75109pub const SIGQUIT = 3;
......@@ -268,6 +302,35 @@ pub fn write(fd: isize, buf: &const u8, count: isize) -> isize {
268302 syscall3(SYS_write, isize(fd), isize(buf), count)
269303}
270304
305pub fn open(path: []u8, flags: isize, perm: isize) -> isize {
306 var buf: [path.len + 1]u8 = undefined;
307 @memcpy(&buf[0], &path[0], path.len);
308 buf[path.len] = 0;
309 syscall3(SYS_open, isize(&buf[0]), flags, perm)
310}
311
312pub fn create(path: []u8, perm: isize) -> isize {
313 var buf: [path.len + 1]u8 = undefined;
314 @memcpy(&buf[0], &path[0], path.len);
315 buf[path.len] = 0;
316 syscall2(SYS_creat, isize(&buf[0]), perm)
317}
318
319pub fn openat(dirfd: isize, path: []u8, flags: isize, mode: isize) -> isize {
320 var buf: [path.len + 1]u8 = undefined;
321 @memcpy(&buf[0], &path[0], path.len);
322 buf[path.len] = 0;
323 syscall4(SYS_openat, dirfd, isize(&buf[0]), flags, mode)
324}
325
326pub fn close(fd: isize) -> isize {
327 syscall1(SYS_close, fd)
328}
329
330pub fn lseek(fd: isize, offset: isize, ref_pos: isize) -> isize {
331 syscall3(SYS_lseek, fd, offset, ref_pos)
332}
333
271334pub fn exit(status: i32) -> unreachable {
272335 syscall1(SYS_exit, isize(status));
273336 unreachable{}