From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailout.scc.kit.edu (mailout.scc.kit.edu [129.13.185.202]) by krisdoz.my.domain (8.14.5/8.14.5) with ESMTP id q4ONeKAS028579 for ; Thu, 24 May 2012 19:40:21 -0400 (EDT) Received: from hekate.usta.de (asta-nat.asta.uni-karlsruhe.de [172.22.63.82]) by scc-mailout-02.scc.kit.edu with esmtp (Exim 4.72 #1) id 1SXhdi-0005MZ-NJ; Fri, 25 May 2012 01:40:18 +0200 Received: from donnerwolke.usta.de ([172.24.96.3]) by hekate.usta.de with esmtp (Exim 4.77) (envelope-from ) id 1SXhdi-0007vv-NC for tech@mdocml.bsd.lv; Fri, 25 May 2012 01:40:18 +0200 Received: from iris.usta.de ([172.24.96.5] helo=usta.de) by donnerwolke.usta.de with esmtp (Exim 4.72) (envelope-from ) id 1SXhdi-0005Jg-L7 for tech@mdocml.bsd.lv; Fri, 25 May 2012 01:40:18 +0200 Received: from schwarze by usta.de with local (Exim 4.77) (envelope-from ) id 1SXhdi-0006Gl-9W for tech@mdocml.bsd.lv; Fri, 25 May 2012 01:40:18 +0200 Date: Fri, 25 May 2012 01:40:17 +0200 From: Ingo Schwarze To: tech@mdocml.bsd.lv Subject: Support -Ios='OpenBSD 5.1' to override uname(3) Message-ID: <20120524234017.GA15573@iris.usta.de> X-Mailinglist: mdocml-tech Reply-To: tech@mdocml.bsd.lv MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline User-Agent: Mutt/1.5.21 (2010-09-15) Hi Kristaps, Bob Beck definitely wanted this for man.cgi, so i have put it into OpenBSD. I'd like to push it upstream, as well; i think the problem occurs in general as soon as you want to serve manuals from multiple operating systems or releases from the same server. OK? Ingo ----- Forwarded message from Ingo Schwarze ----- From: Ingo Schwarze Date: Thu, 24 May 2012 17:33:23 -0600 (MDT) To: source-changes@cvs.openbsd.org Subject: CVS: cvs.openbsd.org: src CVSROOT: /cvs Module name: src Changes by: schwarze@cvs.openbsd.org 2012/05/24 17:33:23 Modified files: usr.bin/mandoc : libmandoc.h libmdoc.h main.c mandoc.1 mandoc.h mandocdb.c mdoc.c mdoc_validate.c read.c Log message: Support -Ios='OpenBSD 5.1' to override uname(3) as the source of the default value for the mdoc(7) .Os macro. Needed for man.cgi on the OpenBSD website. Problem with man.cgi first noticed by deraadt@; beck@ and deraadt@ agree with the way to solve the issue. ----- End forwarded message ----- Index: libmandoc.h =================================================================== RCS file: /cvs/src/usr.bin/mandoc/libmandoc.h,v retrieving revision 1.16 diff -u -p -r1.16 libmandoc.h --- libmandoc.h 2 Dec 2011 01:45:43 -0000 1.16 +++ libmandoc.h 24 May 2012 23:22:31 -0000 @@ -52,7 +52,7 @@ int mandoc_strntoi(const char *, size_ const char *mandoc_a2msec(const char*); void mdoc_free(struct mdoc *); -struct mdoc *mdoc_alloc(struct roff *, struct mparse *); +struct mdoc *mdoc_alloc(struct roff *, struct mparse *, char *); void mdoc_reset(struct mdoc *); int mdoc_parseln(struct mdoc *, int, char *, int); int mdoc_endparse(struct mdoc *); Index: libmdoc.h =================================================================== RCS file: /cvs/src/usr.bin/mandoc/libmdoc.h,v retrieving revision 1.48 diff -u -p -r1.48 libmdoc.h --- libmdoc.h 2 Dec 2011 01:45:43 -0000 1.48 +++ libmdoc.h 24 May 2012 23:22:31 -0000 @@ -24,6 +24,7 @@ enum mdoc_next { struct mdoc { struct mparse *parse; /* parse pointer */ + char *defos; /* default argument for .Os */ int flags; /* parse flags */ #define MDOC_HALT (1 << 0) /* error in parse: halt */ #define MDOC_LITERAL (1 << 1) /* in a literal scope */ Index: main.c =================================================================== RCS file: /cvs/src/usr.bin/mandoc/main.c,v retrieving revision 1.82 diff -u -p -r1.82 main.c --- main.c 25 Dec 2011 17:34:57 -0000 1.82 +++ main.c 24 May 2012 23:22:31 -0000 @@ -1,7 +1,7 @@ /* $Id: main.c,v 1.82 2011/12/25 17:34:57 schwarze Exp $ */ /* * Copyright (c) 2008, 2009, 2010, 2011 Kristaps Dzonsons - * Copyright (c) 2010, 2011 Ingo Schwarze + * Copyright (c) 2010, 2011, 2012 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -79,6 +79,7 @@ main(int argc, char *argv[]) struct curparse curp; enum mparset type; enum mandoclevel rc; + char *defos; progname = strrchr(argv[0], '/'); if (progname == NULL) @@ -98,10 +99,24 @@ main(int argc, char *argv[]) type = MPARSE_AUTO; curp.outtype = OUTT_ASCII; curp.wlevel = MANDOCLEVEL_FATAL; + defos = NULL; /* LINTED */ - while (-1 != (c = getopt(argc, argv, "m:O:T:VW:"))) + while (-1 != (c = getopt(argc, argv, "I:m:O:T:VW:"))) switch (c) { + case ('I'): + if (strncmp(optarg, "os=", 3)) { + fprintf(stderr, "-I%s: Bad argument\n", + optarg); + return((int)MANDOCLEVEL_BADARG); + } + if (defos) { + fprintf(stderr, "-I%s: Duplicate argument\n", + optarg); + return((int)MANDOCLEVEL_BADARG); + } + defos = mandoc_strdup(optarg + 3); + break; case ('m'): if ( ! moptions(&type, optarg)) return((int)MANDOCLEVEL_BADARG); @@ -126,7 +141,7 @@ main(int argc, char *argv[]) /* NOTREACHED */ } - curp.mp = mparse_alloc(type, curp.wlevel, mmsg, &curp); + curp.mp = mparse_alloc(type, curp.wlevel, mmsg, &curp, defos); /* * Conditionally start up the lookaside buffer before parsing. @@ -153,6 +168,7 @@ main(int argc, char *argv[]) (*curp.outfree)(curp.outdata); if (curp.mp) mparse_free(curp.mp); + free(defos); return((int)rc); } Index: mandoc.1 =================================================================== RCS file: /cvs/src/usr.bin/mandoc/mandoc.1,v retrieving revision 1.53 diff -u -p -r1.53 mandoc.1 --- mandoc.1 25 Dec 2011 20:15:54 -0000 1.53 +++ mandoc.1 24 May 2012 23:22:32 -0000 @@ -23,6 +23,9 @@ .Sh SYNOPSIS .Nm mandoc .Op Fl V +.Sm off +.Op Fl I Cm os Li = Ar name +.Sm on .Op Fl m Ns Ar format .Op Fl O Ns Ar option .Op Fl T Ns Ar output @@ -49,6 +52,15 @@ output. .Pp The arguments are as follows: .Bl -tag -width Ds +.Sm off +.It Fl I Cm os Li = Ar name +.Sm on +Override the default operating system +.Ar name +for the +.Xr mdoc 7 +.Sq \&Os +macro. .It Fl m Ns Ar format Input format. See Index: mandoc.h =================================================================== RCS file: /cvs/src/usr.bin/mandoc/mandoc.h,v retrieving revision 1.43 diff -u -p -r1.43 mandoc.h --- mandoc.h 12 Nov 2011 22:43:18 -0000 1.43 +++ mandoc.h 24 May 2012 23:22:32 -0000 @@ -413,8 +413,8 @@ int mchars_spec2cp(const struct mchar const char *, size_t); const char *mchars_spec2str(const struct mchars *, const char *, size_t, size_t *); -struct mparse *mparse_alloc(enum mparset, - enum mandoclevel, mandocmsg, void *); +struct mparse *mparse_alloc(enum mparset, enum mandoclevel, + mandocmsg, void *, char *); void mparse_free(struct mparse *); void mparse_keep(struct mparse *); enum mandoclevel mparse_readfd(struct mparse *, int, const char *); Index: mandocdb.c =================================================================== RCS file: /cvs/src/usr.bin/mandoc/mandocdb.c,v retrieving revision 1.41 diff -u -p -r1.41 mandocdb.c --- mandocdb.c 18 Apr 2012 01:41:41 -0000 1.41 +++ mandocdb.c 24 May 2012 23:22:32 -0000 @@ -374,7 +374,7 @@ mandocdb(int argc, char *argv[]) info.lorder = 4321; info.flags = R_DUP; - mp = mparse_alloc(MPARSE_AUTO, MANDOCLEVEL_FATAL, NULL, NULL); + mp = mparse_alloc(MPARSE_AUTO, MANDOCLEVEL_FATAL, NULL, NULL, NULL); memset(&buf, 0, sizeof(struct buf)); memset(&dbuf, 0, sizeof(struct buf)); Index: mdoc.c =================================================================== RCS file: /cvs/src/usr.bin/mandoc/mdoc.c,v retrieving revision 1.86 diff -u -p -r1.86 mdoc.c --- mdoc.c 30 Sep 2011 00:13:21 -0000 1.86 +++ mdoc.c 24 May 2012 23:22:32 -0000 @@ -193,13 +193,14 @@ mdoc_free(struct mdoc *mdoc) * Allocate volatile and non-volatile parse resources. */ struct mdoc * -mdoc_alloc(struct roff *roff, struct mparse *parse) +mdoc_alloc(struct roff *roff, struct mparse *parse, char *defos) { struct mdoc *p; p = mandoc_calloc(1, sizeof(struct mdoc)); p->parse = parse; + p->defos = defos; p->roff = roff; mdoc_hash_init(); Index: mdoc_validate.c =================================================================== RCS file: /cvs/src/usr.bin/mandoc/mdoc_validate.c,v retrieving revision 1.101 diff -u -p -r1.101 mdoc_validate.c --- mdoc_validate.c 15 Apr 2012 10:31:00 -0000 1.101 +++ mdoc_validate.c 24 May 2012 23:22:33 -0000 @@ -1,7 +1,7 @@ /* $Id: mdoc_validate.c,v 1.101 2012/04/15 10:31:00 schwarze Exp $ */ /* * Copyright (c) 2008-2012 Kristaps Dzonsons - * Copyright (c) 2010, 2011 Ingo Schwarze + * Copyright (c) 2010, 2011, 2012 Ingo Schwarze * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -2188,14 +2188,15 @@ post_os(POST_ARGS) n = mdoc->last; /* - * Set the operating system by way of the `Os' macro. Note that - * if an argument isn't provided and -DOSNAME="\"foo\"" is - * provided during compilation, this value will be used instead - * of filling in "sysname release" from uname(). + * Set the operating system by way of the `Os' macro. + * The order of precedence is: + * 1. the argument of the `Os' macro, unless empty + * 2. the -Ios=foo command line argument, if provided + * 3. -DOSNAME="\"foo\"", if provided during compilation + * 4. "sysname release" from uname(3) */ - if (mdoc->meta.os) - free(mdoc->meta.os); + free(mdoc->meta.os); buf[0] = '\0'; if (-1 == (c = concat(buf, n->child, BUFSIZ))) { @@ -2205,11 +2206,11 @@ post_os(POST_ARGS) assert(c); - /* XXX: yes, these can all be dynamically-adjusted buffers, but - * it's really not worth the extra hackery. - */ - if ('\0' == buf[0]) { + if (mdoc->defos) { + mdoc->meta.os = mandoc_strdup(mdoc->defos); + return(1); + } #ifdef OSNAME if (strlcat(buf, OSNAME, BUFSIZ) >= BUFSIZ) { mdoc_nmsg(mdoc, n, MANDOCERR_MEM); Index: read.c =================================================================== RCS file: /cvs/src/usr.bin/mandoc/read.c,v retrieving revision 1.6 diff -u -p -r1.6 read.c --- read.c 26 Feb 2012 21:01:43 -0000 1.6 +++ read.c 24 May 2012 23:22:33 -0000 @@ -54,6 +54,7 @@ struct mparse { void *arg; /* argument to mmsg */ const char *file; struct buf *secondary; + char *defos; /* default operating system */ }; static void resize_buf(struct buf *, size_t); @@ -236,7 +237,8 @@ pset(const char *buf, int pos, struct mp switch (curp->inttype) { case (MPARSE_MDOC): if (NULL == curp->pmdoc) - curp->pmdoc = mdoc_alloc(curp->roff, curp); + curp->pmdoc = mdoc_alloc(curp->roff, curp, + curp->defos); assert(curp->pmdoc); curp->mdoc = curp->pmdoc; return; @@ -252,7 +254,8 @@ pset(const char *buf, int pos, struct mp if (pos >= 3 && 0 == memcmp(buf, ".Dd", 3)) { if (NULL == curp->pmdoc) - curp->pmdoc = mdoc_alloc(curp->roff, curp); + curp->pmdoc = mdoc_alloc(curp->roff, curp, + curp->defos); assert(curp->pmdoc); curp->mdoc = curp->pmdoc; return; @@ -694,7 +697,8 @@ mparse_readfd(struct mparse *curp, int f } struct mparse * -mparse_alloc(enum mparset inttype, enum mandoclevel wlevel, mandocmsg mmsg, void *arg) +mparse_alloc(enum mparset inttype, enum mandoclevel wlevel, + mandocmsg mmsg, void *arg, char *defos) { struct mparse *curp; @@ -706,6 +710,7 @@ mparse_alloc(enum mparset inttype, enum curp->mmsg = mmsg; curp->arg = arg; curp->inttype = inttype; + curp->defos = defos; curp->roff = roff_alloc(curp); return(curp); -- To unsubscribe send an email to tech+unsubscribe@mdocml.bsd.lv