diff options
author | Himbeer <himbeer@disroot.org> | 2024-08-01 19:06:44 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-08-01 19:06:44 +0200 |
commit | 21654e0a7ded9d5370c5468807d7d18e3c101320 (patch) | |
tree | 8b2a030c8e3bfff7b1cbfe3b4af5ea6793af73d7 | |
parent | 62aa03dc95b98e85716f3836f2baa2b0611454c3 (diff) |
channel: Allow anonymous transmissions
-rw-r--r-- | src/channel.zig | 4 | ||||
-rw-r--r-- | src/syscall.zig | 9 |
2 files changed, 7 insertions, 6 deletions
diff --git a/src/channel.zig b/src/channel.zig index b3084b8..061331e 100644 --- a/src/channel.zig +++ b/src/channel.zig @@ -57,14 +57,14 @@ pub fn leave(pid: u16, id: usize) void { } // The channel takes ownership of `bytes`. -pub fn pass(pid: u16, id: usize, receiver: u16, bytes: []const u8) !void { +pub fn pass(pid: u16, id: usize, receiver: u16, identify: bool, bytes: []const u8) !void { const message = try alloc.create(Message); defer message.dropReference(); message.* = .{ .bytes = bytes, .process_filter = receiver, - .sender = pid, + .sender = if (identify) pid else 0, }; var it = joined.iterator(); diff --git a/src/syscall.zig b/src/syscall.zig index e8a2f89..79959cd 100644 --- a/src/syscall.zig +++ b/src/syscall.zig @@ -165,19 +165,20 @@ fn leave(proc: *const process.Info, trap_frame: *const TrapFrame) void { channel.leave(proc.id, id); } -// pass(channel: usize, receiver: u16, bytes: [*]const u8, len: usize) !void +// pass(channel: usize, receiver: u16, identify: bool, bytes: [*]const u8, len: usize) !void fn pass(proc: *const process.Info, trap_frame: *const TrapFrame) !void { const id = trap_frame.general_purpose_registers[10]; const receiver_wide = trap_frame.general_purpose_registers[11]; - const bytes_ptr: [*]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[12]); - const len = trap_frame.general_purpose_registers[13]; + const identify: bool = trap_frame.general_purpose_registers[12] != 0; + const bytes_ptr: [*]const u8 = @ptrFromInt(trap_frame.general_purpose_registers[13]); + const len = trap_frame.general_purpose_registers[14]; const receiver = std.math.cast(u16, receiver_wide) orelse return ArgumentError.OutOfRange; const bytes = bytes_ptr[0..len]; const copy = try channel.allocator().alloc(u8, bytes.len); @memcpy(copy, bytes); - try channel.pass(proc.id, id, receiver, copy); + try channel.pass(proc.id, id, receiver, identify, copy); } // receive(channel: usize, sender: ?*u16, buffer: [*]u8, len: usize) !usize |