authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-02-28 15:15:04-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-02-28 15:15:04-07:00
log28fe994a107b4f66d840c50df614504ac2387587
treebdfc21949c0086fa26fc16990a09fc2de1c8b8e4
parent0a0494feb899d19ef05bac08d1b4db729e699c53
parent8a827fafa6054c567419114d073c5691dd3291d5

Merge pull request #129 from notkild/master

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 {...@@ -121,6 +121,18 @@ pub struct OutStream {
121 }121 }
122 }122 }
123 }123 }
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 }
124}136}
125137
126pub struct InStream {138pub struct InStream {
...@@ -140,6 +152,18 @@ pub struct InStream {...@@ -140,6 +152,18 @@ pub struct InStream {
140 }152 }
141 return amt_read;153 return amt_read;
142 }154 }
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 }
143}167}
144168
145#attribute("cold")169#attribute("cold")
std/syscall.zig+63
...@@ -8,6 +8,26 @@ const SYS_write = switch (@compile_var("arch")) {...@@ -8,6 +8,26 @@ const SYS_write = switch (@compile_var("arch")) {
8 i386 => 4,8 i386 => 4,
9 else => unreachable{},9 else => unreachable{},
10};10};
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};
11const SYS_mmap = switch (@compile_var("arch")) {31const SYS_mmap = switch (@compile_var("arch")) {
12 x86_64 => 9,32 x86_64 => 9,
13 i386 => 90,33 i386 => 90,
...@@ -53,6 +73,11 @@ const SYS_tgkill = switch (@compile_var("arch")) {...@@ -53,6 +73,11 @@ const SYS_tgkill = switch (@compile_var("arch")) {
53 i386 => 270,73 i386 => 270,
54 else => unreachable{},74 else => unreachable{},
55};75};
76const SYS_openat = switch (@compile_var("arch")) {
77 x86_64 => 257,
78 i386 => 295,
79 else => unreachable{},
80};
56const SYS_getrandom = switch (@compile_var("arch")) {81const SYS_getrandom = switch (@compile_var("arch")) {
57 x86_64 => 318,82 x86_64 => 318,
58 i386 => 355,83 i386 => 355,
...@@ -70,6 +95,15 @@ pub const MMAP_MAP_PRIVATE = 2;...@@ -70,6 +95,15 @@ pub const MMAP_MAP_PRIVATE = 2;
70pub const MMAP_MAP_FIXED = 16;95pub const MMAP_MAP_FIXED = 16;
71pub const MMAP_MAP_ANON = 32;96pub 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
73pub const SIGHUP = 1;107pub const SIGHUP = 1;
74pub const SIGINT = 2;108pub const SIGINT = 2;
75pub const SIGQUIT = 3;109pub const SIGQUIT = 3;
...@@ -268,6 +302,35 @@ pub fn write(fd: isize, buf: &const u8, count: isize) -> isize {...@@ -268,6 +302,35 @@ pub fn write(fd: isize, buf: &const u8, count: isize) -> isize {
268 syscall3(SYS_write, isize(fd), isize(buf), count)302 syscall3(SYS_write, isize(fd), isize(buf), count)
269}303}
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
271pub fn exit(status: i32) -> unreachable {334pub fn exit(status: i32) -> unreachable {
272 syscall1(SYS_exit, isize(status));335 syscall1(SYS_exit, isize(status));
273 unreachable{}336 unreachable{}