[wiki] [sites] [st][externalpipe] Fix pledge on OpenBSD || Страхиња Радић

From: <git_AT_suckless.org>
Date: Sun, 25 Feb 2024 20:30:24 +0100

commit b6d0694b15d81eb233b8dc369fc83b729b872094
Author: Страхиња Радић <contact_AT_strahinja.org>
Date: Sun Feb 25 20:25:07 2024 +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.

diff --git a/st.suckless.org/patches/externalpipe/index.md b/st.suckless.org/patches/externalpipe/index.md
index c1c62cb1..a82c6394 100644
--- a/st.suckless.org/patches/externalpipe/index.md
+++ b/st.suckless.org/patches/externalpipe/index.md
_AT_@ -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
new file mode 100644
index 00000000..daf91d31
--- /dev/null
+++ b/st.suckless.org/patches/externalpipe/st-externalpipe-0.8.5.diff
_AT_@ -0,0 +1,104 @@
+diff --git a/st.c b/st.c
+index 034954d..98f2589 100644
+--- a/st.c
++++ b/st.c
+_AT_@ -718,8 +718,14 @@ sigchld(int a)
+ if ((p = waitpid(pid, &stat, WNOHANG)) < 0)
+ die("waiting for pid %hd failed: %s
", pid, strerror(errno));
+
+- if (pid != p)
++ if (pid != p) {
++ if (p == 0 && wait(&stat) < 0)
++ die("wait: %s
", strerror(errno));
++
++ /* reinstall sigchld handler */
++ signal(SIGCHLD, sigchld);
+ return;
++ }
+
+ if (WIFEXITED(stat) && WEXITSTATUS(stat))
+ die("child exited with status %d
", WEXITSTATUS(stat));
+_AT_@ -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
");
+ #endif
+ close(s);
+_AT_@ -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
", ((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], "
", 1) < 0)
++ break;
++ newline = 0;
++ }
++ if (newline)
++ (void)xwrite(to[1], "
", 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
+_AT_@ -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
+
Received on Sun Feb 25 2024 - 20:30:24 CET

This archive was generated by hypermail 2.3.0 : Sun Feb 25 2024 - 20:36:49 CET