Re: glob'in the MANPATH (Was: Altering the MANPATH in RPM)

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> 
> On Sat, 27 Apr 2002, Riku Meskanen wrote:
> >
> Ok, spent some more time on it and it config directory is
> now fully functional with relevant IMHO security checks etc.
>
Thanks Riku.  I will download them today and try them out.  Also,
as soon as I get a chance I will closely examine your patch.  I have
to go through an annoying surgery tommorow, so I won't be able to 
look at it for a few weeks, but again I very glad you saw fit to 
do this.  I was considering doing it myself after talking with you,
but you acted much quicker than.  KUDOs!

 
> RPM will add /etc/man.config.d (relative to your man config
> ofcourse) directory were the another package can add easily
> it's own foo.conf and declare required MANPATH there.
> 
> Check http://people.jyu.fi/~mesrik/tmp/man the 'release' 8 has
> it built in and diffs follows, if you prefer those.
> 
> I was first thinking making these better configurable options,
> but the package does not use recent autoconfigure, so I simply
> made patches active by default. NOCONFIGD and NOGLOB can
> consequtively disable the features if not desired.
>
I would think that that is something that the gnu man mainteners could
get perfect if they want.  Also, if I understand you right NOCONFIGD and
NOGLOB are config file directives, so that is easy enough for someone to
turn off.  Also, its the kind of feature that unless you use it intentionally
it won't be activated (i.e. no globbing will occur until a path contains
a glob char).

