aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/javascript/jsc/api/bun.zig24
-rw-r--r--src/javascript/jsc/node/syscall.zig32
2 files changed, 27 insertions, 29 deletions
diff --git a/src/javascript/jsc/api/bun.zig b/src/javascript/jsc/api/bun.zig
index d9c8aeee5..bd9fa54e6 100644
--- a/src/javascript/jsc/api/bun.zig
+++ b/src/javascript/jsc/api/bun.zig
@@ -1179,24 +1179,26 @@ pub fn mmapFile(
var buf: [bun.MAX_PATH_BYTES]u8 = undefined;
const path = getFilePath(ctx, arguments[0..@minimum(1, arguments.len)], &buf, exception) orelse return null;
+ args.eat();
buf[path.len] = 0;
const buf_z: [:0]const u8 = buf[0..path.len :0];
- const flags = v: {
- _ = args.nextEat();
- const opts = args.nextEat() orelse break :v std.os.MAP.SHARED;
- const sync = opts.get(ctx.ptr(), "sync") orelse JSC.JSValue.jsBoolean(false);
- const shared = opts.get(ctx.ptr(), "shared") orelse JSC.JSValue.jsBoolean(true);
- const sync_flags = if (@hasDecl(std.os, "SYNC")) std.os.MAP.SYNC | std.os.MAP.SHARED_VALIDATE else 0;
+ const sync_flags: u32 = if (@hasDecl(std.os.MAP, "SYNC")) std.os.MAP.SYNC | std.os.MAP.SHARED_VALIDATE else 0;
+ const file_flags: u32 = if (@hasDecl(std.os.MAP, "FILE")) std.os.MAP.FILE else 0;
- var flags: u32 = 0;
- if (sync.toBoolean()) flags |= sync_flags;
- if (shared.toBoolean()) flags |= std.os.MAP.SHARED else flags |= std.os.MAP.PRIVATE;
+ // Conforming applications must specify either MAP_PRIVATE or MAP_SHARED.
+ var flags = file_flags;
- break :v flags;
- };
+ if (args.nextEat()) |opts| {
+ const sync = opts.get(ctx.ptr(), "sync") orelse JSC.JSValue.jsBoolean(false);
+ const shared = opts.get(ctx.ptr(), "shared") orelse JSC.JSValue.jsBoolean(true);
+ flags |= @as(u32, if (sync.toBoolean()) sync_flags else 0);
+ flags |= @as(u32, if (shared.toBoolean()) std.os.MAP.SHARED else std.os.MAP.PRIVATE);
+ } else {
+ flags |= std.os.MAP.SHARED;
+ }
const map = switch (JSC.Node.Syscall.mmapFile(buf_z, flags)) {
.result => |map| map,
diff --git a/src/javascript/jsc/node/syscall.zig b/src/javascript/jsc/node/syscall.zig
index bf4d6189e..736e5b809 100644
--- a/src/javascript/jsc/node/syscall.zig
+++ b/src/javascript/jsc/node/syscall.zig
@@ -104,19 +104,19 @@ pub fn chdir(destination: [:0]const u8) Maybe(void) {
}
pub fn stat(path: [:0]const u8) Maybe(os.Stat) {
- var stat_ = comptime mem.zeroes(os.Stat);
+ var stat_ = mem.zeroes(os.Stat);
if (Maybe(os.Stat).errnoSys(sys.stat(path, &stat_), .stat)) |err| return err;
return Maybe(os.Stat){ .result = stat_ };
}
pub fn lstat(path: [:0]const u8) Maybe(os.Stat) {
- var stat_ = comptime mem.zeroes(os.Stat);
+ var stat_ = mem.zeroes(os.Stat);
if (Maybe(os.Stat).errnoSys(C.lstat(path, &stat_), .lstat)) |err| return err;
return Maybe(os.Stat){ .result = stat_ };
}
pub fn fstat(fd: JSC.Node.FileDescriptor) Maybe(os.Stat) {
- var stat_ = comptime mem.zeroes(os.Stat);
+ var stat_ = mem.zeroes(os.Stat);
if (Maybe(os.Stat).errnoSys(fstat_sym(fd, &stat_), .fstat)) |err| return err;
return Maybe(os.Stat){ .result = stat_ };
}
@@ -404,7 +404,7 @@ pub fn getFdPath(fd: fd_t, out_buffer: *[MAX_PATH_BYTES]u8) Maybe([]u8) {
/// Use of a mapped region can result in these signals:
/// * SIGSEGV - Attempted write into a region mapped as read-only.
/// * SIGBUS - Attempted access to a portion of the buffer that does not correspond to the file
-fn sysmmap(
+fn mmap(
ptr: ?[*]align(mem.page_size) u8,
length: usize,
prot: u32,
@@ -416,20 +416,16 @@ fn sysmmap(
system.mmap64
else
system.mmap;
-
const ioffset = @bitCast(i64, offset); // the OS treats this as unsigned
const rc = mmap_sym(ptr, length, prot, flags, fd, ioffset);
- _ = if (builtin.link_libc) blk: {
- if (rc != std.c.MAP.FAILED) return .{ .result = @ptrCast([*]align(mem.page_size) u8, @alignCast(mem.page_size, rc))[0..length] };
- break :blk rc;
- } else blk: {
- const err = os.errno(rc);
- if (err == .SUCCESS) return .{ .result = @intToPtr([*]align(mem.page_size) u8, rc)[0..length] };
- break :blk rc;
- };
-
- return Maybe([]align(mem.page_size) u8).errnoSys(@ptrToInt(rc), .mmap).?;
+ if (rc == std.c.MAP.FAILED) {
+ return Maybe([]align(mem.page_size) u8){
+ .err = .{ .errno = @truncate(Syscall.Error.Int, @enumToInt(std.c.getErrno(@bitCast(i64, @ptrToInt(std.c.MAP.FAILED))))), .syscall = .mmap },
+ };
+ }
+
+ return Maybe([]align(mem.page_size) u8){.result = @ptrCast([*]align(mem.page_size) u8, @alignCast(mem.page_size, rc))[0..length] };
}
pub fn mmapFile(path: [:0]const u8, flags: u32) Maybe([]align(mem.page_size) u8) {
@@ -438,15 +434,15 @@ pub fn mmapFile(path: [:0]const u8, flags: u32) Maybe([]align(mem.page_size) u8)
.err => |err| return .{ .err = err },
};
- const size = switch (stat(path)) {
- .result => |stat| stat.size,
+ const size = switch (fstat(fd)) {
+ .result => |result| result.size,
.err => |err| {
_ = close(fd);
return .{ .err = err };
},
};
- const map = switch (sysmmap(null, @intCast(usize, size), os.PROT.READ | os.PROT.WRITE, flags, fd, 0)) {
+ const map = switch (mmap(null, @intCast(usize, size), os.PROT.READ | os.PROT.WRITE, flags, fd, 0)) {
.result => |map| map,
.err => |err| {