input domain parsing

This commit is contained in:
Muaz Ahmad 2024-05-10 14:23:57 +05:00
parent 54560fc91a
commit b9f42d2ed2
2 changed files with 34 additions and 4 deletions

View file

@ -1,8 +1,8 @@
const std = @import("std"); const std = @import("std");
const util = @import("util.zig"); const util = @import("util.zig");
pub fn get_mdns(domain: [:0]const u8) !util.IPs { pub fn get_mdns(domain: util.Domain) !util.IPs {
std.debug.print("{s}\n", .{domain}); std.debug.print("{}\n", .{domain});
return util.IPs{ return util.IPs{
.v4 = "stub v4", .v4 = "stub v4",
.v6 = "stub v6", .v6 = "stub v6",

View file

@ -1,15 +1,45 @@
const std = @import("std"); const std = @import("std");
const ArgError = error{
NotEnoughArgs,
BadDomain,
};
pub const IPs = struct { pub const IPs = struct {
v4: [:0]const u8, v4: [:0]const u8,
v6: [:0]const u8, v6: [:0]const u8,
}; };
pub const Domain = struct {
name: [:0]const u8,
labels: u8,
};
pub fn check_perms() !void { pub fn check_perms() !void {
var f = try std.fs.openFileAbsolute("/etc/hosts", .{ .mode = .write_only }); var f = try std.fs.openFileAbsolute("/etc/hosts", .{ .mode = .write_only });
f.close(); f.close();
} }
pub fn get_input() ![:0]const u8 { pub fn get_input() !Domain {
return "stub"; var args = std.process.args();
_ = args.next();
const domain = args.next() orelse return ArgError.NotEnoughArgs;
return check_domain(domain);
}
fn check_domain(domain_str: [:0]const u8) !Domain {
var domain = Domain{
.name = domain_str,
.labels = 0,
};
var labels = std.mem.split(u8, domain_str, ".");
var last: []const u8 = "";
while (labels.next()) |segment| {
last = segment;
domain.labels += 1;
}
if (domain.labels <= 1 or !std.mem.eql(u8, last, "local")) {
return ArgError.BadDomain;
}
return domain;
} }