sites

public wiki contents of suckless.org
git clone git://git.suckless.org/sites
Log | Files | Refs

commit b6d0694b15d81eb233b8dc369fc83b729b872094
parent 67a785e8fd1d1d0221eee69da625f0ef26e09df2
Author: Страхиња Радић <contact@strahinja.org>
Date:   Sun, 25 Feb 2024 20:25:07 +0100

[st][externalpipe] Fix pledge on OpenBSD

Patch 0.8.4 doesn't spawn the openurlcmd (tested on OpenBSD 7.4) due to
incorrect parameters to pledge. This patch fixes the issue by adding the
parameter "exec" to pledge.

Diffstat:
Mst.suckless.org/patches/externalpipe/index.md | 1+
Ast.suckless.org/patches/externalpipe/st-externalpipe-0.8.5.diff | 104+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 105 insertions(+), 0 deletions(-)

diff --git a/st.suckless.org/patches/externalpipe/index.md b/st.suckless.org/patches/externalpipe/index.md @@ -39,6 +39,7 @@ Download * [st-externalpipe-20181016-3be4cf1.diff](st-externalpipe-20181016-3be4cf1.diff) * [st-externalpipe-0.8.2.diff](st-externalpipe-0.8.2.diff) * [st-externalpipe-0.8.4.diff](st-externalpipe-0.8.4.diff) +* [st-externalpipe-0.8.5.diff](st-externalpipe-0.8.5.diff) When using the scrollback patch, you can apply this patch ontop in order to use externalpipe onto the entire terminal history: diff --git a/st.suckless.org/patches/externalpipe/st-externalpipe-0.8.5.diff b/st.suckless.org/patches/externalpipe/st-externalpipe-0.8.5.diff @@ -0,0 +1,104 @@ +diff --git a/st.c b/st.c +index 034954d..98f2589 100644 +--- a/st.c ++++ b/st.c +@@ -718,8 +718,14 @@ sigchld(int a) + if ((p = waitpid(pid, &stat, WNOHANG)) < 0) + die("waiting for pid %hd failed: %s\n", pid, strerror(errno)); + +- if (pid != p) ++ if (pid != p) { ++ if (p == 0 && wait(&stat) < 0) ++ die("wait: %s\n", strerror(errno)); ++ ++ /* reinstall sigchld handler */ ++ signal(SIGCHLD, sigchld); + return; ++ } + + if (WIFEXITED(stat) && WEXITSTATUS(stat)) + die("child exited with status %d\n", WEXITSTATUS(stat)); +@@ -803,7 +809,7 @@ ttynew(const char *line, char *cmd, const char *out, char **args) + break; + default: + #ifdef __OpenBSD__ +- if (pledge("stdio rpath tty proc", NULL) == -1) ++ if (pledge("stdio rpath tty proc exec", NULL) == -1) + die("pledge\n"); + #endif + close(s); +@@ -1991,6 +1997,59 @@ strparse(void) + } + } + ++void ++externalpipe(const Arg *arg) ++{ ++ int to[2]; ++ char buf[UTF_SIZ]; ++ void (*oldsigpipe)(int); ++ Glyph *bp, *end; ++ int lastpos, n, newline; ++ ++ if (pipe(to) == -1) ++ return; ++ ++ switch (fork()) { ++ case -1: ++ close(to[0]); ++ close(to[1]); ++ return; ++ case 0: ++ dup2(to[0], STDIN_FILENO); ++ close(to[0]); ++ close(to[1]); ++ execvp(((char **)arg->v)[0], (char **)arg->v); ++ fprintf(stderr, "st: execvp %s\n", ((char **)arg->v)[0]); ++ perror("failed"); ++ exit(0); ++ } ++ ++ close(to[0]); ++ /* ignore sigpipe for now, in case child exists early */ ++ oldsigpipe = signal(SIGPIPE, SIG_IGN); ++ newline = 0; ++ for (n = 0; n < term.row; n++) { ++ bp = term.line[n]; ++ lastpos = MIN(tlinelen(n) + 1, term.col) - 1; ++ if (lastpos < 0) ++ break; ++ end = &bp[lastpos + 1]; ++ for (; bp < end; ++bp) ++ if (xwrite(to[1], buf, utf8encode(bp->u, buf)) < 0) ++ break; ++ if ((newline = term.line[n][lastpos].mode & ATTR_WRAP)) ++ continue; ++ if (xwrite(to[1], "\n", 1) < 0) ++ break; ++ newline = 0; ++ } ++ if (newline) ++ (void)xwrite(to[1], "\n", 1); ++ close(to[1]); ++ /* restore */ ++ signal(SIGPIPE, oldsigpipe); ++} ++ + void + strdump(void) + { +diff --git a/st.h b/st.h +index fd3b0d8..754cd08 100644 +--- a/st.h ++++ b/st.h +@@ -81,6 +81,7 @@ void die(const char *, ...); + void redraw(void); + void draw(void); + ++void externalpipe(const Arg *); + void printscreen(const Arg *); + void printsel(const Arg *); + void sendbreak(const Arg *); +-- +2.42.0 +