srctree

Gregory Mullen parent 7330d625 533838db
refactor #1

src/main.zig added: 97, removed: 34, total 63
@@ -10,12 +10,48 @@ const zWSGI = @import("zwsgi.zig");
 
const HOST = "127.0.0.1";
const PORT = 2000;
const FILE = "./srctree.sock";
 
test "main" {
std.testing.refAllDecls(@This());
_ = HTML.html(&[0]HTML.Element{});
}
 
var print_mutex = std.Thread.Mutex{};
 
pub fn print(comptime format: []const u8, args: anytype) !void {
print_mutex.lock();
defer print_mutex.unlock();
 
const out = std.io.getStdOut().writer();
try out.print(format, args);
}
 
var arg0: []const u8 = undefined;
 
fn usage(long: bool) noreturn {
print(
\\{s} [type]
\\
\\ help, usage -h, --help : this message
\\
\\ unix : unix socket [default]
\\ http : http server
\\
, .{arg0}) catch std.process.exit(255);
if (long) {}
std.process.exit(0);
}
 
const RunMode = enum {
unix,
http,
other,
stop,
};
 
var runmode: RunMode = .unix;
 
pub fn main() !void {
var gpa = std.heap.GeneralPurposeAllocator(.{ .stack_trace_frames = 12 }){};
defer _ = gpa.deinit();
@@ -24,40 +60,67 @@ pub fn main() !void {
Template.init(a);
defer Template.raze();
 
var usock = std.net.StreamServer.init(.{});
const FILE = "./srctree.sock";
 
var cwd = std.fs.cwd();
if (cwd.access(FILE, .{})) {
try cwd.deleteFile(FILE);
} else |_| {}
 
const uaddr = try std.net.Address.initUnix(FILE);
try usock.listen(uaddr);
std.log.info("Unix server listening\n", .{});
 
var path = try std.fs.cwd().realpathAlloc(a, FILE);
var zpath = try a.dupeZ(u8, path);
a.free(path);
var mode = std.os.linux.chmod(zpath, 0o777);
if (false) std.debug.print("mode {o}\n", .{mode});
defer a.free(zpath);
 
try zWSGI.serve(a, &usock);
usock.close();
 
var srv = Server.init(a, .{ .reuse_address = true });
 
const addr = std.net.Address.parseIp(HOST, PORT) catch unreachable;
try srv.listen(addr);
std.log.info("Server listening\n", .{});
 
HTTP.serve(a, &srv) catch {
if (@errorReturnTrace()) |trace| {
std.debug.dumpStackTrace(trace.*);
var args = std.process.args();
arg0 = args.next() orelse "tree";
while (args.next()) |arg| {
if (std.mem.eql(u8, arg, "-h") or
std.mem.eql(u8, arg, "--help") or
std.mem.eql(u8, arg, "help") or
std.mem.eql(u8, arg, "usage"))
{
usage(!std.mem.eql(u8, arg, "-h"));
} else if (std.mem.eql(u8, arg, "unix")) {
runmode = .unix;
} else if (std.mem.eql(u8, arg, "http")) {
runmode = .http;
} else {
try print("unknown arg '{s}'", .{arg});
}
std.os.exit(1);
};
}
 
switch (runmode) {
.unix => {
var cwd = std.fs.cwd();
if (cwd.access(FILE, .{})) {
try cwd.deleteFile(FILE);
} else |_| {}
 
const uaddr = try std.net.Address.initUnix(FILE);
var usock = std.net.StreamServer.init(.{});
try usock.listen(uaddr);
defer usock.close();
 
var path = try std.fs.cwd().realpathAlloc(a, FILE);
defer a.free(path);
var zpath = try a.dupeZ(u8, path);
defer a.free(zpath);
var mode = std.os.linux.chmod(zpath, 0o777);
if (false) std.debug.print("mode {o}\n", .{mode});
try print("Unix server listening\n", .{});
 
zWSGI.serve(a, &usock) catch {
if (@errorReturnTrace()) |trace| {
std.debug.dumpStackTrace(trace.*);
}
std.os.exit(1);
};
},
.http => {
var srv = Server.init(a, .{ .reuse_address = true });
 
const addr = std.net.Address.parseIp(HOST, PORT) catch unreachable;
try srv.listen(addr);
try print("HTTP Server listening\n", .{});
 
HTTP.serve(a, &srv) catch {
if (@errorReturnTrace()) |trace| {
std.debug.dumpStackTrace(trace.*);
}
std.os.exit(1);
};
},
else => {},
}
}
 
test "simple test" {