diff options
| author | Robby Zambito <contact@robbyzambito.me> | 2026-01-17 21:38:11 -0500 |
|---|---|---|
| committer | Robby Zambito <contact@robbyzambito.me> | 2026-01-17 21:38:23 -0500 |
| commit | a33a96dafd4c483f08ad3876d1a90cd18ab12c43 (patch) | |
| tree | b07fa68c58382a28cd399848a2caaf05b9211863 | |
| parent | 1a817df18d096b01d3436c8caa218f6e19a3904f (diff) | |
start doing packet stuffzig-master
| -rw-r--r-- | src/main.zig | 43 |
1 files changed, 40 insertions, 3 deletions
diff --git a/src/main.zig b/src/main.zig index 064dcea..ad4d76b 100644 --- a/src/main.zig +++ b/src/main.zig @@ -52,7 +52,7 @@ pub fn main(init: std.process.Init) !void { flags.relay = args[i]; } else { std.debug.print("-r/--relay requires a string\n", .{}); - return; + return error.InvalidArguments; } }, .dest => { @@ -61,7 +61,7 @@ pub fn main(init: std.process.Init) !void { flags.dest = args[i]; } else { std.debug.print("-d/--dest requires a string\n", .{}); - return; + return error.InvalidArguments; } }, .connect => { @@ -70,20 +70,54 @@ pub fn main(init: std.process.Init) !void { flags.connect = args[i]; } else { std.debug.print("-c/--connect requires a string\n", .{}); - return; + return error.InvalidArguments; } }, } } else { std.debug.print("Unknown argument: {s}\n", .{args[i]}); + return error.InvalidArguments; } } } + if (flags.connect != null and (flags.relay != null or flags.dest != null)) { + std.debug.print("Incompatible arguments.\nCannot use --connect/-c with dest or relay.\n", .{}); + return error.InvalidArguments; + } + std.debug.print("relay: {s}\n", .{flags.relay orelse "<null>"}); std.debug.print("dest: {s}\n", .{flags.dest orelse "<null>"}); std.debug.print("connect: {s}\n", .{flags.connect orelse "<null>"}); + // const net_interface: std.Io.net.Interface = .{ .index = 1 }; + // std.debug.print("Interface: {s}\n", .{(try net_interface.name(init.io)).toSlice()}); + + const linux_socket = blk: { + const linux_socket = std.os.linux.socket(AF.PACKET, SOCK.RAW, 0); + const errno = std.os.linux.errno(linux_socket); + if (errno != .SUCCESS) { + std.debug.log("Failed to open socket: {t}\n", .{errno}); + return error.Error; // TODO: better error + } + break :blk linux_socket; + }; + const socket_fd = blk: { + const socket_fd = std.os.linux.bind(linux_socket, @bitCast(std.os.linux.sockaddr.ll{ + .protocol = , + .ifindex = 1, + .hatype = , + .pkttype = , + .halen = , + .addr = @splat(0), + }), @sizeOf(std.os.linux.sockaddr.ll)); + }; + const ip: std.Io.net.IpAddress = .{ .ip4 = .unspecified(0) }; + const socket = try ip.bind(init.io, .{ .mode = .raw, .protocol = .raw }); + defer socket.close(init.io); + + try socket.send(init.io, &.{ .ip4 = try .parse("255.255.255.255", 8888) }, "foo"); + // var sock_buffer: [1500]u8 = undefined; // var raw_socket_writer: RawSocketWriter = try .init("enp7s0", &sock_buffer); // /proc/net/dev // var net_buffer: [1500]u8 = undefined; @@ -135,4 +169,7 @@ const zaprus = @import("zaprus"); const SaprusClient = zaprus.Client; const SaprusMessage = zaprus.Message; const RawSocketWriter = zaprus.RawSocketWriter; + +const AF = std.os.linux.AF; +const SOCK = std.os.linux.SOCK; // const NetWriter = zaprus.NetWriter; |
