Back to Skills

zig-system-calls

verified

Guides using bun.sys for system calls and file I/O in Zig. Use when implementing file operations instead of std.fs or std.posix.

View on GitHub

Repository
Verified Org

oven-sh/bun
86.7kstars

.claude/skills/zig-system-calls/SKILL.md

Last Verified

January 25, 2026

Install Skill

Select agents to install to:

Scope:
npx add-skill https://github.com/oven-sh/bun/blob/70fe76209b79b5280fd6c5641ef5814e8fa5ee0d/.claude/skills/zig-system-calls/SKILL.md -a claude-code --skill zig-system-calls

Installation paths:

Claude
.claude/skills/zig-system-calls/
Powered by add-skill CLI

Instructions

# System Calls & File I/O in Zig

Use `bun.sys` instead of `std.fs` or `std.posix` for cross-platform syscalls with proper error handling.

## bun.sys.File (Preferred)

For most file operations, use the `bun.sys.File` wrapper:

```zig
const File = bun.sys.File;

const file = switch (File.open(path, bun.O.RDWR, 0o644)) {
    .result => |f| f,
    .err => |err| return .{ .err = err },
};
defer file.close();

// Read/write
_ = try file.read(buffer).unwrap();
_ = try file.writeAll(data).unwrap();

// Get file info
const stat = try file.stat().unwrap();
const size = try file.getEndPos().unwrap();

// std.io compatible
const reader = file.reader();
const writer = file.writer();
```

### Complete Example

```zig
const File = bun.sys.File;

pub fn writeFile(path: [:0]const u8, data: []const u8) File.WriteError!void {
    const file = switch (File.open(path, bun.O.WRONLY | bun.O.CREAT | bun.O.TRUNC, 0o664)) {
        .result => |f| f,
        .err => |err| return err.toError(),
    };
    defer file.close();

    _ = switch (file.writeAll(data)) {
        .result => {},
        .err => |err| return err.toError(),
    };
}
```

## Why bun.sys?

| Aspect      | bun.sys                          | std.fs/std.posix    |
| ----------- | -------------------------------- | ------------------- |
| Return Type | `Maybe(T)` with detailed Error   | Generic error union |
| Windows     | Full support with libuv fallback | Limited/POSIX-only  |
| Error Info  | errno, syscall tag, path, fd     | errno only          |
| EINTR       | Automatic retry                  | Manual handling     |

## Error Handling with Maybe(T)

`bun.sys` functions return `Maybe(T)` - a tagged union:

```zig
const sys = bun.sys;

// Pattern 1: Switch on result/error
switch (sys.read(fd, buffer)) {
    .result => |bytes_read| {
        // use bytes_read
    },
    .err => |err| {
        // err.errno, err.syscall, err.fd, err.path
        if (err.getErrno() == .AGAIN) {
            // handle EAGAIN
        }
    },

Validation Details

Front Matter
Required Fields
Valid Name Format
Valid Description
Has Sections
Allowed Tools
Instruction Length:
5727 chars
zig-system-calls | Claude Skills