Sorry, I didn't reviewed the code well. The first diff has some bugs.
As follows the stable diff (please, review):

Index: main.c
===================================================================
RCS file: /cvs/src/usr.bin/mandoc/main.c,v
retrieving revision 1.252
diff -u -p -r1.252 main.c
--- main.c      11 Jun 2020 16:12:14 -0000      1.252
+++ main.c      15 Jun 2020 01:05:12 -0000
@@ -107,8 +107,8 @@ static      void              parse(struct mparse *, in
 static void              passthrough(int, int);
 static void              process_onefile(struct mparse *, struct manpage *,
                                int, struct outstate *, struct manconf *);
-static void              run_pager(struct tag_files *, char *);
-static pid_t             spawn_pager(struct tag_files *, char *);
+static void              run_pager(struct tag_files *, char *, int use_furl);
+static pid_t             spawn_pager(struct tag_files *, char *, int use_furl);
 static void              usage(enum argmode) __attribute__((__noreturn__));
 static int               woptions(char *, enum mandoc_os *, int *);

@@ -140,6 +140,7 @@ main(int argc, char *argv[])
        size_t           i, ib, ssz;
        int              options;       /* Parser options. */
        int              show_usage;    /* Invalid argument: give up. */
+       int              use_furl;      /* Use file:///tmp/man.XXXXXXXX URL 
scheme */
        int              prio, best_prio;
        int              startdir;
        int              c;
@@ -183,6 +184,7 @@ main(int argc, char *argv[])
        options = MPARSE_SO | MPARSE_UTF8 | MPARSE_LATIN1;
        os_e = MANDOC_OS_OTHER;
        os_s = NULL;
+       use_furl = 0;

        /* Formatter options. */

@@ -195,7 +197,7 @@ main(int argc, char *argv[])
        outmode = OUTMODE_DEF;

        while ((c = getopt(argc, argv,
-           "aC:cfhI:iK:klM:m:O:S:s:T:VW:w")) != -1) {
+           "aC:cfhI:iK:klM:m:O:S:s:T:VW:wU")) != -1) {
                if (c == 'i' && search.argmode == ARG_EXPR) {
                        optind--;
                        break;
@@ -301,6 +303,9 @@ main(int argc, char *argv[])
                case 'w':
                        outmode = OUTMODE_FLN;
                        break;
+               case 'U':
+                       use_furl = 1;
+                       break;
                default:
                        show_usage = 1;
                        break;
@@ -621,7 +626,7 @@ out:

        if (outst.tag_files != NULL) {
                if (term_tag_close() != -1)
-                       run_pager(outst.tag_files, conf.output.tag);
+                       run_pager(outst.tag_files, conf.output.tag, use_furl);
                term_tag_unlink();
        } else if (outst.had_output && outst.outtype != OUTT_LINT)
                mandoc_msg_summary();
@@ -639,7 +644,7 @@ usage(enum argmode argmode)
                    "\t      [-T output] [-W level] [file ...]\n", stderr);
                break;
        case ARG_NAME:
-               fputs("usage: man [-acfhklw] [-C file] [-M path] "
+               fputs("usage: man [-acfhklwU] [-C file] [-M path] "
                    "[-m path] [-S subsection]\n"
                    "\t   [[-s] section] name ...\n", stderr);
                break;
@@ -1122,7 +1127,7 @@ woptions(char *arg, enum mandoc_os *os_e
  * then fork the pager and wait for the user to close it.
  */
 static void
-run_pager(struct tag_files *tag_files, char *tag_target)
+run_pager(struct tag_files *tag_files, char *tag_target, int use_furl)
 {
        int      signum, status;
        pid_t    man_pgid, tc_pgid;
@@ -1155,7 +1160,7 @@ run_pager(struct tag_files *tag_files, c
                        (void)tcsetpgrp(STDOUT_FILENO, pager_pid);
                        kill(pager_pid, SIGCONT);
                } else
-                       pager_pid = spawn_pager(tag_files, tag_target);
+                       pager_pid = spawn_pager(tag_files, tag_target, 
use_furl);

                /* Wait for the pager to stop or exit. */

@@ -1176,11 +1181,14 @@ run_pager(struct tag_files *tag_files, c
 }

 static pid_t
-spawn_pager(struct tag_files *tag_files, char *tag_target)
+spawn_pager(struct tag_files *tag_files, char *tag_target, int use_furl)
 {
        const struct timespec timeout = { 0, 100000000 };  /* 0.1s */
 #define MAX_PAGER_ARGS 16
+#define MAX_FILE_TAG   30
+#define MAX_FILE_URL   33 /* 33 is file:///tmp/man.XXXXX...#\0 */
        char            *argv[MAX_PAGER_ARGS];
+       char            ofurl[MAX_FILE_URL + MAX_FILE_TAG];
        const char      *pager;
        char            *cp;
        size_t           cmdlen;
@@ -1230,8 +1238,22 @@ spawn_pager(struct tag_files *tag_files,
                        }
                }
        }
-       if (use_ofn)
-               argv[argc++] = tag_files->ofn;
+
+       if (use_ofn) {
+               if (use_furl) {
+                       strncpy(ofurl, "file://", MAX_FILE_URL);
+                       strncat(ofurl, tag_files->ofn, MAX_FILE_URL);
+                       if (tag_target != NULL) {
+                               ofurl[strlen(ofurl)] = '#';
+                               ofurl[strlen(ofurl) + 1] = 0;
+                               strncat(ofurl, tag_target, MAX_FILE_TAG);
+                       }
+                       argv[argc++] = ofurl;
+               } else {
+                       argv[argc++] = tag_files->ofn;
+               }
+       }
+
        argv[argc] = NULL;

        switch (pager_pid = fork()) {

Reply via email to