Please don't do this.
Ingo Schwarze <schwa...@usta.de> wrote: > Hi Stuart, > > Stuart Henderson wrote on Fri, Oct 29, 2021 at 01:59:38PM +0100: > > On 2021/10/29 14:08, Ingo Schwarze wrote: > >> Stuart Henderson wrote on Fri, Oct 29, 2021 at 10:53:41AM +0100: > >>> On 2021/10/28 23:19, Klemens Nanni wrote: > >>>> On Fri, Oct 29, 2021 at 12:57:54AM +0200, Ingo Schwarze wrote: > > >>>>> MANPAGER=firefox man -T html $(ifconfig -C) > > >>>> This doesn't work if firefox is already running as the MANPAGER firefox > >>>> process exits immediately after sending the file/link to the running > >>>> process, which causes mandoc to exit after removing the temporary file, > >>>> by which time firefox fails to open the no longer exiting file. > > >>> I use mutt_bgrun for things like this > > >> I don't see how that can possibly help. > > > Oh, of course you're right - I was confused between my helper > > scripts. The one I actually use for html in mutt looks like this, > > so it's not any user for MANPAGER.. > > > > tmp=`mktemp -d /tmp/mutthtml.XXXXXXXXX` || exit 1 > > mhonarc -rcfile ~/.m2h_rcfile -single > $tmp/mail.html > > (chrome $tmp/mail.html 2>/dev/null; sleep 30; rm -r $tmp) & > > Indeed, if i added sleep(30) to the place in question > in usr.bin/mandoc/main.c, i would expect quite an outrage... > A protest rally on my front lawn or something like that... > > Then again, the man(1) process that is about to exit could maybe fork > a child before exiting. The parent exiting right away makes sure that > the user gets back their shell prompt instantly after exiting the pager. > The child process, now being in the background, could sleep a few seconds > before deleting the temporary output files, then exit, too. > > This does appear to successfully work around the firefox bug. > With the patch below, "MANPAGER=firefox man -T html ..." > now works reliably for me. > > It does seem somewhat ugly, though, so i'm not sure whether i should > commit it. In particular, fork(2)ing merely to go to the background > seems both cumbersome and expensive - admittedly, your script cited > above does the same, but that doesn't imply i have to like that, right? > > Is there a cleaner way to let man(1) go into the background and > let the shell offer a fresh prompt while man(1) still sleeps, > without needing to fork(2)? > > Yours, > Ingo > > > Index: main.c > =================================================================== > RCS file: /cvs/src/usr.bin/mandoc/main.c,v > retrieving revision 1.262 > diff -u -p -r1.262 main.c > --- main.c 4 Oct 2021 21:28:50 -0000 1.262 > +++ main.c 29 Oct 2021 14:12:08 -0000 > @@ -1203,6 +1203,7 @@ woptions(char *arg, enum mandoc_os *os_e > static void > run_pager(struct outstate *outst, char *tag_target) > { > + const struct timespec delay = { 5, 0 }; > int signum, status; > pid_t man_pgid, tc_pgid; > pid_t pager_pid, wait_pid; > @@ -1245,13 +1246,16 @@ run_pager(struct outstate *outst, char * > if (wait_pid == -1) { > mandoc_msg(MANDOCERR_WAIT, 0, 0, > "%s", strerror(errno)); > - break; > + return; > } > if (!WIFSTOPPED(status)) > break; > > signum = WSTOPSIG(status); > } > + if (fork() > 0) > + _exit(mandoc_msg_getrc()); > + nanosleep(&delay, NULL); > } > > static pid_t >