summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorawy <awy@awy.one>2025-09-09 00:40:46 +0300
committerawy <awy@awy.one>2025-09-09 00:40:46 +0300
commit796c9495a537b17bb985e9950ae0fdec123c12f1 (patch)
tree60085f09d647cf66712304a2369fe833982881a5
parent16dedf761958b7812f3c471e59e20e1714de1d0f (diff)
add stmpdupHEADmaster
-rw-r--r--Makefile3
-rw-r--r--src/stmpdup.c119
2 files changed, 122 insertions, 0 deletions
diff --git a/Makefile b/Makefile
index c51f3b4..d8239c0 100644
--- a/Makefile
+++ b/Makefile
@@ -17,6 +17,9 @@ $(BINDIR):
$(BINDIR)/stmusic: $(SRCDIR)/stmusic.c | $(BINDIR)
$(CC) $(CFLAGS) -o $@ $< -lmpdclient
+$(BINDIR)/stmpdup: $(SRCDIR)/stmpdup.c | $(BINDIR)
+ $(CC) $(CFLAGS) -o $@ lib/util.c $< -lmpdclient
+
$(BINDIR)/sttorrent: $(SRCDIR)/sttorrent.c | $(BINDIR)
$(CC) $(CFLAGS) -o $@ lib/util.c lib/cjson/cJSON.c $< -lcurl
diff --git a/src/stmpdup.c b/src/stmpdup.c
new file mode 100644
index 0000000..b724157
--- /dev/null
+++ b/src/stmpdup.c
@@ -0,0 +1,119 @@
+/* Copyright (C) 2025 awy <awy@awy.one>
+
+ stmpdup is free software: you can redistribute it and/or
+ modify it under the terms of the GNU General Public License
+ as published by the Free Software Foundation,
+ either version 3 of the License, or (at your option) any later version.
+
+ stmpdup is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ General Public License for more details.
+
+ You should have received a copy of the GNU General Public
+ License along with stmpdup. If not, see
+ <https://www.gnu.org/licenses/>. */
+
+/* cmd_idle and cmd_idleloop functions are taken from the
+ MPC <https://github.com/MusicPlayerDaemon/mpc> */
+
+#define _POSIX_C_SOURCE 200112L
+#include <ctype.h>
+#include <mpd/client.h>
+#include <signal.h>
+#include <stdbool.h>
+#include <stdio.h>
+#include <dirent.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "../lib/util.h"
+
+int
+find_pid_by_name(const char *process_name)
+{
+ DIR *dir = opendir("/proc");
+ if (!dir) return -1;
+
+ struct dirent *entry;
+ while ((entry = readdir(dir)) != NULL) {
+ if (!isdigit(entry->d_name[0])) continue;
+
+ char path[256], name[256];
+ snprintf(path, sizeof(path), "/proc/%s/comm", entry->d_name);
+
+ FILE *fp = fopen(path, "r");
+ if (!fp) continue;
+
+ if (fgets(name, sizeof(name), fp)) {
+ name[strcspn(name, "\n")] = 0;
+ if (strcmp(name, process_name) == 0) {
+ fclose(fp);
+ closedir(dir);
+ return atoi(entry->d_name);
+ }
+ }
+ fclose(fp);
+ }
+ closedir(dir);
+ return -1;
+}
+
+
+int cmd_idle(struct mpd_connection *connection)
+{
+ enum mpd_idle idle = 0;
+ pid_t wbarpid;
+
+ idle = idle == 0 ? mpd_run_idle(connection)
+ : mpd_run_idle_mask(connection, idle);
+ if (idle == 0 &&
+ mpd_connection_get_error(connection) != MPD_ERROR_SUCCESS)
+ printf("error");
+
+ for (unsigned j = 0;; ++j) {
+ enum mpd_idle i = 1 << j;
+ const char *name = mpd_idle_name(i);
+
+ if (name == NULL)
+ break;
+
+ if (idle & i) {
+ wbarpid = find_pid_by_name("waybar");
+ if (wbarpid == -1)
+ die("no waybar running");
+
+ kill(wbarpid, SIGRTMIN+11);
+ }
+
+ }
+
+ return 0;
+}
+
+int
+cmd_idleloop(struct mpd_connection *connection)
+{
+ while (true) {
+ int ret = cmd_idle(connection);
+ fflush(stdout);
+ if (ret != 0)
+ return ret;
+ }
+}
+
+int
+main(void)
+{
+ struct mpd_connection *conn;
+
+ conn = mpd_connection_new(NULL, 0, 30000);
+ if (mpd_connection_get_error(conn) != MPD_ERROR_SUCCESS) {
+ fprintf(stderr, "MPD connection error: %s\n",
+ mpd_connection_get_error_message(conn));
+ return 1;
+ }
+
+ cmd_idleloop(conn);
+ return 0;
+}