From 30ee4b609c4ef26d0c915ae66df66e757bae8c2c Mon Sep 17 00:00:00 2001 From: Sebastian Reimers Date: Mon, 17 Aug 2026 09:23:39 +0200 Subject: [PATCH 1/3] mix: add async zip record folder --- include/mix.h | 3 +++ src/mix.c | 46 ++++++++++++++++++++++++++++++++++------------ 2 files changed, 37 insertions(+), 12 deletions(-) diff --git a/include/mix.h b/include/mix.h index 5732148f..bf954885 100644 --- a/include/mix.h +++ b/include/mix.h @@ -51,6 +51,9 @@ struct mix { mix_time_rec_h *time_rec_h; mix_talk_detect_h *talk_detect_h; enum mix_rec rec_state; + char rec_folder_base[PATH_SZ]; + char rec_folder_name[PATH_SZ]; + char rec_folder_full[PATH_SZ]; char path[PATH_SZ]; }; diff --git a/src/mix.c b/src/mix.c index 2c84718b..9e86d498 100644 --- a/src/mix.c +++ b/src/mix.c @@ -1,4 +1,5 @@ #include +#include #include #include @@ -315,12 +316,27 @@ enum mix_rec slmix_rec_state(struct mix *m) } +static int rec_zip_folder(void *arg) +{ + struct mix *m = arg; + char cmd[512]; + + if (!str_isset(m->rec_folder_base) || !str_isset(m->rec_folder_name)) + return EINVAL; + + re_snprintf(cmd, sizeof(cmd), "cd %s && zip -r %s.zip %s", + m->rec_folder_base, m->rec_folder_name, + m->rec_folder_name); + + return system(cmd); +} + + void slmix_record(struct mix *m, enum mix_rec state) { struct tm tm; - time_t now = time(NULL); - char folder[PATH_SZ] = {0}; - int err = 0; + time_t now = time(NULL); + int err = 0; if (!m || !m->video_rec_h || !m->audio_rec_h) { warning("slmix: record init state %s failed\n", @@ -338,27 +354,33 @@ void slmix_record(struct mix *m, enum mix_rec state) } info("slmix: record stopped\n"); + + /* zip files if record was started before */ + if (m->rec_state > REC_DISABLED) + re_thread_async(rec_zip_folder, NULL, m); + goto out; } localtime_r(&now, &tm); - (void)re_snprintf(folder, sizeof(folder), "webui/public/download/%s", - m->token_download); - fs_mkdir(folder, 0755); + (void)re_snprintf(m->rec_folder_base, sizeof(m->rec_folder_base), + "webui/public/download/%s", m->token_download); + fs_mkdir(m->rec_folder_base, 0755); - (void)re_snprintf(folder, sizeof(folder), - "webui/public/download/%s/%H-%s", m->token_download, - timestamp_print, &tm, mix.room); - fs_mkdir(folder, 0755); + (void)re_snprintf(m->rec_folder_name, sizeof(m->rec_folder_name), + "%H-%s", timestamp_print, &tm, m->room); + (void)re_snprintf(m->rec_folder_full, sizeof(m->rec_folder_full), + "%s/%s", m->rec_folder_base, m->rec_folder_name); + fs_mkdir(m->rec_folder_full, 0755); if (state & REC_VIDEO) { - err = m->video_rec_h(folder, true); + err = m->video_rec_h(m->rec_folder_full, true); } if (state & REC_AUDIO) { - err |= m->audio_rec_h(folder, true); + err |= m->audio_rec_h(m->rec_folder_full, true); } if (err) { From 88f4baa1bcdff6b30ae8a87bb3fc8e0dc0d09e43 Mon Sep 17 00:00:00 2001 From: Sebastian Reimers Date: Mon, 17 Aug 2026 10:21:09 +0200 Subject: [PATCH 2/3] wip --- include/mix.h | 10 +++++++--- src/mix.c | 55 ++++++++++++++++++++++++++++++++------------------- 2 files changed, 42 insertions(+), 23 deletions(-) diff --git a/include/mix.h b/include/mix.h index bf954885..fd9d298d 100644 --- a/include/mix.h +++ b/include/mix.h @@ -51,12 +51,16 @@ struct mix { mix_time_rec_h *time_rec_h; mix_talk_detect_h *talk_detect_h; enum mix_rec rec_state; - char rec_folder_base[PATH_SZ]; - char rec_folder_name[PATH_SZ]; - char rec_folder_full[PATH_SZ]; + struct mix_rec_s { + char base[PATH_SZ]; + char name[PATH_SZ]; + char full[PATH_SZ]; + } rec; char path[PATH_SZ]; }; + + struct user { char id[USERID_SZ]; int pidx; /* Video position index, 0 => disabled */ diff --git a/src/mix.c b/src/mix.c index 9e86d498..be1ff939 100644 --- a/src/mix.c +++ b/src/mix.c @@ -1,6 +1,6 @@ #include -#include #include +#include #include extern const char *GIT_TAG; @@ -318,17 +318,25 @@ enum mix_rec slmix_rec_state(struct mix *m) static int rec_zip_folder(void *arg) { - struct mix *m = arg; - char cmd[512]; + struct mix_rec_s *r = arg; + int status; - if (!str_isset(m->rec_folder_base) || !str_isset(m->rec_folder_name)) + if (!str_isset(r->base) || !str_isset(r->name)) { + mem_deref(r); return EINVAL; + } - re_snprintf(cmd, sizeof(cmd), "cd %s && zip -r %s.zip %s", - m->rec_folder_base, m->rec_folder_name, - m->rec_folder_name); - - return system(cmd); + pid_t pid = fork(); + if (pid == 0) { + chdir(r->base); + char zipname[PATH_SZ]; + re_snprintf(zipname, sizeof(zipname), "%s.zip", r->name); + execlp("zip", "zip", "-r", zipname, r->name, (char *)NULL); + _exit(127); + } + waitpid(pid, &status, 0); + mem_deref(r); + return status; } @@ -356,31 +364,38 @@ void slmix_record(struct mix *m, enum mix_rec state) info("slmix: record stopped\n"); /* zip files if record was started before */ - if (m->rec_state > REC_DISABLED) - re_thread_async(rec_zip_folder, NULL, m); + if (m->rec_state > REC_DISABLED) { + struct mix_rec_s *r = + mem_zalloc(sizeof(struct mix_rec_s), NULL); + if (!r) + goto out; + + *r = m->rec; + re_thread_async(rec_zip_folder, NULL, r); + } goto out; } localtime_r(&now, &tm); - (void)re_snprintf(m->rec_folder_base, sizeof(m->rec_folder_base), + (void)re_snprintf(m->rec.base, sizeof(m->rec.base), "webui/public/download/%s", m->token_download); - fs_mkdir(m->rec_folder_base, 0755); + fs_mkdir(m->rec.base, 0755); - (void)re_snprintf(m->rec_folder_name, sizeof(m->rec_folder_name), - "%H-%s", timestamp_print, &tm, m->room); + (void)re_snprintf(m->rec.name, sizeof(m->rec.name), "%H-%s", + timestamp_print, &tm, m->room); - (void)re_snprintf(m->rec_folder_full, sizeof(m->rec_folder_full), - "%s/%s", m->rec_folder_base, m->rec_folder_name); - fs_mkdir(m->rec_folder_full, 0755); + (void)re_snprintf(m->rec.full, sizeof(m->rec.full), "%s/%s", + m->rec.base, m->rec.name); + fs_mkdir(m->rec.full, 0755); if (state & REC_VIDEO) { - err = m->video_rec_h(m->rec_folder_full, true); + err = m->video_rec_h(m->rec.full, true); } if (state & REC_AUDIO) { - err |= m->audio_rec_h(m->rec_folder_full, true); + err |= m->audio_rec_h(m->rec.full, true); } if (err) { From f85e32619232aef83974568f089f1bb84b91dd11 Mon Sep 17 00:00:00 2001 From: Sebastian Reimers Date: Mon, 17 Aug 2026 10:30:53 +0200 Subject: [PATCH 3/3] wip --- src/mix.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/mix.c b/src/mix.c index be1ff939..f93688aa 100644 --- a/src/mix.c +++ b/src/mix.c @@ -327,8 +327,14 @@ static int rec_zip_folder(void *arg) } pid_t pid = fork(); - if (pid == 0) { - chdir(r->base); + if (pid < 0) { + warning("slmix: fork failed for zip: %m\n", errno); + mem_deref(r); + return errno; + } + else if (pid == 0) { + if (chdir(r->base) != 0) + _exit(126); char zipname[PATH_SZ]; re_snprintf(zipname, sizeof(zipname), "%s.zip", r->name); execlp("zip", "zip", "-r", zipname, r->name, (char *)NULL); @@ -336,7 +342,7 @@ static int rec_zip_folder(void *arg) } waitpid(pid, &status, 0); mem_deref(r); - return status; + return WEXITSTATUS(status); }