From a7f7d4a488c8d3b2461122765f9904c8a411a583 Mon Sep 17 00:00:00 2001
From: Brian Ashworth <bosrsf04@gmail.com>
Date: Thu, 2 Aug 2018 21:37:29 -0400
Subject: Write to swaynag pipe fd directly on config errors

---
 sway/swaynag.c | 103 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 103 insertions(+)
 create mode 100644 sway/swaynag.c

(limited to 'sway/swaynag.c')

diff --git a/sway/swaynag.c b/sway/swaynag.c
new file mode 100644
index 00000000..2dc0cb21
--- /dev/null
+++ b/sway/swaynag.c
@@ -0,0 +1,103 @@
+#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"
+
+void swaynag_clone(struct swaynag_instance *dest,
+		struct swaynag_instance *src) {
+	dest->args = src->args;
+	dest->pid = src->pid;
+	dest->fd[0] = src->fd[0];
+	dest->fd[1] = src->fd[1];
+	dest->detailed = src->detailed;
+}
+
+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]);
+	}
+}
+
-- 
cgit v1.2.3


From 36fd84cc42ebb2933d24c2d3d4b84f3f32f065b0 Mon Sep 17 00:00:00 2001
From: Brian Ashworth <bosrsf04@gmail.com>
Date: Fri, 3 Aug 2018 10:40:09 -0400
Subject: Remove swaynag_clone and use memcpy

---
 include/sway/swaynag.h | 4 ----
 sway/config.c          | 5 +++--
 sway/swaynag.c         | 9 ---------
 3 files changed, 3 insertions(+), 15 deletions(-)

(limited to 'sway/swaynag.c')

diff --git a/include/sway/swaynag.h b/include/sway/swaynag.h
index ac0086a1..5a178739 100644
--- a/include/sway/swaynag.h
+++ b/include/sway/swaynag.h
@@ -8,10 +8,6 @@ struct swaynag_instance {
 	bool detailed;
 };
 
-// Copy all fields of one instance to another
-void swaynag_clone(struct swaynag_instance *dest,
-		struct swaynag_instance *src);
-
 // Spawn swaynag. If swaynag->detailed, then swaynag->fd[1] will left open
 // so it can be written to. Call swaynag_show when done writing. This will
 // be automatically called by swaynag_log if the instance is not spawned and
diff --git a/sway/config.c b/sway/config.c
index 4464b006..c1ec77f9 100644
--- a/sway/config.c
+++ b/sway/config.c
@@ -386,8 +386,9 @@ bool load_main_config(const char *file, bool is_active, bool validating) {
 		config->active = true;
 
 		swaynag_kill(&old_config->swaynag_config_errors);
-		swaynag_clone(&config->swaynag_config_errors,
-				&old_config->swaynag_config_errors);
+		memcpy(&config->swaynag_config_errors,
+				&old_config->swaynag_config_errors,
+				sizeof(struct swaynag_instance));
 
 		create_default_output_configs();
 	}
diff --git a/sway/swaynag.c b/sway/swaynag.c
index 2dc0cb21..f5370807 100644
--- a/sway/swaynag.c
+++ b/sway/swaynag.c
@@ -8,15 +8,6 @@
 #include "log.h"
 #include "sway/swaynag.h"
 
-void swaynag_clone(struct swaynag_instance *dest,
-		struct swaynag_instance *src) {
-	dest->args = src->args;
-	dest->pid = src->pid;
-	dest->fd[0] = src->fd[0];
-	dest->fd[1] = src->fd[1];
-	dest->detailed = src->detailed;
-}
-
 bool swaynag_spawn(const char *swaynag_command,
 		struct swaynag_instance *swaynag) {
 	if (swaynag->detailed) {
-- 
cgit v1.2.3