Logo

index : blog

---

  • summary
  • about
  • tree
  • log
  • branches
<< path: root/public/blog.git/html/src/search/reload.jai blob: 4a84d2b9c298284a3c245203a77c7aec982564ab [raw] [clear marker]

        
0
1
2/** Test with:
3
4 echo "hello" | nc -U /tmp/ptracedev_search.sock
5
6*/
7
8
9reload_run :: () {
10 my_context := context;
11 my_context.logger = my_logger;
12
13 push_context,defer_pop my_context;
14
15 socket_init();
16 server_s := socket(AF_UNIX, .STREAM, 0);
17 defer {
18 close_and_reset(*server_s);
19 unlink(FP_SOCKET_RELOAD);
20 log("Server shutdown gracefully");
21 }
22
23 if server_s < 0 {
24 socket_log_error();
25 exit(1);
26 }
27
28 addr: sockaddr_un;
29 addr.sun_family = AF_UNIX;
30
31 memcpy(addr.sun_path.data, FP_SOCKET_RELOAD.data, FP_SOCKET_RELOAD.count);
32
33 unlink(FP_SOCKET_RELOAD);
34
35 tv: timeval;
36 tv.tv_sec = TIMEOUT_SEC;
37 tv.tv_usec = 0;
38
39 setsockopt(server_s, SOL_SOCKET, SO_RCVTIMEO, *tv, size_of(type_of(tv)));
40
41 if bind(server_s, cast(*sockaddr)*addr, size_of(sockaddr_un)) < 0 {
42 socket_log_error();
43 exit(1);
44 }
45
46 if listen(server_s, BACKLOG) < 0 {
47 socket_log_error();
48 exit(1);
49 }
50
51 log("Listening to '%'", FP_SOCKET_RELOAD);
52
53 buffer: [BUFFER_MAX+1]u8;
54 n: int;
55
56 push_allocator(temp);
57 while !is_ipc_offline {
58 reset_temporary_storage();
59
60 client_s, client_addr := accept(server_s);
61 defer close_and_reset(*client_s);
62
63 if client_s < 0 {
64 if errno() == {
65 case EAGAIN; continue;
66 case EINTR; continue;
67 case;
68 socket_log_error();
69 assert(false, "Client Socket");
70 continue;
71 }
72 }
73
74 while true {
75 n = recv(client_s, buffer.data, BUFFER_MAX, 0);
76
77 /** Omitting error reporting for this tiny, and not
78 critical module.
79 */
80
81 if n == 0 break;
82 if n < 0 break;
83 if n > BUFFER_MAX break;
84 if buffer[0] == 0 break;
85 if n != BUFFER_MAX break;
86 }
87
88 request := string.{ n, buffer.data };
89
90 if trim(to_lower_copy(request)) == "reload" {
91 log("Reloading");
92 load_blog_data(,, context.default_allocator);
93 log("Reload done!");
94 }
95 }
96}
97
98reload_server_shutdown_clean :: () {
99 is_ipc_offline = true;
100}
101
102
103#scope_file
104
105
106#import "Socket";
107#import "POSIX";
108
109
110BACKLOG :: 5;
111BUFFER_MAX :: 256;
112TIMEOUT_SEC :: 1;
113
114
115sockaddr_un :: struct {
116 sun_family: u16;
117 sun_path: [108]u8; /** Limit defined in un.h */
118}
119
120
121my_logger :: #bake_arguments base_logger(prefix="Reload");
122
123
Copyright 2026  E766CB298A6D1E64 | Git-Thing heavily inspired by cgit