aboutsummaryrefslogtreecommitdiff
path: root/sway/swaynag.c
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2018-08-03 15:08:38 -0400
committerGitHub <noreply@github.com>2018-08-03 15:08:38 -0400
commit38675eba7be471a2dacb5928f54d046297c23517 (patch)
tree7982d1f38fcb3620372c1c8461de1450063e5355 /sway/swaynag.c
parent3e2bf7f3a550db995a38808e0abd53fefab96f80 (diff)
parent36fd84cc42ebb2933d24c2d3d4b84f3f32f065b0 (diff)
downloadsway-38675eba7be471a2dacb5928f54d046297c23517.tar.xz
Merge pull request #2400 from RedSoxFan/swaynag-config-errors
Show swaynag on config errors
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 @@
+#include <fcntl.h>
+#include <signal.h>
+#include <stdbool.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <sys/types.h>
+#include <unistd.h>
+#include "log.h"
+#include "sway/swaynag.h"
+
+bool swaynag_spawn(const char *swaynag_command,
+ struct swaynag_instance *swaynag) {
+ if (swaynag->detailed) {
+ if (pipe(swaynag->fd) != 0) {
+ wlr_log(WLR_ERROR, "Failed to create pipe for swaynag");
+ return false;
+ }
+ fcntl(swaynag->fd[1], F_SETFD, FD_CLOEXEC);
+ }
+
+ pid_t pid;
+ if ((pid = fork()) == 0) {
+ if (swaynag->detailed) {
+ close(swaynag->fd[1]);
+ dup2(swaynag->fd[0], STDIN_FILENO);
+ close(swaynag->fd[0]);
+ }
+
+ size_t length = strlen(swaynag_command) + strlen(swaynag->args) + 2;
+ char *cmd = malloc(length);
+ snprintf(cmd, length, "%s %s", swaynag_command, swaynag->args);
+ execl("/bin/sh", "/bin/sh", "-c", cmd, NULL);
+ _exit(0);
+ } else if (pid < 0) {
+ wlr_log(WLR_ERROR, "Failed to create fork for swaynag");
+ if (swaynag->detailed) {
+ close(swaynag->fd[0]);
+ close(swaynag->fd[1]);
+ }
+ return false;
+ }
+
+ if (swaynag->detailed) {
+ close(swaynag->fd[0]);
+ }
+ swaynag->pid = pid;
+ return true;
+}
+
+
+void swaynag_kill(struct swaynag_instance *swaynag) {
+ if (swaynag->pid > 0) {
+ kill(swaynag->pid, SIGTERM);
+ swaynag->pid = -1;
+ }
+}
+
+void swaynag_log(const char *swaynag_command, struct swaynag_instance *swaynag,
+ const char *fmt, ...) {
+ if (!swaynag->detailed) {
+ wlr_log(WLR_ERROR, "Attempting to write to non-detailed swaynag inst");
+ return;
+ }
+
+ if (swaynag->pid <= 0 && !swaynag_spawn(swaynag_command, swaynag)) {
+ return;
+ }
+
+ va_list args;
+ va_start(args, fmt);
+ size_t length = vsnprintf(NULL, 0, fmt, args) + 1;
+ va_end(args);
+
+ char *temp = malloc(length + 1);
+ if (!temp) {
+ wlr_log(WLR_ERROR, "Failed to allocate buffer for swaynag log entry.");
+ return;
+ }
+
+ va_start(args, fmt);
+ vsnprintf(temp, length, fmt, args);
+ va_end(args);
+
+ write(swaynag->fd[1], temp, length);
+
+ free(temp);
+}
+
+void swaynag_show(struct swaynag_instance *swaynag) {
+ if (swaynag->detailed && swaynag->pid > 0) {
+ close(swaynag->fd[1]);
+ }
+}
+