Cheers...james 
> I would appreciate if Bero and Aeb give glimpse to these
> patches, please. They sure are worth that :)
> 
> HTH,
> 
> :-) riku
> 
> ps.	anybody knows why this man package still uses internal
> 	glob package that RMS wrote ages ago? It shouldn't be
> 	much work rewriting that one function to use system wide
> 	glob ...
> 
> --- man-1.5j/src/man-config.c.dist	Fri Apr 26 20:23:21 2002
> +++ man-1.5j/src/man-config.c	Fri Apr 26 23:06:48 2002
> @@ -19,6 +19,14 @@
>  #include <string.h>
>  #include <stdlib.h>
> 
> +#ifndef NOGLOB
> +/* Can't refer to system <glob.h> as long as there is local glob.h
> +   on this same directory. Is that really needed any more or would
> +   it be better replace glob_filename() with few lines of code and
> +   call to glob from libc ? -- mesrik@cc.jyu.fi */
> +#include "/usr/include/glob.h"
> +#endif
> +
>  #include "defs.h"
>  #include "man-config.h"
>  #include "man.h"
> @@ -201,7 +209,10 @@
>       char *p;
>       char buf[BUFSIZE];
>       FILE *config = NULL;
> -
> +#ifndef NOGLOB
> +     glob_t  gs;
> +     char    **gp;
> +#endif
>       if (cf) {
>  	  /* User explicitly specified a config file */
>  	  if ((config = fopen (cf, "r")) == NULL) {
> @@ -249,9 +260,24 @@
> 
>  	  if (!strncmp ("MANPATH_MAP", bp, 11))
>  	       adddir (bp+11, 0);
> -	  else if (!strncmp ("MANPATH", bp, 7))
> +	  else if (!strncmp ("MANPATH", bp, 7)) {
> +#ifndef NOGLOB
> +	       /* config glob manpath support - mesrik@cc.jyu.fi */
> +	       p = bp+7;
> +	       while (whitespace(*p))
> +		     p++;
> +	       if (!glob(p,0,NULL,&gs)) {
> +		     for (gp = gs.gl_pathv; *gp; gp++) {
> +			  adddir (*gp, 1);
> +		     }
> +	       } else {
> +		     adddir(bp+7,1);
> +	       }
> +	       globfree(&gs);
> +#else
>  	       adddir (bp+7, 1);
> -	  else if(!strncmp ("MANDATORY_MANPATH", bp, 17))/* backwards compatible */
> +#endif
> +          } else if(!strncmp ("MANDATORY_MANPATH", bp, 17))/* backwards compatible */
>  	       adddir (bp+17, 1);
>  	  else if (!strncmp ("FHS", bp, 3))
>  	       fhs = 1;
> --- man-1.5j/src/man.conf.in.diff	Fri Apr 26 23:33:46 2002
> +++ man-1.5j/src/man.conf.in	Fri Apr 26 23:34:13 2002
> @@ -40,6 +40,7 @@
>  MANPATH	/usr/X11R6/man
>  MANPATH	/usr/local/man
>  MANPATH /usr/kerberos/man
> +MANPATH /opt/*/man
>  MANPATH	/usr/man
>  #
>  # Uncomment if you want to include one of these by default
> 
> --- man-1.5j/src/man-config.c.dist	Sat Apr 27 15:56:34 2002
> +++ man-1.5j/src/man-config.c	Sat Apr 27 15:57:43 2002
> @@ -26,6 +26,13 @@
>     call to glob from libc ? -- mesrik@cc.jyu.fi */
>  #include "/usr/include/glob.h"
>  #endif
> +#ifndef NOCONFIGD
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include <unistd.h>
> +#include <libgen.h>
> +char  *manconfigd = NULL; /* global used to pass possible config include dir */
> +#endif
> 
>  #include "defs.h"
>  #include "man-config.h"
> @@ -213,6 +220,11 @@
>       glob_t  gs;
>       char    **gp;
>  #endif
> +#ifndef NOCONFIGD
> +     char    *dn = NULL;
> +     char    *fn = NULL;
> +     struct  stat ds;
> +#endif
>       if (cf) {
>  	  /* User explicitly specified a config file */
>  	  if ((config = fopen (cf, "r")) == NULL) {
> @@ -235,6 +247,31 @@
>  	       gripe (CONFIG_OPEN_ERROR, CONFIG_FILE);
>  	       return;
>  	  }
> +#ifndef NOCONFIGD
> +	  /* build config dir and check that it us owned by root, in
> +	     root group and group and others must not have write perms
> +	     -- mesrik@cc.jyu.fi */
> +	  dn = dirname(strdup(cf));
> +	  fn = basename(strdup(cf));
> +	  realloc(dn,strlen(dn)+strlen(fn)+5);
> +	  strcat(dn,"/");
> +	  strcat(dn,fn);
> +	  strcat(dn,".d");
> +	  if (!stat(dn,&ds) &&
> +	      S_ISDIR(ds.st_mode) &&
> +	      (ds.st_uid == 0) &&
> +	      (ds.st_gid == 0) &&
> +	      ((ds.st_mode & S_IWGRP) == 0) &&
> +	      ((ds.st_mode & S_IWOTH) == 0)) {
> +		  if (debug)
> +			  fprintf(stderr, "found config dir %s\n", dn);
> +		  /* confing dir name is passed back to caller with
> +		     manconfigd global pointer */
> +		  manconfigd = dn;
> +          } else
> +		  /* didn't find better gripe, for _a directory_ */
> +		  gripe (BAD_CONFIG_FILE, dn);
> +#endif
>       }
> 
>       if (debug)
> --- man-1.5j/src/man-getopt.c.dist	Sat Apr 27 10:06:57 2002
> +++ man-1.5j/src/man-getopt.c	Sat Apr 27 15:48:46 2002
> @@ -2,6 +2,13 @@
>  #include <stdlib.h>
>  #include <unistd.h>
>  #include <string.h>
> +#ifndef NOCONFIGD
> +#include <sys/types.h>
> +#include <sys/stat.h>
> +#include <unistd.h>
> +/* sigh - for local glob.h which we can't use ... :( */
> +#include "/usr/include/glob.h"
> +#endif
> 
>  #include "defs.h"
>  #include "gripes.h"
> @@ -216,16 +223,51 @@
>   * Also reads the configuration file.
>   */
> 
> +#ifndef NOCONFIGD
> +#define CONFSUFFIX "/*.conf"
> +extern char *manconfigd;
> +#endif
> +
>  void
>  man_getopt (int argc, char **argv) {
>       char *config_file = NULL;
>       char *manp = NULL;
>       int optct = 0;
> +#ifndef NOCONFIGD
> +     glob_t gs;
> +     struct stat ss;
> +     char   **gp, mcm[80];
> +#endif
> 
>       optct = get_options_from_argvec(argc, argv, &config_file, &manp);
> 
>       read_config_file (config_file);
> 
> +#ifndef NOCONFIGD
> +     if (manconfigd != NULL) {
> +	     /* append glob suffix and traverse directory, read config
> +		if file permissions are sane enough --  mesrik@cc.jyu.fi */
> +	     strncpy(mcm,manconfigd,sizeof(mcm) - strlen(CONFSUFFIX) -1);
> +	     strcat(mcm,CONFSUFFIX);
> +	     if (!glob(mcm,0,NULL,&gs)) {
> +		     for (gp = gs.gl_pathv; *gp; gp++) {
> +			     if (!stat(*gp,&ss) &&
> +				 S_ISREG(ss.st_mode) &&
> +				 !S_ISLNK(ss.st_mode) &&
> +				 (ss.st_uid == 0) &&
> +				 (ss.st_gid == 0) &&
> +				 ((ss.st_mode & S_IWGRP) == 0) &&
> +				 ((ss.st_mode & S_IWOTH) == 0)) {
> +				     read_config_file(*gp);
> +			     } else
> +				     /* not really descriptive :/ */
> +				     gripe(BAD_CONFIG_FILE,*gp);
> +		     }
> +	     }
> +	     globfree(&gs);
> +     }
> +#endif
> +
>       /* If no options were given and MANDEFOPTIONS is set, use that */
>       if (optct == 0) {
>  	     char *defopts = getval ("MANDEFOPTIONS");
> 
> --- man.spec.dist	Fri Apr 26 23:51:42 2002
> +++ man.spec	Sat Apr 27 16:28:08 2002
> @@ -5,7 +5,7 @@
>  Summary: A set of documentation tools:  man, apropos and whatis.
>  Name: man
>  Version: 1.5j
> -Release: 6
> +Release: 8
>  License: GPL
>  Group: System Environment/Base
>  Source0: ftp://ftp.win.tue.nl/pub/linux-local/utils/man/man-%{version}.tar.bz2
> @@ -32,6 +32,8 @@
>  Patch24: man-1.5i2-initial.patch
>  Patch25: man-1.5i2-legacy.patch
>  Patch26: man-1.5j-sanitycheck.patch
> +Patch27: man-1.5j-globfeat.patch
> +Patch28: man-1.5j-manconfigd.patch
> 
>  # Japanese patches
>  Patch51: man-1.5h1-gencat.patch
> @@ -84,7 +86,8 @@
>  %endif
> 
>  %patch26 -p1 -b .sanitycheck
> -
> +%patch27 -p1 -b .globfeat
> +%patch28 -p1 -b .manconfigd
>  #rm -f $RPM_BUILD_DIR/man-%{version}/man/en/man.conf.man
> 
>  find $RPM_BUILD_DIR/man-%{version} -type f|xargs perl -pi -e 's,man\.conf\(5\),man.config(5),g'
> @@ -104,27 +107,28 @@
> 
>  %install
>  rm -rf $RPM_BUILD_ROOT
> -mkdir -p $RPM_BUILD_ROOT/etc/cron.{daily,weekly}
> +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/cron.{daily,weekly}
>  mkdir -p $RPM_BUILD_ROOT%{_bindir} $RPM_BUILD_ROOT%{_sbindir}
> +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/man.config.d
>  make install PREFIX=$RPM_BUILD_ROOT
> 
>  mkdir -p $RPM_BUILD_ROOT%{_mandir}/man1
>  mkdir -p $RPM_BUILD_ROOT%{_mandir}/man5
>  mkdir -p $RPM_BUILD_ROOT%{_mandir}/man8
> -mkdir -p $RPM_BUILD_ROOT/etc
> +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}
>  install -m 644 man/en/apropos.1 $RPM_BUILD_ROOT%{_mandir}/man1
>  install -m 644 man/en/man.1 $RPM_BUILD_ROOT%{_mandir}/man1
>  install -m 644 man/en/whatis.1 $RPM_BUILD_ROOT%{_mandir}/man1
>  install -m 644 man/en/man.conf.man $RPM_BUILD_ROOT%{_mandir}/man5/man.config.5
>  install -m 644 man/en/makewhatis.8 $RPM_BUILD_ROOT%{_mandir}/man8
> -install -m 644 src/man.conf $RPM_BUILD_ROOT/etc/man.config
> +install -m 644 src/man.conf $RPM_BUILD_ROOT%{_sysconfdir}/man.config
> 
> -install -m755 $RPM_SOURCE_DIR/makewhatis.cronweekly $RPM_BUILD_ROOT/etc/cron.weekly/makewhatis.cron
> -install -m755 $RPM_SOURCE_DIR/makewhatis.crondaily $RPM_BUILD_ROOT/etc/cron.daily/makewhatis.cron
> +install -m755 $RPM_SOURCE_DIR/makewhatis.cronweekly $RPM_BUILD_ROOT%{_sysconfdir}/cron.weekly/makewhatis.cron
> +install -m755 $RPM_SOURCE_DIR/makewhatis.crondaily $RPM_BUILD_ROOT%{_sysconfdir}/cron.daily/makewhatis.cron
> 
>  %if %{legacypaths}
>  perl -pi -e "s,/usr/share/man,/usr/man,g" src/man.conf
> -install -m 644 src/man.conf $RPM_BUILD_ROOT/etc/man.config
> +install -m 644 src/man.conf $RPM_BUILD_ROOT%{_sysconfdir}/man.config
>  %endif
> 
>  mkdir -p $RPM_BUILD_ROOT/%{cache}
> @@ -137,17 +141,17 @@
>  	mkdir -p $RPM_BUILD_ROOT/%{cache}/X11R6/cat$i
>  done
> 
> -strip $RPM_BUILD_ROOT/usr/bin/man
> +strip $RPM_BUILD_ROOT%{_bindir}/man
> 
>  # added man2html stuff
>  cd man2html
>  make install DESTDIR=$RPM_BUILD_ROOT
> -strip -R .comment $RPM_BUILD_ROOT/usr/bin/man2html
> +strip -R .comment $RPM_BUILD_ROOT%{_bindir}/man2html
>  gzip -9f $RPM_BUILD_ROOT%{_mandir}/*/*
> 
>  # symlinks for manpath
>  ( cd $RPM_BUILD_ROOT
> -  ln -s man ./usr/bin/manpath
> +  ln -s man .%{_bindir}/manpath
>    ln -s man.1.gz .%{_mandir}/man1/manpath.1.gz
>  )
> 
> @@ -172,25 +176,26 @@
> 
>  %files
>  %defattr(-,root,root)
> -%config /etc/cron.weekly/makewhatis.cron
> -%config /etc/cron.daily/makewhatis.cron
> +%config %{_sysconfdir}/cron.weekly/makewhatis.cron
> +%config %{_sysconfdir}/cron.daily/makewhatis.cron
>  %if %{usecache}
> -%attr(2755,root,man)	/usr/bin/man
> +%attr(2755,root,man)	%{_bindir}/man
>  %else
> -%attr(0755,root,root)   /usr/bin/man
> +%attr(0755,root,root)   %{_bindir}/man
>  %endif
> -/usr/bin/manpath
> -/usr/bin/apropos
> -/usr/bin/whatis
> -/usr/sbin/makewhatis
> -%config /etc/man.config
> +%{_bindir}/manpath
> +%{_bindir}/apropos
> +%{_bindir}/whatis
> +%{_sbindir}/makewhatis
> +%config %{_sysconfdir}/man.config
> +%attr(0755,root,root) %dir %{_sysconfdir}/man.config.d
>  %{_mandir}/man5/man.config.5*
>  %{_mandir}/man1/whatis.1*
>  %{_mandir}/man1/man.1*
>  %{_mandir}/man1/manpath.1*
>  %{_mandir}/man1/apropos.1*
>  %{_mandir}/man1/man2html.1*
> -/usr/bin/man2html
> +%{_bindir}/man2html
>  %lang(cs) %dir /usr/share/locale/cs
>  %lang(cs) /usr/share/locale/cs/man
>  %lang(da) %dir /usr/share/locale/da
> @@ -227,6 +232,19 @@
>  %attr(0775,root,man)	%dir %{cache}/X11R6/cat[123456789n]
> 
>  %changelog
> +* Sat Apr 27 2002 Riku Meskanen <mesrik@cc.jyy.fi>
> +- Wrote config-directory (usually %{_sysconfdir}/man.config.d) support
> +  which will help greatly packagers task of getting right MANPATH, just
> +  add your %{_sysconfdir}/man.config.d/foo.conf and it will be included
> +  if the file and directory permissionas are worth trusting.
> +- for spec cleanup starters did query-replace /etc -> %{_sysconfdir},
> +  /usr/bin -> %{_bindir} and /usr/sbin -> %{_sbindir}, did not touch
> +  locale stuff as I'm not quite sure if it had some side effects...
> +
> +* Fri Apr 26 2002 Riku Meskanen <mesrik@cc.jyy.fi>
> +- Added glob() to man.config MANPATH for supporting easier /opt
> +  deployment, feature simplifies setting MANPATH /opt/*/man
> +
>  * Mon Mar 25 2002 Bernhard Rosenkraenzer <bero@redhat.com> 1.5j-6
>  - Fix bugs #60676 and #61105
>  - Add /usr/local/man and /usr/X11R6/man to makewhatis default paths
> -- 
>     [ This .signature intentionally left blank ]
> 
> 
> 
> _______________________________________________
> Redhat-devel-list mailing list
> Redhat-devel-list@redhat.com
> https://listman.redhat.com/mailman/listinfo/redhat-devel-list
> 



_______________________________________________
Redhat-devel-list mailing list
Redhat-devel-list@redhat.com
https://listman.redhat.com/mailman/listinfo/redhat-devel-list

[Index of Archives]     [Kernel Newbies]     [Red Hat General]     [Fedora]     [Red Hat Install]     [Linux Kernel Development]     [Yosemite News]

  Powered by Linux