summaryrefslogtreecommitdiffstats
path: root/sway/swaynag.c
diff options
context:
space:
mode:
Diffstat (limited to 'sway/swaynag.c')
-rw-r--r--sway/swaynag.c94
1 files changed, 94 insertions, 0 deletions
diff --git a/sway/swaynag.c b/sway/swaynag.c
new file mode 100644
index 00000000..f5370807
--- /dev/null
+++ b/sway/swaynag.c
@@ -0,0 +1,94 @@
1#include <fcntl.h>
2#include <signal.h>
3#include <stdbool.h>
4#include <stdlib.h>
5#include <stdio.h>
6#include <sys/types.h>
7#include <unistd.h>
8#include "log.h"
9#include "sway/swaynag.h"
10
11bool swaynag_spawn(const char *swaynag_command,
12 struct swaynag_instance *swaynag) {
13 if (swaynag->detailed) {
14 if (pipe(swaynag->fd) != 0) {
15 wlr_log(WLR_ERROR, "Failed to create pipe for swaynag");
16 return false;
17 }
18 fcntl(swaynag->fd[1], F_SETFD, FD_CLOEXEC);
19 }
20
21 pid_t pid;
22 if ((pid = fork()) == 0) {
23 if (swaynag->detailed) {
24 close(swaynag->fd[1]);
25 dup2(swaynag->fd[0], STDIN_FILENO);
26 close(swaynag->fd[0]);
27 }
28
29 size_t length = strlen(swaynag_command) + strlen(swaynag->args) + 2;
30 char *cmd = malloc(length);
31 snprintf(cmd, length, "%s %s", swaynag_command, swaynag->args);
32 execl("/bin/sh", "/bin/sh", "-c", cmd, NULL);
33 _exit(0);
34 } else if (pid < 0) {
35 wlr_log(WLR_ERROR, "Failed to create fork for swaynag");
36 if (swaynag->detailed) {
37 close(swaynag->fd[0]);
38 close(swaynag->fd[1]);
39 }
40 return false;
41 }
42
43 if (swaynag->detailed) {
44 close(swaynag->fd[0]);
45 }
46 swaynag->pid = pid;
47 return true;
48}
49
50
51void swaynag_kill(struct swaynag_instance *swaynag) {
52 if (swaynag->pid > 0) {
53 kill(swaynag->pid, SIGTERM);
54 swaynag->pid = -1;
55 }
56}
57
58void swaynag_log(const char *swaynag_command, struct swaynag_instance *swaynag,
59 const char *fmt, ...) {
60 if (!swaynag->detailed) {
61 wlr_log(WLR_ERROR, "Attempting to write to non-detailed swaynag inst");
62 return;
63 }
64
65 if (swaynag->pid <= 0 && !swaynag_spawn(swaynag_command, swaynag)) {
66 return;
67 }
68
69 va_list args;
70 va_start(args, fmt);
71 size_t length = vsnprintf(NULL, 0, fmt, args) + 1;
72 va_end(args);
73
74 char *temp = malloc(length + 1);
75 if (!temp) {
76 wlr_log(WLR_ERROR, "Failed to allocate buffer for swaynag log entry.");
77 return;
78 }
79
80 va_start(args, fmt);
81 vsnprintf(temp, length, fmt, args);
82 va_end(args);
83
84 write(swaynag->fd[1], temp, length);
85
86 free(temp);
87}
88
89void swaynag_show(struct swaynag_instance *swaynag) {
90 if (swaynag->detailed && swaynag->pid > 0) {
91 close(swaynag->fd[1]);
92 }
93}
94