diff options
-rw-r--r-- | src/bun.js/api/bun/subprocess.zig | 9 | ||||
-rw-r--r-- | test/bun.js/spawn.test.ts | 22 |
2 files changed, 30 insertions, 1 deletions
diff --git a/src/bun.js/api/bun/subprocess.zig b/src/bun.js/api/bun/subprocess.zig index 638c8ffef..467a3a842 100644 --- a/src/bun.js/api/bun/subprocess.zig +++ b/src/bun.js/api/bun/subprocess.zig @@ -1177,7 +1177,7 @@ pub const Subprocess = struct { subprocess.finalize(); const sync_value = JSC.JSValue.createEmptyObject(globalThis, 4); - sync_value.put(globalThis, JSC.ZigString.static("exitCode"), JSValue.jsNumber(@intCast(i32, exitCode) * -1)); + sync_value.put(globalThis, JSC.ZigString.static("exitCode"), JSValue.jsNumber(@intCast(i32, exitCode))); sync_value.put(globalThis, JSC.ZigString.static("stdout"), stdout); sync_value.put(globalThis, JSC.ZigString.static("stderr"), stderr); sync_value.put(globalThis, JSC.ZigString.static("success"), JSValue.jsBoolean(exitCode == 0)); @@ -1203,6 +1203,13 @@ pub const Subprocess = struct { }, .result => |status| { this.exit_code = @truncate(u8, status.status); + // Do WEXITSTATUS macro check: https://linux.die.net/man/3/waitpid + // https://code.woboq.org/gtk/include/bits/waitstatus.h.html + const w_if_exited = (status.status & 0x7f) == 0; + if (w_if_exited) { + const w_exit_status = (status.status & 0xff00) >> 8; + this.exit_code = @truncate(u8, w_exit_status); + } }, } diff --git a/test/bun.js/spawn.test.ts b/test/bun.js/spawn.test.ts index 9e4144024..1b62542cf 100644 --- a/test/bun.js/spawn.test.ts +++ b/test/bun.js/spawn.test.ts @@ -28,6 +28,17 @@ for (let [gcTick, label] of [ expect(stdout.toString()).toBe(hugeString); expect(stderr.byteLength).toBe(0); }); + + it("check exit code", async () => { + const { exitCode: exitCode1 } = spawnSync({ + cmd: ["ls"] + }); + const { exitCode: exitCode2 } = spawnSync({ + cmd: ["false"] + }); + expect(exitCode1).toBe(0); + expect(exitCode2).toBe(1); + }); }); describe("spawn", () => { @@ -70,6 +81,17 @@ for (let [gcTick, label] of [ expect(await Bun.file("/tmp/out.123.txt").text()).toBe(hugeString); }); + it("check exit code", async () => { + const exitCode1 = await spawn({ + cmd: ["ls"], + }).exited; + const exitCode2 = await spawn({ + cmd: ["false"] + }).exited; + expect(exitCode1).toBe(0); + expect(exitCode2).toBe(1); + }); + it("Blob works as stdin", async () => { rmSync("/tmp/out.123.txt", { force: true }); gcTick(); |