aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHimbeer <himbeer@disroot.org>2024-08-01 19:06:44 +0200
committerHimbeer <himbeer@disroot.org>2024-08-01 19:06:44 +0200
commit21654e0a7ded9d5370c5468807d7d18e3c101320 (patch)
tree8b2a030c8e3bfff7b1cbfe3b4af5ea6793af73d7
parent62aa03dc95b98e85716f3836f2baa2b0611454c3 (diff)
channel: Allow anonymous transmissions
-rw-r--r--src/channel.zig4
-rw-r--r--src/syscall.zig9
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