/** Test with: echo "hello" | nc -U /tmp/ptracedev_search.sock */ reload_run :: () { my_context := context; my_context.logger = my_logger; push_context,defer_pop my_context; socket_init(); server_s := socket(AF_UNIX, .STREAM, 0); defer { close_and_reset(*server_s); unlink(FP_SOCKET_RELOAD); log("Server shutdown gracefully"); } if server_s < 0 { socket_log_error(); exit(1); } addr: sockaddr_un; addr.sun_family = AF_UNIX; memcpy(addr.sun_path.data, FP_SOCKET_RELOAD.data, FP_SOCKET_RELOAD.count); unlink(FP_SOCKET_RELOAD); tv: timeval; tv.tv_sec = TIMEOUT_SEC; tv.tv_usec = 0; setsockopt(server_s, SOL_SOCKET, SO_RCVTIMEO, *tv, size_of(type_of(tv))); if bind(server_s, cast(*sockaddr)*addr, size_of(sockaddr_un)) < 0 { socket_log_error(); exit(1); } if listen(server_s, BACKLOG) < 0 { socket_log_error(); exit(1); } log("Listening to '%'", FP_SOCKET_RELOAD); buffer: [BUFFER_MAX+1]u8; n: int; push_allocator(temp); while !is_ipc_offline { reset_temporary_storage(); client_s, client_addr := accept(server_s); defer close_and_reset(*client_s); if client_s < 0 { if errno() == { case EAGAIN; continue; case EINTR; continue; case; socket_log_error(); assert(false, "Client Socket"); continue; } } while true { n = recv(client_s, buffer.data, BUFFER_MAX, 0); /** Omitting error reporting for this tiny, and not critical module. */ if n == 0 break; if n < 0 break; if n > BUFFER_MAX break; if buffer[0] == 0 break; if n != BUFFER_MAX break; } request := string.{ n, buffer.data }; if trim(to_lower_copy(request)) == "reload" { log("Reloading"); load_blog_data(,, context.default_allocator); log("Reload done!"); } } } reload_server_shutdown_clean :: () { is_ipc_offline = true; } #scope_file #import "Socket"; #import "POSIX"; BACKLOG :: 5; BUFFER_MAX :: 256; TIMEOUT_SEC :: 1; sockaddr_un :: struct { sun_family: u16; sun_path: [108]u8; /** Limit defined in un.h */ } my_logger :: #bake_arguments base_logger(prefix="Reload");