summaryrefslogtreecommitdiff
path: root/src/fruits/cmsrv
diff options
context:
space:
mode:
authorAndrew Opalach <andrew@akon.city> 2026-09-07 15:06:14 -0400
committerAndrew Opalach <andrew@akon.city> 2026-09-07 15:06:14 -0400
commitc66c7c64ebd16287b892f8a780cffcabafba3799 (patch)
treeb2195902ef055147878b591cf1171be7e6133c97 /src/fruits/cmsrv
parent1758ae9e860bd3b65b661e3c804288c3599f4fd4 (diff)
downloadcamu-c66c7c64ebd16287b892f8a780cffcabafba3799.tar.gz
camu-c66c7c64ebd16287b892f8a780cffcabafba3799.tar.bz2
camu-c66c7c64ebd16287b892f8a780cffcabafba3799.zip
Better OSD behavior, lots of build stuff
Signed-off-by: Andrew Opalach <andrew@akon.city>
Diffstat (limited to 'src/fruits/cmsrv')
-rw-r--r--src/fruits/cmsrv/cmsrv.c76
1 files changed, 54 insertions, 22 deletions
diff --git a/src/fruits/cmsrv/cmsrv.c b/src/fruits/cmsrv/cmsrv.c
index b0793d1..452254b 100644
--- a/src/fruits/cmsrv/cmsrv.c
+++ b/src/fruits/cmsrv/cmsrv.c
@@ -30,6 +30,7 @@ struct cmsrv {
struct nn_line_processor cli;
} local;
#endif
+ bool use_ui;
#ifdef CMSRV_USE_UI
struct cmsrv_ui ui;
struct nn_poll input_poll;
@@ -43,14 +44,27 @@ static void close_cmsrv(struct cmsrv *s)
nn_line_processor_stop(&s->local.cli);
#endif
#ifdef CMSRV_USE_UI
- nn_poll_stop(&s->input_poll);
- nn_timer_stop(&s->render_timer);
+ if (s->use_ui) {
+ nn_poll_stop(&s->input_poll);
+ nn_timer_stop(&s->render_timer);
+ }
#endif
camu_server_close(&s->server);
nn_signal_stop(&s->quit_signal);
}
#ifdef CMSRV_LOCAL_SOCKET
+static inline void try_parse_arg_from_line(str *line, u32 offset, s32 *n)
+{
+ str arg = al_str_substr(line, offset, line->length);
+ bool error;
+ s64 i = al_str_to_long(&arg, 10, &error);
+ if (!error) {
+ if (*n < 0) i = -i;
+ *n = CLAMP(i, (s64)INT32_MIN, (s64)INT32_MAX);
+ }
+}
+
static u8 server_line_callback(void *userdata, str *line)
{
struct cmsrv *s = (struct cmsrv *)userdata;
@@ -60,19 +74,13 @@ static u8 server_line_callback(void *userdata, str *line)
} else if (al_str_cmp(line, &al_str_c(";NEXT"), 0, 5) == 0) {
s32 n = 1;
if (line->length > 6) {
- str arg = al_str_substr(line, 6, line->length);
- bool error;
- s64 i = al_str_to_long(&arg, 10, &error);
- if (!error) n = CLAMP(i, (s64)INT32_MIN, (s64)INT32_MAX);
+ try_parse_arg_from_line(line, 6, &n);
}
lia_list_skip(list, LIANA_SEQUENCE_ANY, n);
} else if (al_str_cmp(line, &al_str_c(";PREV"), 0, 5) == 0) {
s32 n = -1;
if (line->length > 6) {
- str arg = al_str_substr(line, 6, line->length);
- bool error;
- s64 i = -al_str_to_long(&arg, 10, &error);
- if (!error) n = CLAMP(i, (s64)INT32_MIN, (s64)INT32_MAX);
+ try_parse_arg_from_line(line, 6, &n);
}
lia_list_skip(list, LIANA_SEQUENCE_ANY, n);
} else if (al_str_cmp(line, &al_str_c(";SEEK"), 0, 5) == 0) {
@@ -93,8 +101,18 @@ static u8 server_line_callback(void *userdata, str *line)
lia_list_reverse(list);
} else if (al_str_eq(line, &al_str_c(";CLEAR"))) {
lia_list_clear(list);
+ } else if (al_str_cmp(line, &al_str_c(";START_AT"), 0, 9) == 0) {
+ if (line->length > 6) {
+ s32 n = 0;
+ try_parse_arg_from_line(line, 10, &n);
+ if (n > 0) {
+ camu_server_local_start_at(&s->server, n);
+ }
+ }
} else if (al_str_eq(line, &al_str_c(";DISCONNECT"))) {
lia_server_force_disconnect_nodes(&s->server.data.server);
+ } else if (al_str_eq(line, &al_str_c(";QUIT"))) {
+ close_cmsrv(s);
} else {
struct nn_packet *packet = nn_packet_create();
nn_packet_write_str(packet, line);
@@ -156,10 +174,17 @@ static void quit_signal_callback(void *userdata)
static struct cmsrv s = { 0 };
+static bool sigint_force = false;
static void sigint_handler(s32 signum)
{
(void)signum;
- nn_signal_send(&s.quit_signal);
+ if (sigint_force) {
+ exit(128 + SIGINT);
+ } else {
+ nn_signal_send(&s.quit_signal);
+ log_warn("Attempting graceful exit. ^C again to force exit.");
+ sigint_force = true;
+ }
}
#ifdef NAUNET_ON_WINDOWS
@@ -172,11 +197,16 @@ s32 main(s32 argc, char *argv[])
return EXIT_FAILURE;
}
+ s.use_ui = false;
#ifdef CMSRV_USE_UI
- if (!cmsrv_ui_init(&s.ui, &s.server)) {
- return EXIT_FAILURE;
+ char *CMSRV_UI = getenv("CMSRV_UI");
+ if (CMSRV_UI) s.use_ui = al_strscmp(CMSRV_UI, "1") == 0;
+ if (s.use_ui) {
+ if (!cmsrv_ui_init(&s.ui, &s.server)) {
+ return EXIT_FAILURE;
+ }
+ al_set_print(log_callback, &s);
}
- al_set_print(log_callback, &s);
#endif
#ifdef CAMU_HAVE_FFMPEG
@@ -194,7 +224,7 @@ s32 main(s32 argc, char *argv[])
if (CMSRV_IP) addr = al_str_cr(CMSRV_IP);
log_info("Serving from %.*s.", al_str_x(&addr));
- camu_server_init(&s.server, &s.loop);
+ camu_server_init(&s.server, &s.loop, false);
if (!camu_server_listen(&s.server, NNWT_SOCKET_TCP, &addr, CAMU_PORT)) {
return EXIT_FAILURE;
}
@@ -212,12 +242,14 @@ s32 main(s32 argc, char *argv[])
#endif
#ifdef CMSRV_USE_UI
- nn_poll_init(&s.input_poll, input_poll_callback, &s);
- nn_poll_set(&s.input_poll, cmsrv_ui_get_input_fd(&s.ui), NNWT_POLL_READ);
- nn_poll_start(&s.input_poll, &s.loop);
- nn_timer_init(&s.render_timer, &s.loop, render_timer_callback, &s);
- nn_timer_set_repeat(&s.render_timer, NNWT_TS_FROM_USEC(100000));
- nn_timer_again(&s.render_timer);
+ if (s.use_ui) {
+ nn_poll_init(&s.input_poll, input_poll_callback, &s);
+ nn_poll_set(&s.input_poll, cmsrv_ui_get_input_fd(&s.ui), NNWT_POLL_READ);
+ nn_poll_start(&s.input_poll, &s.loop);
+ nn_timer_init(&s.render_timer, &s.loop, render_timer_callback, &s);
+ nn_timer_set_repeat(&s.render_timer, NNWT_TS_FROM_USEC(100000));
+ nn_timer_again(&s.render_timer);
+ }
#endif
nn_event_loop_run(&s.loop);
@@ -226,7 +258,7 @@ s32 main(s32 argc, char *argv[])
nn_socket_close(&s.local.sock);
#endif
#ifdef CMSRV_USE_UI
- cmsrv_ui_close(&s.ui);
+ if (s.use_ui) cmsrv_ui_close(&s.ui);
#endif
camu_server_free(&s.server);
nn_event_loop_destroy(&s.loop);