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