aboutsummaryrefslogtreecommitdiff
path: root/src/main.zig
diff options
context:
space:
mode:
authorRobby Zambito <contact@robbyzambito.me>2026-02-01 20:57:58 -0500
committerRobby Zambito <contact@robbyzambito.me>2026-02-01 21:02:39 -0500
commitd1ca448835aed0699b6e5cb8bd03aee0dd05344e (patch)
treea3849cfed74d339ca1e7c400ba492d7fbce6ca5a /src/main.zig
parentf554e7a3bb472c2a8b9e123a7f8ca19a036ba4ac (diff)
parent2c9e648c2c9c487c0239760bff23a70c059f018f (diff)
Release v0.2.00.2.0
Diffstat (limited to 'src/main.zig')
-rw-r--r--src/main.zig52
1 files changed, 49 insertions, 3 deletions
diff --git a/src/main.zig b/src/main.zig
index 07fe9e2..10dca33 100644
--- a/src/main.zig
+++ b/src/main.zig
@@ -1,3 +1,19 @@
+// Copyright 2026 Robby Zambito
+//
+// This file is part of zaprus.
+//
+// Zaprus is free software: you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the Free Software
+// Foundation, either version 3 of the License, or (at your option) any later
+// version.
+//
+// Zaprus is distributed in the hope that it will be useful, but WITHOUT ANY
+// WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
+// A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along with
+// Zaprus. If not, see <https://www.gnu.org/licenses/>.
+
const is_debug = builtin.mode == .Debug;
const help =
@@ -162,7 +178,37 @@ pub fn main(init: std.process.Init) !void {
.stdout = .pipe,
.stderr = .ignore,
.stdin = .ignore,
- }) catch continue;
+ }) catch |err| switch (err) {
+ error.AccessDenied,
+ error.FileBusy,
+ error.FileNotFound,
+ error.FileSystem,
+ error.InvalidExe,
+ error.IsDir,
+ error.NotDir,
+ error.OutOfMemory,
+ error.PermissionDenied,
+ error.SymLinkLoop,
+ error.SystemResources,
+ => blk: {
+ log.debug("Trying to execute command directly: {s}", .{connection_payload});
+ var argv_buf: [128][]const u8 = undefined;
+ var argv: ArrayList([]const u8) = .initBuffer(&argv_buf);
+ var payload_iter = std.mem.splitAny(u8, connection_payload, " \t\n");
+ while (payload_iter.next()) |arg| argv.appendBounded(arg) catch continue;
+ break :blk std.process.spawn(init.io, .{
+ .argv = argv.items,
+ .stdout = .pipe,
+ .stderr = .ignore,
+ .stdin = .ignore,
+ }) catch continue;
+ },
+ error.Canceled,
+ error.NoDevice,
+ error.OperationUnsupported,
+ => |e| return e,
+ else => continue,
+ };
var child_output_buf: [SaprusClient.max_payload_len]u8 = undefined;
var child_output_reader = child.stdout.?.reader(init.io, &child_output_buf);
@@ -184,7 +230,7 @@ pub fn main(init: std.process.Init) !void {
error.EndOfStream => {
cmd_output.print("{b64}", .{child_output_reader.interface.buffered()}) catch unreachable;
if (cmd_output.end > 0) {
- connection.send(init.io, cmd_output.buffered()) catch |e| {
+ connection.send(init.io, .{}, cmd_output.buffered()) catch |e| {
log.debug("Failed to send connection chunk: {t}", .{e});
continue :next_message;
};
@@ -193,7 +239,7 @@ pub fn main(init: std.process.Init) !void {
},
};
cmd_output.print("{b64}", .{try child_output_reader.interface.takeArray(child_output_buf.len)}) catch unreachable;
- connection.send(init.io, cmd_output.buffered()) catch |err| {
+ connection.send(init.io, .{}, cmd_output.buffered()) catch |err| {
log.debug("Failed to send connection chunk: {t}", .{err});
continue :next_message;
};