On 2023/03/27 18:58:07 -0600, Todd C. Miller <mill...@openbsd.org> wrote: > On Mon, 27 Mar 2023 20:06:30 +0200, Omar Polo wrote: > > > Is _PATH_BSHELL portable though? I can see a few stuff that uses it > > (vi among others) but I'm not sure. > > The paths.h header is a BSD invention, though it may be present on > some other systems. I don't think that's a reason not to use it > though. > > > Also, if you look at the callers of shellcmdoutput() they all prepare > > the argv array as {"sh", "-c", "command provided", NULL} so I'm > > wondering if we should just ignore $SHELL and always use /bin/sh, or > > change that "sh" accordingly to $SHELL. > > It might be best to use the basename of the actual shell for argv[0]. > Our ksh for instance has slightly different behavior when invoked > as sh.
like this? :) (need an up-to-date tree since it builds on the previous, committed, diff.) I've tested with ksh and csh. I guess it's fine to assume the user' shell has a -c flag. (vi does the same.) Thanks! Index: region.c =================================================================== RCS file: /cvs/src/usr.bin/mg/region.c,v retrieving revision 1.43 diff -u -p -r1.43 region.c --- region.c 28 Mar 2023 08:01:40 -0000 1.43 +++ region.c 28 Mar 2023 08:17:30 -0000 @@ -34,7 +34,7 @@ static int iomux(int, char * const, int, static int preadin(int, struct buffer *); static void pwriteout(int, char **, int *); static int setsize(struct region *, RSIZE); -static int shellcmdoutput(char * const[], char * const, int); +static int shellcmdoutput(char * const, char * const, int); /* * Kill the region. Ask "getregion" to figure out the bounds of the region. @@ -415,7 +415,6 @@ piperegion(int f, int n) struct region region; int len; char *cmd, cmdbuf[NFILEN], *text; - char *argv[] = {"sh", "-c", (char *) NULL, (char *) NULL}; /* C-u M-| is not supported yet */ if (n > 1) @@ -431,8 +430,6 @@ piperegion(int f, int n) EFNEW | EFCR)) == NULL || (cmd[0] == '\0')) return (ABORT); - argv[2] = cmd; - if (getregion(®ion) != TRUE) return (FALSE); @@ -446,7 +443,7 @@ piperegion(int f, int n) region_get_data(®ion, text, len); - return shellcmdoutput(argv, text, len); + return shellcmdoutput(cmd, text, len); } /* @@ -456,7 +453,6 @@ int shellcommand(int f, int n) { char *cmd, cmdbuf[NFILEN]; - char *argv[] = {"sh", "-c", (char *) NULL, (char *) NULL}; if (n > 1) return (ABORT); @@ -465,16 +461,15 @@ shellcommand(int f, int n) EFNEW | EFCR)) == NULL || (cmd[0] == '\0')) return (ABORT); - argv[2] = cmd; - - return shellcmdoutput(argv, NULL, 0); + return shellcmdoutput(cmd, NULL, 0); } int -shellcmdoutput(char* const argv[], char* const text, int len) +shellcmdoutput(char* const cmd, char* const text, int len) { struct buffer *bp; - char *shellp; + char *argv[] = {NULL, "-c", cmd, NULL}; + char *shellp, *shell; int ret; bp = bfind("*Shell Command Output*", TRUE); @@ -486,6 +481,10 @@ shellcmdoutput(char* const argv[], char* if ((shellp = getenv("SHELL")) == NULL) shellp = _PATH_BSHELL; + + if ((shell = strrchr(shellp, '/')) == NULL) + shell = shellp; + argv[0] = shell; ret = pipeio(shellp, argv, text, len, bp);