2007-02-09 16:58:14 +01:00
--- .pkgextract
2007-12-12 18:16:54 +01:00
+++ .pkgextract 2007-12-10 12:51:40.892874000 +0100
@@ -0,0 +1,9 @@
+bzcat ../man-db_2.5.0-4.diff.bz2 | patch -p1 -s --suffix=.debian
2006-12-19 00:17:06 +01:00
+patch -p0 -s --suffix=.groff < ../man-db-2.3.19deb4.0-groff.dif
2007-12-12 18:16:54 +01:00
+patch -p0 -s --suffix=.err < ../man-db-2.5.0-error.dif
2006-12-19 00:17:06 +01:00
+patch -p0 -s --suffix=.sect < ../man-db-2.4.3-section.dif
2007-12-12 18:16:54 +01:00
+patch -p0 -s --suffix=.secu4 < ../man-db-2.5.0-security4.dif
2007-07-18 22:01:45 +02:00
+patch -p0 -s --suffix=.firefox< ../man-db-2.4.3-firefox.dif
2007-12-12 18:16:54 +01:00
+patch -p0 -s --suffix=.chinese< ../man-db-2.5.0-chinese.dif
+patch -p0 -s --suffix=.glob < ../man-db-2.4.3-globbing.dif
+patch -p0 -s --suffix=.zio < ../man-db-2.5.0-zio.dif
2007-02-09 16:58:14 +01:00
--- GNUmakefile.in
2007-12-12 18:16:54 +01:00
+++ GNUmakefile.in 2007-12-11 12:56:21.536072000 +0100
2006-12-19 00:17:06 +01:00
@@ -35,7 +35,7 @@
# Make targets are: #
# #
# all install uninstall mostlyclean clean distclean realclean TAGS ID #
2007-12-12 18:16:54 +01:00
-# FILES lib src man intl libdb update RCS dist #
+# FILES lib src man libdb update RCS dist #
2006-12-19 00:17:06 +01:00
#------------------------------------------------------------------------#
srcdir = @srcdir@
@@ -51,9 +51,9 @@ USE_NLS = @USE_NLS@
# GNUmakefile and include/Defines are automatic targets, don't add below.
INCLUDES := config.h $(addprefix include/, manconfig.h comp_src.h)
CONF = src/man_db.conf
2007-12-12 18:16:54 +01:00
-EVERYTHING = intl lib libdb src man po
-ALL = intl lib libdb src man po
-INSTALL = src man intl po
+EVERYTHING = lib libdb src man po
+ALL = lib libdb src man po
+INSTALL = src man po
2006-12-19 00:17:06 +01:00
include include/Defines
2007-12-12 18:16:54 +01:00
@@ -163,7 +163,7 @@ __TAGS:
2006-12-19 00:17:06 +01:00
install: $(INCLUDES) $(CONF)
install uninstall:
- for i in $(INSTALL); do $(MAKE) prefix=$(prefix) -C $$i $@; done
+ for i in $(INSTALL); do $(MAKE) prefix=$(prefix) DESTDIR=$(DESTDIR) -C $$i $@; done
TAGS realclean distclean mostlyclean clean:
for i in $(EVERYTHING); do $(MAKE) prefix=$(prefix) -C $$i $@ clean=yes; done
@@ -220,7 +220,6 @@ dist: update
for file in $(FILES); do \
cp -p $(srcdir)/$$file $(man_db)/$$file; \
done
- $(MAKE) -C intl dist
# Maintainers may wish to run 'make -C po update-po' beforehand.
# This is not done automatically, since the .po files are stored
# in revision control.
2007-12-12 18:16:54 +01:00
--- configure.ac
2008-02-28 02:01:41 +01:00
+++ configure.ac 2008-01-29 19:07:22.794596000 +0100
2007-12-12 18:16:54 +01:00
@@ -10,17 +10,30 @@ AC_CONFIG_HEADER(config.h)
2006-12-19 00:17:06 +01:00
AC_CANONICAL_HOST
AC_ARG_PROGRAM
dnl
+dnl Check $PATH for the following progs and append suitable options.
+dnl
+AC_PROG_CC
+AC_PROG_CPP
+AC_GNU_SOURCE
+dnl
+dnl check for system defaults
+dnl
+AC_AIX
+AC_MINIX
+AC_ISC_POSIX
+dnl
dnl Define below date and version information to be put into man pages etc.
dnl
2007-12-12 18:16:54 +01:00
datemark=20071007
date=`LANG=C date -d $datemark +'%Y-%m-%d'`
AC_SUBST(date)dnl
2006-12-19 00:17:06 +01:00
dnl
2007-12-12 18:16:54 +01:00
+m4_pattern_allow([AC_DEFINE_UNQUOTED])
PACKAGE=AC_PACKAGE_NAME
VERSION=AC_PACKAGE_VERSION
-AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE",
+AC_DEFINE_UNQUOTED([PACKAGE], ["$PACKAGE"],
[Define to the name of the distribution.])
-AC_DEFINE_UNQUOTED(VERSION, "$VERSION",
+AC_DEFINE_UNQUOTED([VERSION], ["$VERSION"],
[Define to the version of the distribution.])
AC_SUBST(PACKAGE)dnl
AC_SUBST(VERSION)dnl
@@ -119,9 +132,6 @@ AC_SUBST(config_file_basename)dnl
2006-12-19 00:17:06 +01:00
dnl
2007-12-12 18:16:54 +01:00
dnl Check $PATH for the following progs and append suitable options.
dnl
-AC_GNU_SOURCE
-AC_PROG_CC
-AC_PROG_CPP
CFLAGS="$CFLAGS -Wall"
if test "$GCC" = yes
then
@@ -232,6 +242,14 @@ else
2006-12-19 00:17:06 +01:00
fi
dnl
2007-12-12 18:16:54 +01:00
MAN_CHECK_PROGS([eqn], [EQN], [use EQN to preprocess equations], [eqn geqn])
+MAN_CHECK_PROGS([geqn], [GEQN], [use GEQN to preprocess equations], [geqn])
2006-12-19 00:17:06 +01:00
+dnl
+dnl if geqn is found and geqn is identical with eqn we use a GNU eqn
+dnl which its self can use -Tlatin1
+dnl
+if test -n "$geqn" -a -n "$eqn" ; then
2007-12-12 18:16:54 +01:00
+ test $geqn -ef $eqn && neqn="$eqn -T$nroff_device"
2006-12-19 00:17:06 +01:00
+fi
2007-12-12 18:16:54 +01:00
MAN_CHECK_PROGS([neqn], [NEQN], [use NEQN to preprocess equations for character devices], [neqn gneqn])
2006-12-19 00:17:06 +01:00
dnl
dnl if we fail to find an neqn, use eqn and try to force it to output
2007-12-12 18:16:54 +01:00
@@ -258,9 +276,15 @@ then
compress_ext="gz"
2006-12-19 00:17:06 +01:00
fi
2007-12-12 18:16:54 +01:00
MAN_CHECK_PROGS([compress], [COMPRESS], [use COMPRESS as UNIX compression utility], [compress])
2006-12-19 00:17:06 +01:00
-if test -n "$compress"
+if test -n "$compress" || test -n "$gzip"
then
- uncompress="$compress -dc"
+ if test -n "$gzip"
+ then
+ uncompress="$gzip -dc"
+ elif test -n "$compress"
+ then
+ uncompress="$compress -dc"
+ fi
if test -z "$gzip"
then
compressor="$compress -c"
2007-12-12 18:16:54 +01:00
@@ -334,9 +358,6 @@ AC_ARG_ENABLE(mandirs,
2006-12-19 00:17:06 +01:00
dnl
dnl check for various header files and associated libraries.
dnl
-AC_AIX
-AC_MINIX
-AC_ISC_POSIX
dnl AC_PROG_LEX calls AC_TRY_LINK: must come after above 3
AC_PROG_LEX
AC_HEADER_STDC
2007-12-12 18:16:54 +01:00
@@ -529,7 +550,6 @@ AC_CONFIG_FILES(GNUmakefile
2006-12-19 00:17:06 +01:00
include/Defines
include/comp_src.h
include/manconfig.h
- intl/Makefile
po/Makefile.in)
AC_OUTPUT
2007-02-09 16:58:14 +01:00
--- mk_catdirs
2007-12-12 18:16:54 +01:00
+++ mk_catdirs 2007-12-10 12:51:50.430084000 +0100
2006-12-19 00:17:06 +01:00
@@ -0,0 +1,24 @@
+#!/bin/sh
+
+OLDPWD="`pwd`"
+CACHE="$1/var/cache/man"
+
+ cats="cat{0,1,2,3,4,5,6,7,8,9,n}"
2007-02-15 18:25:11 +01:00
+locale="{ca,cs,da,de,en,es,et,fi,fr,ga,hu,is,it,ja,ko,nl,no,pl,pt,ru,sk,sr,sv,uk}"
+ dirs="{local,opt}"
2006-12-19 00:17:06 +01:00
+
+umask 022
+test -d ${CACHE} && rm -rf ${CACHE}
+mkdir -p ${CACHE}
+
+cd ${CACHE}
+eval echo ${cats} \
+ ${locale}/${cats} \
+ ${dirs}/${cats} \
+ ${dirs}/${locale}/${cats} \
+ | xargs mkdir -p
+sync
+cd ${OLDPWD}
+
2007-02-09 16:58:14 +01:00
+test "$(id -u)" -ne 0 || chown man:daemon -R ${CACHE}
2006-12-19 00:17:06 +01:00
+
2007-02-09 16:58:14 +01:00
--- include/Defines.in
2007-12-12 18:16:54 +01:00
+++ include/Defines.in 2007-12-10 12:51:50.466089000 +0100
@@ -98,7 +98,11 @@ DEFAULT_TARGETS = TAGS all install unins
2007-02-09 16:58:14 +01:00
debug = @debug@
date = @date@
version = @VERSION@
+ifeq ($(shell id -u),0)
man_install_flags = @man_install_flags@
+else
+man_install_flags = -m 0755
+endif
# some path definitions required by the manpage Makefile...
pager="@pager@"
--- include/comp_src.h.in
2007-12-12 18:16:54 +01:00
+++ include/comp_src.h.in 2007-12-10 12:51:50.498093000 +0100
2006-12-19 00:17:06 +01:00
@@ -53,7 +53,7 @@ struct compression comp_list[] = {
#endif /* HAVE_GZIP */
/* If we have compress, incorporate the following */
-#ifdef HAVE_COMPRESS
+#if defined(HAVE_COMPRESS) || defined(HAVE_GZIP)
{UNCOMPRESS, "Z", NULL},
#endif /* HAVE_COMPRESS */
2007-02-09 16:58:14 +01:00
--- include/manconfig.h.in
2008-02-28 02:01:41 +01:00
+++ include/manconfig.h.in 2008-01-30 11:56:48.181631000 +0100
2007-12-12 18:16:54 +01:00
@@ -73,7 +73,7 @@
2006-12-19 00:17:06 +01:00
2007-12-12 18:16:54 +01:00
#undef MAN_DB_CREATES
#define MAN_DB_UPDATES
-#define MAN_CATS
+#undef MAN_CATS
/* By default, man-db will store a whatis referenced manual page in favour
of a stray cat page when they both share identical namespace. If you
@@ -136,7 +136,7 @@
2006-12-19 00:17:06 +01:00
#ifndef NROFF_MISSING
# ifndef NROFF
2007-12-12 18:16:54 +01:00
-# define NROFF "@nroff@"
+# define NROFF "nroff -mandocdb"
2006-12-19 00:17:06 +01:00
# endif
#endif
2007-12-12 18:16:54 +01:00
@@ -240,8 +240,12 @@
2006-12-19 00:17:06 +01:00
#ifdef inline
/* autoconf #defines inline to be either "__inline", "__inline__"
or "" if the compiler doesn't like inline */
-# define __inline__ inline
-# define __inline inline
+# ifndef __inline__
+# define __inline__ inline
+# endif
+# ifndef __inline
+# define __inline inline
+# endif
#endif /* inline */
/* my gcc specs file is hacked to define __profile__ if I compile with
2007-12-12 18:16:54 +01:00
@@ -385,11 +389,17 @@ extern char *trim_spaces (const char *s)
extern char *lang_dir (const char *filename);
2006-12-19 00:17:06 +01:00
#ifndef HAVE_BASENAME
-extern char *basename ();
+# ifndef _STRING_H
+# include <string.h>
+# endif
#endif /* HAVE_BASENAME */
#ifndef HAVE_STRSEP
extern char *strsep (char **stringp, const char *delim);
+#else
+# ifndef _STRING_H
+# include <string.h>
+# endif
#endif /* !HAVE_STRSEP */
#ifndef HAVE_GETCWD
2007-12-12 18:16:54 +01:00
@@ -414,12 +424,13 @@ extern char *program_name; /* the basena
2006-12-19 00:17:06 +01:00
#define FAIL 1 /* usage or syntax error */
#define FATAL 2 /* operational error */
#define CHILD_FAIL 3 /* child failed */
-#define INTERRUPTED 4 /* Interrupted by signal */
#define NOT_FOUND 16 /* No action was taken */
/* System or user catpaths? Allow bitwise disjunctions of these. */
2008-01-30 18:47:16 +01:00
-#define SYSTEM_CAT 1
-#define USER_CAT 2
+#define SYSTEM_CATP 1
+#define USER_CATP 2
+#define FILE_CATP 4
+#define WHATIS_CATP 8
2007-12-12 18:16:54 +01:00
/* string macros */
#define STREQ(a,b) (strcmp(a,b) == 0)
2007-02-09 16:58:14 +01:00
--- intl/Makefile.in
2007-12-12 18:16:54 +01:00
+++ intl/Makefile.in 2007-12-10 12:51:50.562101000 +0100
@@ -177,7 +177,7 @@ libgnuintl.h.msvc-shared Makefile.msvc
2006-12-19 00:17:06 +01:00
all: all-@USE_INCLUDED_LIBINTL@
all-yes: libintl.$la libintl.h charset.alias ref-add.sed ref-del.sed
-all-no: all-no-@BUILD_INCLUDED_LIBINTL@
+all-no: all-no-@USE_INCLUDED_LIBINTL@
all-no-yes: libgnuintl.$la
all-no-no:
2007-02-09 16:58:14 +01:00
--- lib/basename.c
2007-12-12 18:16:54 +01:00
+++ lib/basename.c 2007-12-10 12:51:50.598106000 +0100
2006-12-19 00:17:06 +01:00
@@ -37,11 +37,13 @@
extern char *strrchr();
#endif /* STDC_HEADERS */
+#ifndef HAVE_BASENAME
/* return basename of given filename */
-char *basename(char *filename)
+char *basename(const char *filename)
{
char *base;
base = strrchr(filename, '/');
return base ? base + 1 : filename;
}
+#endif
2007-02-09 16:58:14 +01:00
--- lib/cleanup.c
2007-12-12 18:16:54 +01:00
+++ lib/cleanup.c 2007-12-10 13:07:01.233682000 +0100
@@ -102,7 +102,7 @@ trap_signal (int signo, struct sigaction
2006-12-19 00:17:06 +01:00
act.sa_handler = sighandler;
sigemptyset (&act.sa_mask);
- act.sa_flags = 0;
+ act.sa_flags = SA_ONESHOT;
2007-12-12 18:16:54 +01:00
return xsigaction (signo, &act, oldact);
2006-12-19 00:17:06 +01:00
}
2007-02-09 16:58:14 +01:00
--- lib/xmalloc.c
2007-12-12 18:16:54 +01:00
+++ lib/xmalloc.c 2007-12-10 12:51:50.666114000 +0100
@@ -39,6 +39,8 @@ void free ();
The caller may set it to some other value. */
int xmalloc_exit_failure = EXIT_FAILURE;
2006-12-19 00:17:06 +01:00
+#include "manconfig.h"
+
static void *
fixup_null_alloc (size_t n)
{
2007-02-09 16:58:14 +01:00
--- libdb/Makefile.in
2007-12-12 18:16:54 +01:00
+++ libdb/Makefile.in 2007-12-10 13:08:09.382330000 +0100
@@ -35,9 +35,6 @@ include $(top_srcdir)/include/Defines
2006-12-19 00:17:06 +01:00
MANDEFS =
2007-12-12 18:16:54 +01:00
MANCPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir) -I$(srcdir)
2006-12-19 00:17:06 +01:00
-ifeq ($(USE_NLS),yes)
-MANCPPFLAGS += -I$(top_srcdir)/intl
-endif
# The default programs to build
ALL = db_store.o db_delete.o db_lookup.o \
2007-02-09 16:58:14 +01:00
--- libdb/mydbm.h
2007-12-12 18:16:54 +01:00
+++ libdb/mydbm.h 2007-12-10 12:51:50.738124000 +0100
@@ -150,7 +150,7 @@ extern __inline__ int btree_nextkeydata(
# define MYDBM_SET_DPTR(d, value) ((d).data = (char *) (value))
# define MYDBM_DSIZE(d) ((d).size)
2006-12-19 00:17:06 +01:00
# define MYDBM_CTRWOPEN(file) btree_flopen(file, O_TRUNC|O_CREAT|O_RDWR, DBMODE)
-# define MYDBM_CRWOPEN(file) btree_flopen(file, O_CREAT|O_RDWR, DBMODE)
+# define MYDBM_CRWOPEN(file) btree_flopen(file, O_CREAT|O_RDWR, DBMODE)
# define MYDBM_RWOPEN(file) btree_flopen(file, O_RDWR, DBMODE)
# define MYDBM_RDOPEN(file) btree_flopen(file, O_RDONLY, DBMODE)
2007-12-12 18:16:54 +01:00
# define MYDBM_INSERT(db, key, cont) btree_insert(db, key, cont)
--- man/Makefile.in
+++ man/Makefile.in 2007-12-11 13:10:03.780541000 +0100
@@ -85,17 +85,17 @@ man8files = $(addprefix $(path)/man8/, $
allmanpages := $(foreach file, $(foreach path, . $(NLS), $(man1files) $(man5files) $(man8files)), $(subst .man,.,$(wildcard $(file))))
# NB manpath.5 is not expanded
-man.1 = $(DESTDIR)$(manroot)/$(nlspath)/$(man1dir)/$(man)$(man1ext)
-manpath.1 = $(DESTDIR)$(manroot)/$(nlspath)/$(man1dir)/$(manpath)$(man1ext)
-apropos.1 = $(DESTDIR)$(manroot)/$(nlspath)/$(man1dir)/$(apropos)$(man1ext)
-whatis.1 = $(DESTDIR)$(manroot)/$(nlspath)/$(man1dir)/$(whatis)$(man1ext)
-zsoelim.1 = $(DESTDIR)$(manroot)/$(nlspath)/$(man1dir)/$(zsoelim)$(man1ext)
-lexgrog.1 = $(DESTDIR)$(manroot)/$(nlspath)/$(man1dir)/lexgrog$(man1ext)
-manconv.1 = $(DESTDIR)$(manroot)/$(nlspath)/$(man1dir)/$(manconv)$(man1ext)
-manpath.5 = $(DESTDIR)$(manroot)/$(nlspath)/$(man5dir)/manpath$(man5ext)
-mandb.8 = $(DESTDIR)$(manroot)/$(nlspath)/$(man8dir)/$(mandb)$(man8ext)
-catman.8 = $(DESTDIR)$(manroot)/$(nlspath)/$(man8dir)/$(catman)$(man8ext)
-accessdb.8 = $(DESTDIR)$(manroot)/$(nlspath)/$(man8dir)/accessdb$(man8ext)
+man.1 = $(DESTDIR)$(manroot)/$(basename $(nlspath))/$(man1dir)/$(man)$(man1ext)
+manpath.1 = $(DESTDIR)$(manroot)/$(basename $(nlspath))/$(man1dir)/$(manpath)$(man1ext)
+apropos.1 = $(DESTDIR)$(manroot)/$(basename $(nlspath))/$(man1dir)/$(apropos)$(man1ext)
+whatis.1 = $(DESTDIR)$(manroot)/$(basename $(nlspath))/$(man1dir)/$(whatis)$(man1ext)
+zsoelim.1 = $(DESTDIR)$(manroot)/$(basename $(nlspath))/$(man1dir)/$(zsoelim)$(man1ext)
+lexgrog.1 = $(DESTDIR)$(manroot)/$(basename $(nlspath))/$(man1dir)/lexgrog$(man1ext)
+manconv.1 = $(DESTDIR)$(manroot)/$(basename $(nlspath))/$(man1dir)/$(manconv)$(man1ext)
+manpath.5 = $(DESTDIR)$(manroot)/$(basename $(nlspath))/$(man5dir)/manpath$(man5ext)
+mandb.8 = $(DESTDIR)$(manroot)/$(basename $(nlspath))/$(man8dir)/$(mandb)$(man8ext)
+catman.8 = $(DESTDIR)$(manroot)/$(basename $(nlspath))/$(man8dir)/$(catman)$(man8ext)
+accessdb.8 = $(DESTDIR)$(manroot)/$(basename $(nlspath))/$(man8dir)/accessdb$(man8ext)
# Rules... We've got some rules 'round here.
%.1: %.man1
@@ -119,9 +119,9 @@ endif
# special targets
nlsinstall:
- $(MKINSTALLDIRS) $(DESTDIR)$(manroot)/$(nlspath)/$(man1dir)
- $(MKINSTALLDIRS) $(DESTDIR)$(manroot)/$(nlspath)/$(man5dir)
- $(MKINSTALLDIRS) $(DESTDIR)$(manroot)/$(nlspath)/$(man8dir)
+ $(MKINSTALLDIRS) $(DESTDIR)$(manroot)/$(basename $(nlspath))/$(man1dir)
+ $(MKINSTALLDIRS) $(DESTDIR)$(manroot)/$(basename $(nlspath))/$(man5dir)
+ $(MKINSTALLDIRS) $(DESTDIR)$(manroot)/$(basename $(nlspath))/$(man8dir)
$(INSTALL_DATA) $(nlspath)/man1/man.1 $(man.1)
$(INSTALL_DATA) $(nlspath)/man1/manpath.1 $(manpath.1)
$(INSTALL_DATA) $(nlspath)/man1/apropos.1 $(apropos.1)
--- man/de.UTF-8/man1/man.man1
+++ man/de.UTF-8/man1/man.man1 2007-12-11 12:28:04.213373000 +0100
2006-12-19 00:17:06 +01:00
@@ -98,6 +98,7 @@ der Manualseiten gefolgt vom Typ der dor
.TS
tab (@);
l l.
2007-12-12 18:16:54 +01:00
+0@Dateiheader (gewöhnlich in \fI/usr/include\fR)
1@Ausführbare Programme oder Shellbefehle
2006-12-19 00:17:06 +01:00
2@Systemaufrufe (Kernelfunktionen)
3@Bibliotheksaufrufe (Funktionen in System-Bibliotheken)
2007-12-12 18:16:54 +01:00
--- man/es.UTF-8/man1/man.man1
+++ man/es.UTF-8/man1/man.man1 2007-12-10 13:11:03.360408000 +0100
@@ -101,6 +101,7 @@ del manual y los tipos de páginas que c
2006-12-19 00:17:06 +01:00
.TS
tab (@);
l l.
+0@Ficheros (se encuentran generalmente en \fI/usr/include\fR)
2007-12-12 18:16:54 +01:00
1@Programas ejecutables y guiones del intérprete de
@órdenes
2@Llamadas del sistema (funciones servidas por el núcleo)
--- man/it.UTF-8/man1/man.man1
+++ man/it.UTF-8/man1/man.man1 2007-12-10 12:53:23.697923000 +0100
@@ -124,6 +124,7 @@ del manuale seguiti dai tipi di pagine c
2006-12-19 00:17:06 +01:00
.TS
tab (@);
l l.
+0@File (di solito trovabili in \fI/usr/include\fR)
1@Programmi eseguibili e comandi della shell
2@Chiamate al sistema (funzioni fornite dal kernel)
3@Chiamate alle librerie (funzioni all'interno delle
2007-12-12 18:16:54 +01:00
--- man/ja.UTF-8/man1/man.man1
+++ man/ja.UTF-8/man1/man.man1 2007-12-10 13:11:42.941431000 +0100
2006-12-19 00:17:06 +01:00
@@ -104,6 +104,7 @@
.TS
tab (@);
l l.
+0@
2007-12-12 18:16:54 +01:00
1@実行プログラムまたはシェルのコマンド
2@システムコール (カーネルが提供する関数)
3@ライブラリコール (システムライブラリに含まれる関数)
2007-02-09 16:58:14 +01:00
--- man/man1/man.man1
2007-12-12 18:16:54 +01:00
+++ man/man1/man.man1 2007-12-10 12:53:31.282886000 +0100
@@ -114,6 +114,7 @@ numbers of the manual followed by the ty
2006-12-19 00:17:06 +01:00
.TS
tab (@);
l l.
+0@Header files (usually found in \fI/usr/include\fR)
1@Executable programs or shell commands
2@System calls (functions provided by the kernel)
3@Library calls (functions within program libraries)
2007-02-09 16:58:14 +01:00
--- src/Makefile.in
2007-12-12 18:16:54 +01:00
+++ src/Makefile.in 2007-12-10 13:13:47.713263000 +0100
2006-12-19 00:17:06 +01:00
@@ -40,7 +40,7 @@ include ../include/Defines
MANDEFS = -DCONFIG_FILE=\"$(config_file)\" \
-DLOCALEDIR=\"$(gnulocaledir)\" $(DEFS_$(subst /,_,$@))
2007-12-12 18:16:54 +01:00
-MANCPPFLAGS = -I../include -I$(top_srcdir) -I$(srcdir) -I../intl
2006-12-19 00:17:06 +01:00
+MANCPPFLAGS = -I../include -I$(top_srcdir) -I$(srcdir) -I.
#----------------------------------------------------------------#
# user changeable definitions can be found in ../include/Defines #
2007-12-12 18:16:54 +01:00
@@ -123,7 +123,7 @@ apropos: whatis.c
2006-12-19 00:17:06 +01:00
# Rules to test code as program unit
2007-12-12 18:16:54 +01:00
lexgrog: lexgrog.c compression.o descriptions.o encodings.o fake_security.o \
ult_src.o util.o
2006-12-19 00:17:06 +01:00
- $(LINK.c) -DTEST $^ $(LDLIBS) -o $@
+ $(LINK.c) -g -DTEST $^ $(LDLIBS) -o $@
globbing: globbing.c util.o
$(LINK.c) -DTEST $^ $(LDLIBS) -o $@
2007-12-12 18:16:54 +01:00
@@ -132,8 +132,10 @@ globbing: globbing.c util.o
2006-12-19 00:17:06 +01:00
install:
$(MKINSTALLDIRS) $(DESTDIR)$(bindir) $(DESTDIR)$(sbindir) \
$(DESTDIR)$(libdir)/man-db
- $(INSTALL_PROGRAM) $(man_install_flags) man $(DESTDIR)$(bindir)/$(man)
- $(INSTALL_PROGRAM) $(man_install_flags) mandb $(DESTDIR)$(bindir)/$(mandb)
+ $(INSTALL_PROGRAM) $(man_install_flags) man $(DESTDIR)$(libdir)/man-db/$(man)
+ $(INSTALL_PROGRAM) $(man_install_flags) mandb $(DESTDIR)$(libdir)/man-db/$(mandb)
+ $(INSTALL_PROGRAM) $(man_install_flags) wrapper $(DESTDIR)$(bindir)/$(mandb)
+ ln -f $(DESTDIR)$(bindir)/$(mandb) $(DESTDIR)$(bindir)/$(man)
$(INSTALL_PROGRAM) manpath $(DESTDIR)$(bindir)/$(manpath)
$(INSTALL_PROGRAM) catman $(DESTDIR)$(bindir)/$(catman)
$(INSTALL_PROGRAM) whatis $(DESTDIR)$(bindir)/$(whatis)
2008-01-30 18:47:16 +01:00
--- src/catman.c
2008-02-28 02:01:41 +01:00
+++ src/catman.c 2008-01-30 12:02:20.699895000 +0100
2008-01-30 18:47:16 +01:00
@@ -494,7 +494,7 @@ int main (int argc, char *argv[])
char *catpath;
size_t len;
- catpath = get_catpath (*mp, SYSTEM_CAT | USER_CAT);
+ catpath = get_catpath (*mp, SYSTEM_CATP|USER_CATP);
if (catpath) {
if (is_directory (catpath) != 1) {
2007-02-09 16:58:14 +01:00
--- src/check_mandirs.c
2007-12-12 18:16:54 +01:00
+++ src/check_mandirs.c 2007-12-10 13:15:48.608604000 +0100
@@ -391,10 +391,10 @@ static short testmandirs (const char *pa
2006-12-19 00:17:06 +01:00
}
if (!quiet) {
- fprintf (stderr, "\r");
fprintf (stderr,
_("Updating index cache for path "
"`%s/%s'. Wait..."), path, mandir->d_name);
+ putc ('\n', stderr);
}
add_dir_entries (path, mandir->d_name);
MYDBM_CLOSE (dbf);
2007-12-12 18:16:54 +01:00
@@ -590,7 +590,7 @@ short update_db (const char *manpath)
return new;
2006-12-19 00:17:06 +01:00
}
2007-12-12 18:16:54 +01:00
- debug ("failed to open %s O_RDONLY\n", database);
+ debug ("failed to open database %s O_RDONLY\n", database);
2006-12-19 00:17:06 +01:00
return EOF;
}
2007-12-12 18:16:54 +01:00
@@ -766,6 +766,7 @@ static short purge_whatis (const char *p
"would delete\n", name, info->ext);
2006-12-19 00:17:06 +01:00
return 1;
}
+ return 1;
}
/* Check that multi keys are correctly constructed. */
2007-12-12 18:16:54 +01:00
@@ -828,6 +829,11 @@ short purge_missing (const char *manpath
gripe_rwopen_failed ();
2006-12-19 00:17:06 +01:00
return 0;
}
+ if (dbver_rd (dbf)) {
+ MYDBM_CLOSE (dbf);
+ dbf = NULL;
+ return 0;
+ }
key = MYDBM_FIRSTKEY (dbf);
2007-12-12 18:16:54 +01:00
@@ -846,6 +852,14 @@ short purge_missing (const char *manpath
2006-12-19 00:17:06 +01:00
continue;
}
+ /* Ignore db identifier keys. */
+ if (*key.dptr == '.' && *(key.dptr+1) == 0) {
+ nextkey = MYDBM_NEXTKEY (dbf, key);
+ MYDBM_FREE (key.dptr);
+ key = nextkey;
+ continue;
+ }
+
content = MYDBM_FETCH (dbf, key);
2007-12-12 18:16:54 +01:00
if (!MYDBM_DPTR (content))
2006-12-19 00:17:06 +01:00
return count;
2007-02-09 16:58:14 +01:00
--- src/fake_security.c
2007-12-12 18:16:54 +01:00
+++ src/fake_security.c 2007-12-10 12:53:31.362896000 +0100
2006-12-19 00:17:06 +01:00
@@ -45,6 +45,7 @@ extern int errno;
#include "security.h"
uid_t ruid, euid, uid;
+gid_t rgid, egid;
#ifdef SECURE_MAN_UID
static struct passwd *man_owner;
2007-02-09 16:58:14 +01:00
--- src/lexgrog.l
2007-12-12 18:16:54 +01:00
+++ src/lexgrog.l 2007-12-10 16:36:13.786133000 +0100
@@ -67,7 +67,7 @@ extern int errno;
#include "encodings.h"
2006-12-19 00:17:06 +01:00
#include "ult_src.h"
-#define YY_READ_BUF_SIZE 1024
+#define YY_READ_BUF_SIZE YY_BUF_SIZE
#define MAX_NAME 2048
#ifdef PROFILE
2007-12-12 18:16:54 +01:00
@@ -75,10 +75,10 @@ static int ctr[YY_NUM_RULES];
2006-12-19 00:17:06 +01:00
# define YY_USER_ACTION ++ctr[yy_act];
#endif
-static void add_str_to_whatis (const char *string, size_t length);
-static void add_char_to_whatis (unsigned char c);
-static void add_separator_to_whatis (void);
-static void newline_found (void);
+static __inline__ void add_str_to_whatis (const char *string, size_t length);
+static __inline__ void add_char_to_whatis (unsigned char c);
+static __inline__ void add_separator_to_whatis (const char *, size_t);
+static __inline__ void newline_found (void);
static char newname[MAX_NAME];
static char *p_name;
2007-12-12 18:16:54 +01:00
@@ -87,6 +87,7 @@ static char filters[MAX_FILTERS];
2006-12-19 00:17:06 +01:00
static int fill_mode;
static int waiting_for_quote;
+static int have_separator;
2007-12-12 18:16:54 +01:00
static pipeline *decomp;
2006-12-19 00:17:06 +01:00
2007-12-12 18:16:54 +01:00
@@ -131,7 +132,7 @@ static const char args[] = "mcwfE:hV";
2006-12-19 00:17:06 +01:00
%}
%option ecs meta-ecs
-%option 8bit batch caseful never-interactive
+%option 8bit batch caseful never-interactive align
%option nostdinit
%option warn
%option noyywrap nounput
2007-12-12 18:16:54 +01:00
@@ -160,8 +161,9 @@ font_change \\f([[:upper:]1-4]|\({upper}
2006-12-19 00:17:06 +01:00
size_change \\s[+-]?{digit}
style_change ({font_change}{size_change}?|{size_change}{font_change}?)
typeface \.(B[IR]?|I[BR]?|R[BI])
+paragr \.[PITLH][Pp]
sec_request \.[Ss][HhYySs]
-comment ['.]\\{dbl_quote}
+comment (['.]\\{dbl_quote}|\'\-+|\\&)
/* Please add to this list if you know how. */
2007-12-12 18:16:54 +01:00
/* Note that, since flex only supports UTF-8 by accident, character classes
@@ -194,7 +196,26 @@ vi_name TÊN
zh_CN_name 名{blank}?称{blank}?.*
zh_TW_name (名{blank}?稱|命令名){blank}?.*
name ({bg_name}|{cs_name}|{da_name}|{de_name}|{en_name}|{es_name}|{fi_name}|{fr_name}|{hu_name}|{id_name}|{it_name}|{ja_name}|{ko_name}|{latin_name}|{nl_name}|{pl_name}|{ru_name}|{sk_name}|{sr_name}|{sv_name}|{tr_name}|{vi_name}|{zh_CN_name}|{zh_TW_name})
2006-12-19 00:17:06 +01:00
-name_sec {dbl_quote}?{style_change}?{name}{style_change}?({blank}*{dbl_quote})?
+name_sec {dbl_quote}?{style_change}?{name}{style_change}?({blank}*{dbl_quote})?\r?
+start {sec_request}{blank_eol}+{name_sec}
+
+N N(\bN)?
+n (N(\bN)?|n(\bn)?)
+a (A(\bA)?|a(\ba)?)
+o (O(\bO)?|o(\bo)?)
+m (M(\bM)?|M(\bM)?)
+e (E(\bE)?|e(\be)?)
+B B(\bB)
+b (B(\bB)?|b(\bb)?)
+r (R(\bR)?|r(\br)?)
+z (Z(\bZ)?|z(\bz)?)
+i (I(\bI)?|i(\bi)?)
+c (C(\bC)?|c(\bc)?)
+h (H(\bH)?|h(\bh)?)
+u (U(\bU)?|u(\bu)?)
+g (G(\bG)?|g(\bg)?)
+
2007-12-12 18:16:54 +01:00
+cname (({N}({a}|{o}){m}({n}|{e})|{N}{o}{m}|{N}{o}{m}{b}{r}{e}|{B}{e}{z}{e}{i}{c}{h}{n}{u}{n}{g})|{bg_name}|{cs_name}|{hu_name}|{ko_name}|{ru_name}|{sr_name}|{tr_name}|{vi_name}|{ja_name}|{zh_CN_name}|{zh_TW_name})
2006-12-19 00:17:06 +01:00
/* eptgrv : eqn, pic, tbl, grap, refer, vgrind */
tbl_request \.TS
2007-12-12 18:16:54 +01:00
@@ -208,8 +229,13 @@ vgrind_request \.vS
2006-12-19 00:17:06 +01:00
%%
/* begin NAME section processing */
-<MAN_FILE>{sec_request}{blank_eol}+{name_sec}{blank}* BEGIN (MAN_PRENAME);
-<CAT_FILE>{empty}{2,}{name}{blank}*{indent} BEGIN (CAT_NAME);
+<MAN_FILE>{
+ {start}{blank}*{bol}{blank}*{paragr} | /* strange format */
+ {start}{blank}* { /* default */
+ BEGIN (MAN_PRENAME);
+ }
+}
+<CAT_FILE>{empty}{2,}{cname}{blank}*{indent} BEGIN (CAT_NAME);
/* general text matching */
<MAN_FILE>\.[^Ss\r\n].* |
2007-12-12 18:16:54 +01:00
@@ -260,6 +286,7 @@ vgrind_request \.vS
2006-12-19 00:17:06 +01:00
<MAN_NAME>{bol}\.sp{blank}* | /* vertical spacing */
<MAN_NAME>{bol}\.ig{blank}* | /* block comment */
<MAN_NAME>{bol}\.de[1i]?{blank}* | /* macro definition */
+<MAN_NAME>{bol}\.V[be]{blank}* | /* special in perl pages */
<MAN_NAME>{empty}{bol}.+ |
<MAN_NAME><<EOF>> { /* terminate the string */
*p_name = '\0';
2007-12-12 18:16:54 +01:00
@@ -285,28 +312,31 @@ vgrind_request \.vS
2006-12-19 00:17:06 +01:00
{bol}{typeface}{blank}+ | /* type face commands */
2007-12-12 18:16:54 +01:00
{bol}\.ft{blank}.* | /* font change */
{bol}\.V[be]{blank}.* | /* pod2man, verbatim mode */
2006-12-19 00:17:06 +01:00
- {bol}\.IX{blank}.* | /* .IX line */
+ {bol}\.IX{blank}.* | /* index request */
{next}{comment}.* { /* per line comments */
newline_found ();
}
}
/* No-op requests */
-<MAN_NAME>{bol}\.{blank}*$ newline_found ();
-<MAN_NAME>{bol}\.\.$ newline_found ();
+<MAN_NAME>{bol}\.{blank}*/{eol} newline_found ();
+<MAN_NAME>{bol}\.\./{eol} newline_found ();
2007-12-12 18:16:54 +01:00
/* Toggle fill mode */
2006-12-19 00:17:06 +01:00
-<MAN_NAME>{bol}\.nf.* fill_mode = 0;
-<MAN_NAME>{bol}\.fi.* fill_mode = 1;
+<MAN_NAME>{bol}\.(nf|de).* fill_mode = 0;
+<MAN_NAME>{bol}\.(fi|\.).* fill_mode = 1;
<CAT_NAME>-{eol}{blank_eol}* /* strip continuations */
/* convert to DASH */
<MAN_NAME>{next}{blank}*\\\((mi|hy|em){blank}* |
+<MAN_NAME>{bol}\.sp{bol}{blank}+\\-{blank}* | /* strange spacing in NAME section */
+<MAN_NAME>{blank}+[-\\]?-{bol} | /* dash at end of line */
+<MAN_NAME>{next}{blank_eol}+(\\?-){2}{blank}+ | /* some man pages use -- as dash */
<MAN_NAME>{next}{blank_eol}+[-\\]-{blank}* |
<MAN_NAME>{next}{blank_eol}*[-\\]-{blank}+ |
<CAT_NAME>{next}{blank}+-{1,2}{blank_eol}+ |
-<MAN_NAME>{bol}\.Nd{blank}* add_separator_to_whatis ();
+<MAN_NAME>{bol}\.Nd{blank}* add_separator_to_whatis (yytext, yyleng);
/* escape sequences and special characters */
<MAN_NAME>{
2007-12-12 18:16:54 +01:00
@@ -322,6 +352,7 @@ vgrind_request \.vS
2006-12-19 00:17:06 +01:00
{next}\\[|^&!%acdpruz{}\r\n] /* various useless control chars */
{next}\\[bhlLvx]{blank}*'[^']+' /* various inline functions */
+ {next}\\\\\$[1-9] /* roff macro argument */
{next}\\\$[1-9] /* interpolate arg */
{next}\\\*(\({alpha})?{alpha} /* interpolate string */
2007-12-12 18:16:54 +01:00
@@ -350,11 +381,8 @@ vgrind_request \.vS
2006-12-19 00:17:06 +01:00
for later processing */
<MAN_NAME>{
{bol}\.br{blank}* |
- {bol}\.LP{blank}* |
- {bol}\.PP{blank}* |
+ {bol}{paragr}{blank}* |
2007-12-12 18:16:54 +01:00
{bol}\.P{blank}* |
- {bol}\.IP{blank}.* |
- {bol}\.HP{blank}.* |
{bol}\.RS{blank}.* |
{bol}\.RE{blank}.* add_char_to_whatis ((char) 0x11);
2006-12-19 00:17:06 +01:00
}
2007-12-12 18:16:54 +01:00
@@ -367,7 +395,7 @@ vgrind_request \.vS
2006-12-19 00:17:06 +01:00
<MAN_NAME>[[:alnum:]]* add_str_to_whatis (yytext, yyleng);
/* normalise the period (,) separators */
-<CAT_NAME>{blank}*,[ \t\r\n]* |
+<CAT_NAME>{blank}*,{blank_eol}* |
<MAN_NAME>{blank}*,{blank}* add_str_to_whatis (", ", 2);
<CAT_NAME,MAN_NAME>{bol}. {
2007-12-12 18:16:54 +01:00
@@ -383,7 +411,7 @@ vgrind_request \.vS
2006-12-19 00:17:06 +01:00
%%
/* print warning and force scanner to terminate */
-static void too_big (void)
+static __inline__ void too_big (void)
{
error (0, 0,
_("warning: whatis for %s exceeds %d bytes, truncating."),
2007-12-12 18:16:54 +01:00
@@ -393,7 +421,7 @@ static void too_big (void)
2006-12-19 00:17:06 +01:00
}
/* append a string to newname if enough room */
-static void add_str_to_whatis (const char *string, size_t length)
+static __inline__ void add_str_to_whatis (const char *string, size_t length)
{
if (p_name - newname + length >= MAX_NAME)
too_big ();
2007-12-12 18:16:54 +01:00
@@ -404,8 +432,10 @@ static void add_str_to_whatis (const cha
2006-12-19 00:17:06 +01:00
}
/* append a char to newname if enough room */
-static void add_char_to_whatis (unsigned char c)
+static __inline__ void add_char_to_whatis (unsigned char c)
{
+ if (c == (char) 0x11 && *p_name == (char) 0x11)
+ return;
if (p_name - newname + 1 >= MAX_NAME)
too_big ();
else if (waiting_for_quote && c == '"')
2007-12-12 18:16:54 +01:00
@@ -417,14 +447,30 @@ static void add_char_to_whatis (unsigned
2006-12-19 00:17:06 +01:00
/* append the " - " separator to newname, trimming the first space if one's
* already there
*/
-static void add_separator_to_whatis (void)
+static __inline__ void add_separator_to_whatis (const char *string, size_t len)
{
+ if (have_separator) {
+ unsigned int n;
+ unsigned char c;
+
+ for (n = 0; (n < len) && (c = string[n]); n++) {
+ switch (c) {
+ case '-':
+ case ' ':
+ add_char_to_whatis (c);
+ default:
+ break;
+ }
+ }
+ return;
+ }
+ have_separator = 1;
if (p_name != newname && *(p_name - 1) != ' ')
add_char_to_whatis (' ');
add_str_to_whatis ("- ", 2);
}
-static void newline_found (void)
+static __inline__ void newline_found (void)
{
/* If we are mid p_name and the last added char was not a space,
* best add one.
2007-12-12 18:16:54 +01:00
@@ -500,6 +546,7 @@ int find_name_decompressed (pipeline *p,
2006-12-19 00:17:06 +01:00
fill_mode = 1;
waiting_for_quote = 0;
+ have_separator = 0;
if (p_lg->type)
BEGIN (CAT_FILE);
2007-02-09 16:58:14 +01:00
--- src/man.c
2008-02-28 02:01:41 +01:00
+++ src/man.c 2008-02-26 13:05:42.254465287 +0100
2007-12-12 18:16:54 +01:00
@@ -98,6 +98,7 @@ static char *cwd;
2006-12-19 00:17:06 +01:00
#include <utime.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/time.h>
#if HAVE_SYS_WAIT_H
# include <sys/wait.h>
2007-12-12 18:16:54 +01:00
@@ -147,6 +148,8 @@ extern int errno;
2006-12-19 00:17:06 +01:00
#ifdef SECURE_MAN_UID
extern uid_t ruid;
extern uid_t euid;
+extern gid_t rgid;
+extern gid_t egid;
#endif /* SECURE_MAN_UID */
2007-12-12 18:16:54 +01:00
/* the default preprocessor sequence */
@@ -177,6 +180,10 @@ const char *lang;
2006-12-19 00:17:06 +01:00
static int global_manpath = -1; /* global or user manual page hierarchy? */
static int skip; /* page exists but has been skipped */
+static struct termios tms; /* To save terminal settings in */
+static int tms_set = 0; /* Do we have saved terminal settings? */
+
+static void set_term(void) { if (tms_set) tcsetattr(fileno(stdin), TCSANOW, &tms); }
#if defined _AIX || defined __sgi
char **global_argv;
2007-12-12 18:16:54 +01:00
@@ -249,7 +256,7 @@ static char *tmp_cat_file; /* for open_c
static int tmp_cat_fd;
static int created_tmp_cat; /* dto. */
static int man_modtime; /* modtime of man page, for commit_tmp_cat() */
-#endif
+#endif /* MAN_CATS */
static const struct option long_options[] =
{
@@ -295,9 +302,9 @@ static const struct option long_options[
2006-12-19 00:17:06 +01:00
static const char args[] = "7DlM:P:S:adfhH::kVum:p:tT::wWe:L:Zcr:X::E:iIC:";
# ifdef TROFF_IS_GROFF
-static int ditroff;
+static int ditroff = 0;
static const char *gxditview;
-static int htmlout;
+static int htmlout = 0;
static const char *html_pager;
# endif /* TROFF_IS_GROFF */
2007-12-12 18:16:54 +01:00
@@ -400,25 +407,6 @@ static void gripe_no_name (const char *s
2006-12-19 00:17:06 +01:00
exit (FAIL);
}
-static struct termios tms;
-static int tms_set = 0;
-
-static void set_term (void)
-{
- if (tms_set)
- tcsetattr (fileno (stdin), TCSANOW, &tms);
-}
-
-static void get_term (void)
-{
- if (isatty (fileno (stdout))) {
2007-12-12 18:16:54 +01:00
- debug ("is a tty\n");
2006-12-19 00:17:06 +01:00
- tcgetattr (fileno (stdin), &tms);
- if (!tms_set++)
- atexit (set_term);
- }
-}
-
2007-12-12 18:16:54 +01:00
static int get_roff_line_length (void)
{
int line_length = get_line_length ();
@@ -503,11 +491,11 @@ static __inline__ char **manopt_to_env (
2006-12-19 00:17:06 +01:00
{
char *manopt, *opt_start, **argv;
- manopt = getenv ("MANOPT");
+ opt_start = manopt = getenv ("MANOPT");
if (manopt == NULL || *manopt == '\0')
return NULL;
- opt_start = manopt = xstrdup (manopt);
+ manopt = xstrdup (manopt);
/* allocate space for the program name */
*argc = 0;
2008-02-28 02:01:41 +01:00
@@ -624,37 +612,52 @@ static int local_man_loop (const char *a
2006-12-19 00:17:06 +01:00
display (NULL, "", NULL, "(stdin)", NULL);
else {
struct stat st;
+ char *pwd = cwd;
+ char *file = basename((char*)argv);
2008-02-28 02:01:41 +01:00
- if (cwd[0]) {
- debug ("chdir %s\n", cwd);
- if (chdir (cwd)) {
- error (0, errno, _("can't chdir to %s"), cwd);
2006-12-19 00:17:06 +01:00
+ if (strcmp(argv, file)) {
+ char *dlm;
+ pwd = strdupa(argv);
2007-12-12 18:16:54 +01:00
+
2006-12-19 00:17:06 +01:00
+ if ((dlm = strrchr(pwd, '/')))
+ *dlm = '\0';
+ }
2008-02-28 02:01:41 +01:00
+
2007-12-12 18:16:54 +01:00
+ if (pwd[0]) {
+ debug ("chdir %s\n", pwd);
2006-12-19 00:17:06 +01:00
+ if (chdir (pwd)) {
+ error (0, errno, _("can't chdir to %s"), pwd);
regain_effective_privs ();
return 0;
}
}
/* Check that the file exists and isn't e.g. a directory */
- if (stat (argv, &st)) {
+ if (stat (file, &st)) {
error (0, errno, "%s", argv);
+ regain_effective_privs ();
return NOT_FOUND;
}
if (S_ISDIR (st.st_mode)) {
error (0, EISDIR, "%s", argv);
+ regain_effective_privs ();
return NOT_FOUND;
}
2007-12-12 18:16:54 +01:00
if (S_ISCHR (st.st_mode) || S_ISBLK (st.st_mode)) {
/* EINVAL is about the best I can do. */
error (0, EINVAL, "%s", argv);
+ regain_effective_privs ();
return NOT_FOUND;
}
2006-12-19 00:17:06 +01:00
if (exit_status == OK) {
char *argv_copy = xstrdup (argv);
lang = lang_dir (argv);
2008-02-28 02:01:41 +01:00
- if (!display (NULL, argv, NULL, basename (argv_copy),
2006-12-19 00:17:06 +01:00
+ if (!lang || !*lang)
+ lang = internal_locale;
2008-02-28 02:01:41 +01:00
+ if (!display (NULL, file, NULL, basename (argv_copy),
2007-12-12 18:16:54 +01:00
NULL)) {
2006-12-19 00:17:06 +01:00
if (local_mf)
2008-02-28 02:01:41 +01:00
error (0, errno, "%s", argv);
2007-12-12 18:16:54 +01:00
@@ -668,12 +671,6 @@ static int local_man_loop (const char *a
2006-12-19 00:17:06 +01:00
return exit_status;
}
-static void int_handler (int signo)
-{
2007-12-12 18:16:54 +01:00
- debug ("\ninterrupt signal %d handler\n", signo);
2006-12-19 00:17:06 +01:00
- exit (INTERRUPTED);
-}
-
int main (int argc, char *argv[])
{
int argc_env, exit_status = OK;
2007-12-12 18:16:54 +01:00
@@ -692,7 +689,16 @@ int main (int argc, char *argv[])
2006-12-19 00:17:06 +01:00
bindtextdomain (PACKAGE, LOCALEDIR);
textdomain (PACKAGE);
- internal_locale = setlocale (LC_MESSAGES, NULL);
+ internal_locale = setlocale (LC_MESSAGES, "");
+#if defined(__GLIBC__)
+# if (__GLIBC__ < 2) || (__GLIBC__ == 2 && __GLIBC_MINOR__ < 2)
+ if (!internal_locale) {
+ if ( !(internal_locale = getenv ("LC_ALL"))
+ && !(internal_locale = getenv ("LC_MESSAGES")))
+ internal_locale = getenv ("LANG");
+ }
+# endif
+#endif
/* Use LANGUAGE only when LC_MESSAGES locale category is
* neither "C" nor "POSIX". */
if (internal_locale && strcmp (internal_locale, "C") &&
2007-12-12 18:16:54 +01:00
@@ -745,8 +751,6 @@ int main (int argc, char *argv[])
2006-12-19 00:17:06 +01:00
init_security ();
#endif /* SECURE_MAN_UID */
- signal (SIGINT, int_handler);
-
pipeline_install_sigchld ();
2007-12-12 18:16:54 +01:00
read_config_file ();
@@ -755,9 +759,13 @@ int main (int argc, char *argv[])
2006-12-19 00:17:06 +01:00
if (external)
do_extern (argc, argv);
- get_term (); /* stores terminal settings */
#ifdef SECURE_MAN_UID
2007-12-12 18:16:54 +01:00
debug ("real user = %d; effective user = %d\n", ruid, euid);
+ if (isatty(fileno(stdin)) && isatty(fileno(stdout))) {
+ tcgetattr(fileno(stdin), &tms);
+ if (!tms_set++)
+ atexit(set_term);
2006-12-19 00:17:06 +01:00
+ }
#endif /* SECURE_MAN_UID */
#ifdef HAVE_SETLOCALE
2007-12-12 18:16:54 +01:00
@@ -776,6 +784,7 @@ int main (int argc, char *argv[])
2006-12-19 00:17:06 +01:00
setenv ("LANGUAGE", internal_locale, 1);
++_nl_msg_cat_cntr;
multiple_locale = NULL;
+#define MULTIPLE_LOCALE_IS_NULL 1
}
}
2007-12-12 18:16:54 +01:00
@@ -838,6 +847,22 @@ int main (int argc, char *argv[])
2006-12-19 00:17:06 +01:00
}
if (manp == NULL) {
+#if MULTIPLE_LOCALE_IS_NULL
+ char * tmp_locale = xstrdup(internal_locale);
+ char * ptr;
+
2007-12-12 18:16:54 +01:00
+ manp = get_manpath (alt_system_name);
2006-12-19 00:17:06 +01:00
+
+ /*
+ * Use strsep () to not intermix with strtok ()
+ */
+ for (ptr = strsep (&tmp_locale, ":"); ptr; ptr = strsep (&tmp_locale, ":")) {
+ if (debug)
+ fprintf (stderr, "checking for locale %s\n", ptr);
+ manp = add_nls_manpath (manp, ptr);
+ }
+ free(tmp_locale);
+#else
char tmp_locale[3];
int idx;
2007-12-12 18:16:54 +01:00
@@ -859,6 +884,7 @@ int main (int argc, char *argv[])
debug ("checking for locale %s\n", tmp_locale);
2006-12-19 00:17:06 +01:00
manp = add_nls_manpath (manp, tmp_locale);
}
+#endif
} else
2007-12-12 18:16:54 +01:00
free (get_manpath (NULL));
2006-12-19 00:17:06 +01:00
2007-12-12 18:16:54 +01:00
@@ -1177,7 +1203,7 @@ static __inline__ const char *is_section
}
2006-12-19 00:17:06 +01:00
2007-12-12 18:16:54 +01:00
/* Snarf pre-processors from file, return (static) string or NULL on failure */
-static const char *get_preprocessors_from_file (pipeline *decomp)
+static const char *get_preprocessors_from_file (pipeline *decomp, char * pp_encoding)
2006-12-19 00:17:06 +01:00
{
2007-12-12 18:16:54 +01:00
static char *directive = NULL;
2006-12-19 00:17:06 +01:00
2007-12-12 18:16:54 +01:00
@@ -1196,7 +1222,8 @@ static const char *get_preprocessors_fro
if (!line)
return NULL;
2006-12-19 00:17:06 +01:00
2007-12-12 18:16:54 +01:00
- if (!strncmp (line, PP_COOKIE, 4)) {
+ if (!strncmp (line, PP_COOKIE, 4) ||
+ (strlen(line) == 6 && !strncmp(line, ".\\\" ", 4))) {
const char *newline = strchr (line, '\n');
if (newline)
directive = xstrndup (line + 4, newline - (line + 4));
@@ -1204,6 +1231,25 @@ static const char *get_preprocessors_fro
directive = xstrdup (line + 4);
}
+ if (directive && strstr (directive, "-*-")) {
+ const char *pp_search = strstr (directive, "-*-") + 3;
+ while (*pp_search == ' ')
+ ++pp_search;
+ if (STRNEQ (pp_search, "coding:", 7)) {
+ const char *pp_encoding_end;
+ pp_search += 7;
+ while (*pp_search == ' ')
+ ++pp_search;
+ pp_encoding_end = strchr (pp_search, ' ');
+ if (pp_encoding_end) {
+ size_t len = pp_encoding_end - pp_search;
+ pp_encoding = xstrndup (pp_search, len);
2006-12-19 00:17:06 +01:00
+ } else
2007-12-12 18:16:54 +01:00
+ pp_encoding = xstrdup (pp_search);
+ debug ("preprocessor encoding: %s\n", pp_encoding);
+ }
+ }
+
/* if we didn't find PP_COOKIE, then directive == NULL */
#endif
return directive;
@@ -1212,7 +1258,7 @@ static const char *get_preprocessors_fro
/* Determine pre-processors, set save_cat and return
(static) string */
-static const char *get_preprocessors (pipeline *decomp, const char *dbfilters)
+static const char *get_preprocessors (pipeline *decomp, const char *dbfilters, char * pp_encoding)
{
const char *pp_string;
const char *pp_source;
@@ -1226,7 +1272,7 @@ static const char *get_preprocessors (pi
} else if ((pp_string = preprocessors)) {
pp_source = "command line";
save_cat = 0;
- } else if ((pp_string = get_preprocessors_from_file (decomp))) {
+ } else if ((pp_string = get_preprocessors_from_file (decomp, pp_encoding))) {
pp_source = "file";
save_cat = 1;
} else if ((pp_string = getenv ("MANROFFSEQ"))) {
@@ -1251,6 +1297,7 @@ static pipeline *make_roff_command (cons
pipeline *decomp, const char *dbfilters)
{
const char *pp_string;
+ char *pp_encoding;
char *fmt_prog;
pipeline *p = pipeline_new ();
command *cmd;
2008-01-30 18:47:16 +01:00
@@ -1259,13 +1306,13 @@ static pipeline *make_roff_command (cons
2007-12-12 18:16:54 +01:00
dir = dir; /* not used unless looking for formatters in catdir */
#endif
- pp_string = get_preprocessors (decomp, dbfilters);
+ pp_encoding = (char*)0;
+ pp_string = get_preprocessors (decomp, dbfilters, pp_encoding);
#ifdef ALT_EXT_FORMAT
/* Check both external formatter locations */
2008-01-30 18:47:16 +01:00
if (dir) {
- char *catpath = get_catpath
- (dir, global_manpath ? SYSTEM_CAT : USER_CAT);
+ char *catpath = get_catpath (dir, global_manpath ? SYSTEM_CATP : USER_CATP);
/* If we have an alternate catpath */
if (catpath) {
@@ -1318,7 +1365,10 @@ static pipeline *make_roff_command (cons
2007-12-12 18:16:54 +01:00
#define STRC(s, otherwise) ((s) ? (s) : (otherwise))
- page_encoding = get_page_encoding (lang);
+ if (pp_encoding)
+ page_encoding = pp_encoding;
+ else
+ page_encoding = get_page_encoding (lang);
source_encoding = get_source_encoding (lang);
debug ("page_encoding = %s\n", page_encoding);
debug ("source_encoding = %s\n", source_encoding);
2008-01-30 18:47:16 +01:00
@@ -1632,6 +1682,18 @@ static void setenv_less (const char *tit
2006-12-19 00:17:06 +01:00
free (less_opts);
}
+static void disable_x(void)
+{
+ char *bname = basename((char*)pager);
+ if (bname) {
+ if (!strcmp(bname, "less"))
+ unsetenv("DISPLAY");
+#if 0
+ free(bname);
+#endif
+ }
+}
+
/* Return pipeline to display file. NULL means stdin.
*
* TODO: htmlout case is pretty weird now. I'd like the intelligence to be
2008-01-30 18:47:16 +01:00
@@ -1644,6 +1706,9 @@ static pipeline *make_display_command (c
2006-12-19 00:17:06 +01:00
setenv_less (title);
+ if (!htmlout)
+ disable_x();
+
if (file) {
if (ascii) {
p = pipeline_new ();
2008-01-30 18:47:16 +01:00
@@ -1686,7 +1751,7 @@ static pipeline *make_display_command (c
2007-12-12 18:16:54 +01:00
return p;
}
-
+#ifdef MAN_CATS
/* return a (malloced) temporary name in cat_file's directory */
static char *tmp_cat_filename (const char *cat_file)
{
2008-01-30 18:47:16 +01:00
@@ -1789,8 +1854,6 @@ static int commit_tmp_cat (const char *c
2007-12-12 18:16:54 +01:00
return status;
}
-#ifdef MAN_CATS
-
/* Return pipeline to write formatted manual page to for saving as cat file. */
static pipeline *open_cat_stream (const char *cat_file)
{
2008-01-30 18:47:16 +01:00
@@ -1864,6 +1927,7 @@ static int close_cat_stream (pipeline *c
2007-12-12 18:16:54 +01:00
free (tmp_cat_file);
return status;
}
+#endif /* MAN_CATS */
/* TODO: This should all be refactored after work on the decompression
* library is complete.
2008-01-30 18:47:16 +01:00
@@ -1876,6 +1940,7 @@ void discard_stderr (pipeline *p)
2007-12-12 18:16:54 +01:00
p->commands[i]->discard_err = 1;
}
+#ifdef MAN_CATS
/*
* format a manual page with format_cmd, display it with disp_cmd, and
* save it to cat_file
2008-01-30 18:47:16 +01:00
@@ -2037,6 +2102,7 @@ static void format_display (pipeline *de
2007-12-12 18:16:54 +01:00
regain_effective_privs ();
}
+#ifdef MAN_CATS
/* "Display" a page in catman mode, which amounts to saving it. */
/* TODO: merge with format_display_and_save? */
static void display_catman (const char *cat_file, pipeline *decomp,
2008-01-30 18:47:16 +01:00
@@ -2074,6 +2140,7 @@ static void display_catman (const char *
2007-12-12 18:16:54 +01:00
pop_cleanup();
free (tmpcat);
}
+#endif /* MAN_CATS */
/*
* optionally chdir to dir, if necessary update cat_file from man_file
2008-01-30 18:47:16 +01:00
@@ -2096,10 +2163,18 @@ static int display (const char *dir, con
2007-12-12 18:16:54 +01:00
if (dir) {
debug ("chdir %s\n", dir);
2006-12-19 00:17:06 +01:00
+ if (global_manpath)
+ drop_effective_privs();
+
if (chdir (dir)) {
error (0, errno, _("can't chdir to %s"), dir);
+ if (global_manpath)
+ regain_effective_privs();
return 0;
}
+
+ if (global_manpath)
+ regain_effective_privs();
}
/* define format_cmd */
2008-01-30 18:47:16 +01:00
@@ -2112,11 +2187,10 @@ static int display (const char *dir, con
2007-12-12 18:16:54 +01:00
if (decomp) {
pipeline_start (decomp);
- format_cmd = make_roff_command (dir, man_file, decomp,
- dbfilters);
+ format_cmd = make_roff_command (dir, man_file, decomp, dbfilters);
} else
format_cmd = NULL;
-
+#ifdef MAN_CATS
/* Get modification time, for commit_tmp_cat(). */
if (man_file && *man_file) {
struct stat stb;
2008-01-30 18:47:16 +01:00
@@ -2125,7 +2199,7 @@ static int display (const char *dir, con
2006-12-19 00:17:06 +01:00
else
2007-12-12 18:16:54 +01:00
man_modtime = stb.st_mtime;
2006-12-19 00:17:06 +01:00
}
2007-12-12 18:16:54 +01:00
-
+#endif /* MAN_CATS */
display_to_stdout = troff;
#ifdef TROFF_IS_GROFF
if (htmlout)
2008-01-30 18:47:16 +01:00
@@ -2236,6 +2310,7 @@ static int display (const char *dir, con
2007-12-12 18:16:54 +01:00
printf ("%s", cat_file);
}
putchar ('\n');
+#ifdef MAN_CATS
} else if (catman) {
if (format) {
if (!save_cat)
2008-01-30 18:47:16 +01:00
@@ -2247,6 +2322,7 @@ static int display (const char *dir, con
2007-12-12 18:16:54 +01:00
display_catman (cat_file, decomp,
format_cmd);
}
+#endif /* MAN_CATS */
} else if (format) {
/* no cat or out of date */
pipeline *disp_cmd;
2008-01-30 18:47:16 +01:00
@@ -2296,8 +2372,10 @@ static int display (const char *dir, con
2006-12-19 00:17:06 +01:00
}
}
- pipeline_free (format_cmd);
2007-12-12 18:16:54 +01:00
- pipeline_free (decomp);
2006-12-19 00:17:06 +01:00
+ if (format_cmd)
+ pipeline_free (format_cmd);
2007-12-12 18:16:54 +01:00
+ if (decomp)
+ pipeline_free (decomp);
if (!prompt)
prompt = found;
2008-01-30 18:47:16 +01:00
@@ -2338,8 +2416,7 @@ static char *find_cat_file (const char *
2007-12-12 18:16:54 +01:00
*/
if (!STREQ (man_file, original)) {
global_manpath = is_global_mandir (man_file);
- cat_path = get_catpath
- (man_file, global_manpath ? SYSTEM_CAT : USER_CAT);
2008-01-30 18:47:16 +01:00
+ cat_path = get_catpath (man_file, (global_manpath ? SYSTEM_CATP : USER_CATP)|FILE_CATP);
2007-12-12 18:16:54 +01:00
if (cat_path) {
cat_file = convert_name (cat_path, 0);
2008-01-30 18:47:16 +01:00
@@ -2366,8 +2443,7 @@ static char *find_cat_file (const char *
2006-12-19 00:17:06 +01:00
}
2007-12-12 18:16:54 +01:00
global_manpath = is_global_mandir (original);
- cat_path = get_catpath
- (original, global_manpath ? SYSTEM_CAT : USER_CAT);
2008-01-30 18:47:16 +01:00
+ cat_path = get_catpath (original, (global_manpath ? SYSTEM_CATP : USER_CATP)|FILE_CATP);
2007-12-12 18:16:54 +01:00
if (cat_path) {
cat_file = convert_name (cat_path, 0);
2008-01-30 18:47:16 +01:00
@@ -2860,9 +2936,7 @@ static int display_database (struct cand
if (access (file, R_OK) != 0) {
char *catpath;
- catpath = get_catpath (candp->path,
- global_manpath ? SYSTEM_CAT
- : USER_CAT);
+ catpath = get_catpath (candp->path, global_manpath ? SYSTEM_CATP : USER_CATP);
if (catpath && strcmp (catpath, candp->path) != 0) {
file = make_filename (catpath, name,
@@ -2899,7 +2973,7 @@ static int display_database_check (struc
2006-12-19 00:17:06 +01:00
#ifdef MAN_DB_UPDATES
if (!exists && !skip) {
2007-12-12 18:16:54 +01:00
debug ("dbdelete_wrapper (%s, %p)\n",
- candp->req_name, candp->source);
+ candp->req_name, candp->source->addr);
2006-12-19 00:17:06 +01:00
dbdelete_wrapper (candp->req_name, candp->source);
}
#endif /* MAN_DB_UPDATES */
2008-01-30 18:47:16 +01:00
@@ -2977,7 +3051,7 @@ static int try_db (const char *manpath,
2007-12-12 18:16:54 +01:00
/* find out where our db for this manpath should be */
- catpath = get_catpath (manpath, global_manpath ? SYSTEM_CAT : USER_CAT);
2008-01-30 18:47:16 +01:00
+ catpath = get_catpath (manpath, (global_manpath ? SYSTEM_CATP : USER_CATP)|FILE_CATP);
2007-12-12 18:16:54 +01:00
if (catpath) {
database = mkdbname (catpath);
free (catpath);
2007-02-09 16:58:14 +01:00
--- src/man_db.conf.in
2007-12-12 18:16:54 +01:00
+++ src/man_db.conf.in 2007-12-11 13:27:28.109209000 +0100
@@ -20,6 +20,15 @@
MANDATORY_MANPATH /usr/man
2006-12-19 00:17:06 +01:00
MANDATORY_MANPATH /usr/share/man
MANDATORY_MANPATH /usr/local/man
+MANDATORY_MANPATH /usr/local/share/man
+MANDATORY_MANPATH /opt/man
2007-02-15 18:25:11 +01:00
+MANDATORY_MANPATH /opt/dx/man
+MANDATORY_MANPATH /opt/lsb/man
+MANDATORY_MANPATH /opt/cross/share/man
+MANDATORY_MANPATH /opt/mpich/man
+MANDATORY_MANPATH /opt/lsb-tet3-lite/share/man
+MANDATORY_MANPATH /opt/snavigator/man
+MANDATORY_MANPATH /opt/novell/man
2006-12-19 00:17:06 +01:00
#---------------------------------------------------------
# set up PATH to MANPATH mapping
# ie. what man tree holds man pages for what binary directory.
2007-12-12 18:16:54 +01:00
@@ -34,8 +43,10 @@ MANPATH_MAP /usr/local/bin /usr/local/m
2007-02-15 18:25:11 +01:00
MANPATH_MAP /usr/local/bin /usr/local/share/man
MANPATH_MAP /usr/local/sbin /usr/local/man
2006-12-19 00:17:06 +01:00
MANPATH_MAP /usr/local/sbin /usr/local/share/man
2007-02-15 18:25:11 +01:00
-MANPATH_MAP /usr/X11R6/bin /usr/X11R6/man
-MANPATH_MAP /usr/bin/X11 /usr/X11R6/man
+MANPATH_MAP /usr/X11R6/bin /usr/share/man
+MANPATH_MAP /usr/X11/bin /usr/share/man
+MANPATH_MAP /usr/bin/X11 /usr/share/man
2006-12-19 00:17:06 +01:00
+MANPATH_MAP /usr/bin/mh /usr/share/man
MANPATH_MAP /usr/games /usr/share/man
MANPATH_MAP /opt/bin /opt/man
MANPATH_MAP /opt/sbin /opt/man
2007-12-12 18:16:54 +01:00
@@ -63,12 +74,133 @@ MANPATH_MAP /opt/sbin /opt/man
2006-12-19 00:17:06 +01:00
#
# *MANPATH* -> *CATPATH*
#
-MANDB_MAP /usr/man /var/cache/man/fsstnd
2007-02-15 18:25:11 +01:00
+MANDB_MAP /usr/share/man/ca /var/cache/man/ca
2006-12-19 00:17:06 +01:00
+MANDB_MAP /usr/share/man/cs /var/cache/man/cs
+MANDB_MAP /usr/share/man/cs_CZ /var/cache/man/cs
+MANDB_MAP /usr/share/man/da /var/cache/man/da
+MANDB_MAP /usr/share/man/de /var/cache/man/de
+MANDB_MAP /usr/share/man/de_AT /var/cache/man/de
+MANDB_MAP /usr/share/man/de_DE /var/cache/man/de
2007-02-15 18:25:11 +01:00
+MANDB_MAP /usr/share/man/en /var/cache/man/en
2006-12-19 00:17:06 +01:00
+MANDB_MAP /usr/share/man/es /var/cache/man/es
+MANDB_MAP /usr/share/man/es_ES /var/cache/man/es
2007-02-15 18:25:11 +01:00
+MANDB_MAP /usr/share/man/et /var/cache/man/et
2006-12-19 00:17:06 +01:00
+MANDB_MAP /usr/share/man/fi /var/cache/man/fi
+MANDB_MAP /usr/share/man/fr_FR /var/cache/man/fr
+MANDB_MAP /usr/share/man/ga /var/cache/man/ga
+MANDB_MAP /usr/share/man/is /var/cache/man/is
+MANDB_MAP /usr/share/man/it /var/cache/man/it
+MANDB_MAP /usr/share/man/ja /var/cache/man/ja
+MANDB_MAP /usr/share/man/ja_JP /var/cache/man/ja
+MANDB_MAP /usr/share/man/ja_JP.eucJP /var/cache/man/ja
+MANDB_MAP /usr/share/man/ko /var/cache/man/ko
+MANDB_MAP /usr/share/man/nl /var/cache/man/nl
+MANDB_MAP /usr/share/man/no /var/cache/man/no
+MANDB_MAP /usr/share/man/pl /var/cache/man/pl
+MANDB_MAP /usr/share/man/pt /var/cache/man/pt
+MANDB_MAP /usr/share/man/pt_BR /var/cache/man/pt
+MANDB_MAP /usr/share/man/ru /var/cache/man/ru
2007-02-15 18:25:11 +01:00
+MANDB_MAP /usr/share/man/sk /var/cache/man/sk
2006-12-19 00:17:06 +01:00
+MANDB_MAP /usr/share/man/sr /var/cache/man/sr
+MANDB_MAP /usr/share/man/sv /var/cache/man/sv
2007-02-15 18:25:11 +01:00
+MANDB_MAP /usr/share/man/uk /var/cache/man/uk
2006-12-19 00:17:06 +01:00
MANDB_MAP /usr/share/man /var/cache/man
-MANDB_MAP /usr/local/man /var/cache/man/oldlocal
-MANDB_MAP /usr/local/share/man /var/cache/man/local
2007-02-15 18:25:11 +01:00
-MANDB_MAP /usr/X11R6/man /var/cache/man/X11R6
-MANDB_MAP /opt/man /var/cache/man/opt
2006-12-19 00:17:06 +01:00
+#
2007-02-15 18:25:11 +01:00
+MANDB_MAP /usr/local/man/ca /var/cache/man/local/ca
2006-12-19 00:17:06 +01:00
+MANDB_MAP /usr/local/man/cs /var/cache/man/local/cs
+MANDB_MAP /usr/local/man/cs_CZ /var/cache/man/local/cs
+MANDB_MAP /usr/local/man/da /var/cache/man/local/da
+MANDB_MAP /usr/local/man/de /var/cache/man/local/de
+MANDB_MAP /usr/local/man/de_AT /var/cache/man/local/de
+MANDB_MAP /usr/local/man/de_DE /var/cache/man/local/de
2007-02-15 18:25:11 +01:00
+MANDB_MAP /usr/local/man/en /var/cache/man/local/en
2006-12-19 00:17:06 +01:00
+MANDB_MAP /usr/local/man/es /var/cache/man/local/es
+MANDB_MAP /usr/local/man/es_ES /var/cache/man/local/es
2007-02-15 18:25:11 +01:00
+MANDB_MAP /usr/local/man/et /var/cache/man/local/et
2006-12-19 00:17:06 +01:00
+MANDB_MAP /usr/local/man/fi /var/cache/man/local/fi
+MANDB_MAP /usr/local/man/fr_FR /var/cache/man/local/fr
+MANDB_MAP /usr/local/man/ga /var/cache/man/local/ga
+MANDB_MAP /usr/local/man/is /var/cache/man/local/is
+MANDB_MAP /usr/local/man/it /var/cache/man/local/it
+MANDB_MAP /usr/local/man/ja /var/cache/man/local/ja
+MANDB_MAP /usr/local/man/ja_JP /var/cache/man/local/ja
+MANDB_MAP /usr/local/man/ja_JP.eucJP /var/cache/man/local/ja
+MANDB_MAP /usr/local/man/ko /var/cache/man/local/ko
+MANDB_MAP /usr/local/man/nl /var/cache/man/local/nl
+MANDB_MAP /usr/local/man/no /var/cache/man/local/no
+MANDB_MAP /usr/local/man/pl /var/cache/man/local/pl
+MANDB_MAP /usr/local/man/pt /var/cache/man/local/pt
+MANDB_MAP /usr/local/man/pt_BR /var/cache/man/local/pt
+MANDB_MAP /usr/local/man/ru /var/cache/man/local/ru
2007-02-15 18:25:11 +01:00
+MANDB_MAP /usr/local/man/sk /var/cache/man/local/sk
2006-12-19 00:17:06 +01:00
+MANDB_MAP /usr/local/man/sr /var/cache/man/local/sr
+MANDB_MAP /usr/local/man/sv /var/cache/man/local/sv
2007-02-15 18:25:11 +01:00
+MANDB_MAP /usr/local/man/uk /var/cache/man/local/uk
2006-12-19 00:17:06 +01:00
+MANDB_MAP /usr/local/man /var/cache/man/local
+#
2007-02-15 18:25:11 +01:00
+MANDB_MAP /usr/local/share/man/ca /var/cache/man/local/ca
2006-12-19 00:17:06 +01:00
+MANDB_MAP /usr/local/share/man/cs /var/cache/man/local/cs
+MANDB_MAP /usr/local/share/man/cs_CZ /var/cache/man/local/cs
+MANDB_MAP /usr/local/share/man/da /var/cache/man/local/da
+MANDB_MAP /usr/local/share/man/de /var/cache/man/local/de
+MANDB_MAP /usr/local/share/man/de_AT /var/cache/man/local/de
+MANDB_MAP /usr/local/share/man/de_DE /var/cache/man/local/de
2007-02-15 18:25:11 +01:00
+MANDB_MAP /usr/local/share/man/en /var/cache/man/local/en
2006-12-19 00:17:06 +01:00
+MANDB_MAP /usr/local/share/man/es /var/cache/man/local/es
+MANDB_MAP /usr/local/share/man/es_ES /var/cache/man/local/es
2007-02-15 18:25:11 +01:00
+MANDB_MAP /usr/local/share/man/et /var/cache/man/local/et
2006-12-19 00:17:06 +01:00
+MANDB_MAP /usr/local/share/man/fi /var/cache/man/local/fi
+MANDB_MAP /usr/local/share/man/fr_FR /var/cache/man/local/fr
+MANDB_MAP /usr/local/share/man/ga /var/cache/man/local/ga
+MANDB_MAP /usr/local/share/man/is /var/cache/man/local/is
+MANDB_MAP /usr/local/share/man/it /var/cache/man/local/it
+MANDB_MAP /usr/local/share/man/ja /var/cache/man/local/ja
+MANDB_MAP /usr/local/share/man/ja_JP /var/cache/man/local/ja
+MANDB_MAP /usr/local/share/man/ja_JP.eucJP /var/cache/man/local/ja
+MANDB_MAP /usr/local/share/man/ko /var/cache/man/local/ko
+MANDB_MAP /usr/local/share/man/nl /var/cache/man/local/nl
+MANDB_MAP /usr/local/share/man/no /var/cache/man/local/no
+MANDB_MAP /usr/local/share/man/pl /var/cache/man/local/pl
+MANDB_MAP /usr/local/share/man/pt /var/cache/man/local/pt
+MANDB_MAP /usr/local/share/man/pt_BR /var/cache/man/local/pt
+MANDB_MAP /usr/local/share/man/ru /var/cache/man/local/ru
2007-02-15 18:25:11 +01:00
+MANDB_MAP /usr/local/share/man/sk /var/cache/man/local/sk
2006-12-19 00:17:06 +01:00
+MANDB_MAP /usr/local/share/man/sr /var/cache/man/local/sr
+MANDB_MAP /usr/local/share/man/sv /var/cache/man/local/sv
2007-02-15 18:25:11 +01:00
+MANDB_MAP /usr/local/share/man/uk /var/cache/man/local/uk
2006-12-19 00:17:06 +01:00
+MANDB_MAP /usr/local/share/man /var/cache/man/local
+#
2007-02-15 18:25:11 +01:00
+MANDB_MAP /opt/share/man/ca /var/cache/man/opt/ca
2006-12-19 00:17:06 +01:00
+MANDB_MAP /opt/share/man/cs /var/cache/man/opt/cs
+MANDB_MAP /opt/share/man/cs_CZ /var/cache/man/opt/cs
+MANDB_MAP /opt/share/man/da /var/cache/man/opt/da
+MANDB_MAP /opt/share/man/de /var/cache/man/opt/de
+MANDB_MAP /opt/share/man/de_AT /var/cache/man/opt/de
+MANDB_MAP /opt/share/man/de_DE /var/cache/man/opt/de
2007-02-15 18:25:11 +01:00
+MANDB_MAP /opt/share/man/en /var/cache/man/opt/en
+MANDB_MAP /opt/share/man/es /var/cache/man/opt/es
2006-12-19 00:17:06 +01:00
+MANDB_MAP /opt/share/man/es /var/cache/man/opt/es
2007-02-15 18:25:11 +01:00
+MANDB_MAP /opt/share/man/et /var/cache/man/opt/et
2006-12-19 00:17:06 +01:00
+MANDB_MAP /opt/share/man/fi /var/cache/man/opt/fi
+MANDB_MAP /opt/share/man/fr_FR /var/cache/man/opt/fr
+MANDB_MAP /opt/share/man/ga /var/cache/man/opt/ga
+MANDB_MAP /opt/share/man/is /var/cache/man/opt/is
+MANDB_MAP /opt/share/man/it /var/cache/man/opt/it
+MANDB_MAP /opt/share/man/ja /var/cache/man/opt/ja
2007-12-12 18:16:54 +01:00
+MANDB_MAP /opt/share/man/ja_JP /var/cache/man/opt/ja
2006-12-19 00:17:06 +01:00
+MANDB_MAP /opt/share/man/ja_JP.eucJP /var/cache/man/opt/ja
+MANDB_MAP /opt/share/man/ko /var/cache/man/opt/ko
+MANDB_MAP /opt/share/man/nl /var/cache/man/opt/nl
+MANDB_MAP /opt/share/man/no /var/cache/man/opt/no
+MANDB_MAP /opt/share/man/pl /var/cache/man/opt/pl
+MANDB_MAP /opt/share/man/pt /var/cache/man/opt/pt
+MANDB_MAP /opt/share/man/pt_BR /var/cache/man/opt/pt
+MANDB_MAP /opt/share/man/ru /var/cache/man/opt/ru
2007-02-15 18:25:11 +01:00
+MANDB_MAP /opt/share/man/sk /var/cache/man/opt/sk
2006-12-19 00:17:06 +01:00
+MANDB_MAP /opt/share/man/sr /var/cache/man/opt/sr
+MANDB_MAP /opt/share/man/sv /var/cache/man/opt/sv
2007-02-15 18:25:11 +01:00
+MANDB_MAP /opt/share/man/uk /var/cache/man/opt/uk
2006-12-19 00:17:06 +01:00
+MANDB_MAP /opt/share/man /var/cache/man/opt
#
#---------------------------------------------------------
# Program definitions. These are commented out by default as the value
2007-12-12 18:16:54 +01:00
@@ -80,7 +212,7 @@ MANDB_MAP /opt/man /var/cache/man/opt
2006-12-19 00:17:06 +01:00
#DEFINE tr @tr@ '\255\267\264\327' '\055\157\047\170'
#DEFINE grep @grep@
#DEFINE troff @troff@
-#DEFINE nroff @nroff@
+#DEFINE nroff /usr/bin/nroff -mandocdb
#DEFINE eqn @eqn@
#DEFINE neqn @neqn@
#DEFINE tbl @tbl@
2007-12-12 18:16:54 +01:00
@@ -107,7 +239,7 @@ MANDB_MAP /opt/man /var/cache/man/opt
2006-12-19 00:17:06 +01:00
# is that you only need to explicitly list extensions if you want to force a
# particular order. Sections with extensions should usually be adjacent to
# their main section (e.g. "1 1mh 8 ...").
-SECTION 1 n l 8 3 2 3posix 3pm 3perl 5 4 9 6 7
2007-02-15 18:25:11 +01:00
+SECTION 0 1 n l 8 3 2 5 4 9 6 7 1x 3x 4x 5x 6x 8x 1bind 3bind 5bind 7bind 8bind 1cn 8cn 1m 1mh 5mh 8mh 1netpbm 3netpbm 5netpbm 0p 1p 3p 1pgsql 3C++ 3blt 3blt 3curses 3ncurses 3form 3menu 3db 3gdbm 3f 3gk 3mm 3paper 3perl 3pgsql 3pm 3posix 3pq 3qt 3pub 3readline 1ssl 3ssl 5ssl 7ssl 3t 3tk 3tcl 3tclx 3tix 5mm 5pgsql 7l 7nr 8C++ 8c Cg g s m
2007-12-12 18:16:54 +01:00
#---------------------------------------------------------
# Flags.
# NOCACHE keeps man from creating cat pages.
2007-02-09 16:58:14 +01:00
--- src/mandb.c
2008-02-28 02:01:41 +01:00
+++ src/mandb.c 2008-01-30 12:01:40.242753000 +0100
2007-12-12 18:16:54 +01:00
@@ -143,6 +143,8 @@ static const char *xtmpfile;
2006-12-19 00:17:06 +01:00
#ifdef SECURE_MAN_UID
extern uid_t ruid;
extern uid_t euid;
+extern gid_t rgid;
+extern gid_t egid;
#endif /* SECURE_MAN_UID */
2007-12-12 18:16:54 +01:00
static char *manpathlist[MAXDIRS];
2008-01-30 18:47:16 +01:00
@@ -463,10 +465,13 @@ static short process_manpath (const char
short amount = 0;
if (global_manpath) { /* system db */
- catpath = get_catpath (manpath, SYSTEM_CAT);
- assert (catpath);
+ catpath = get_catpath (manpath, SYSTEM_CATP);
+ if (!catpath) {
+ error (0, 0, _("warning: no system cat path for man path %s"), manpath);
+ return amount;
+ }
} else { /* user db */
- catpath = get_catpath (manpath, USER_CAT);
+ catpath = get_catpath (manpath, USER_CATP);
if (!catpath)
catpath = xstrdup (manpath);
}
@@ -497,7 +502,7 @@ static short process_manpath (const char
2007-12-12 18:16:54 +01:00
if (!opt_test && amount) {
finish_up ();
#ifdef SECURE_MAN_UID
- if (global_manpath && euid == 0)
+ if (global_manpath && (euid == 0 || ruid == 0))
do_chown (man_owner->pw_uid);
#endif /* SECURE_MAN_UID */
}
2008-01-30 18:47:16 +01:00
@@ -610,8 +615,14 @@ int main (int argc, char *argv[])
2006-12-19 00:17:06 +01:00
error (FAIL, 0,
_("the setuid man user \"%s\" does not exist"),
MAN_OWNER);
- if (!user && euid != 0 && euid != man_owner->pw_uid)
- user = 1;
+ if (!user) {
+ if (!ruid && euid != man_owner->pw_uid) {
+ seteuid(man_owner->pw_uid);
+ euid = geteuid();
+ }
+ if (euid != man_owner->pw_uid)
+ user = 1;
+ }
#endif /* SECURE_MAN_UID */
2007-02-09 16:58:14 +01:00
--- src/manp.c
2008-02-28 02:01:41 +01:00
+++ src/manp.c 2008-01-30 12:01:02.982017000 +0100
2007-12-12 18:16:54 +01:00
@@ -63,6 +63,7 @@
2006-12-19 00:17:06 +01:00
# include <strings.h>
#else /* no string(s) header */
extern char *strtok();
+extern char *strsep();
extern char *strchr();
extern char *strstr();
#endif
2007-12-12 18:16:54 +01:00
@@ -86,6 +87,7 @@ extern int errno;
2006-12-19 00:17:06 +01:00
#include "security.h"
2007-12-12 18:16:54 +01:00
#include "encodings.h"
2006-12-19 00:17:06 +01:00
#include "manp.h"
+#include "security.h"
struct list {
char *key;
2007-12-12 18:16:54 +01:00
@@ -694,6 +696,8 @@ char *get_manpath (const char *systems)
2006-12-19 00:17:06 +01:00
#ifdef SECURE_MAN_UID
extern uid_t ruid; /* initial real user id */
extern uid_t euid; /* initial effective user id */
+extern gid_t rgid; /* initial real group id */
+extern gid_t egid; /* initial effective group id */
#endif /* SECURE_MAN_UID */
/* create the catman hierarchy if it doesn't exist */
2007-12-12 18:16:54 +01:00
@@ -722,6 +726,8 @@ mkcatdirs (const char *mandir, const cha
2006-12-19 00:17:06 +01:00
#ifdef SECURE_MAN_UID
if (ruid == 0)
chown (catdir, man_owner->pw_uid, 0);
+ if (rgid == 0)
+ chown (catdir, -1, man_owner->pw_gid);
#endif /* SECURE_MAN_UID */
drop_effective_privs ();
}
2007-12-12 18:16:54 +01:00
@@ -732,9 +738,14 @@ mkcatdirs (const char *mandir, const cha
int j;
regain_effective_privs ();
debug ("creating catdir hierarchy %s ", catdir);
2006-12-19 00:17:06 +01:00
- for (j = 1; j <= 9; j++) {
- catname[strlen (catname) - 1] = '0' + j;
- manname[strlen (manname) - 1] = '0' + j;
+ for (j = 0; j <= 10; j++) {
+ unsigned int c;
+ if (j < 10)
+ c = '0' + j;
+ else
+ c = 'n';
+ catname[strlen (catname) - 1] = c;
+ manname[strlen (manname) - 1] = c;
if ((is_directory (manname) == 1)
&& (is_directory (catname) != 1)) {
if (mkdir (catname,
2007-12-12 18:16:54 +01:00
@@ -743,11 +754,12 @@ mkcatdirs (const char *mandir, const cha
error (0, 0, _("warning: cannot create catdir %s"), catname);
debug ("warning: cannot create catdir %s\n", catname);
} else
- debug (" cat%d", j);
+ debug (" cat%c", c);
2006-12-19 00:17:06 +01:00
#ifdef SECURE_MAN_UID
if (ruid == 0)
- chown (catname,
- man_owner->pw_uid, 0);
+ chown (catname, man_owner->pw_uid, 0);
+ if (rgid == 0)
2007-12-12 18:16:54 +01:00
+ chown (catname, -1, man_owner->pw_gid);
2006-12-19 00:17:06 +01:00
#endif /* SECURE_MAN_UID */
}
}
2007-12-12 18:16:54 +01:00
@@ -886,7 +898,7 @@ static char *def_path (int flag)
2006-12-19 00:17:06 +01:00
/* If we have complete config file failure... */
if (!manpath)
- return xstrdup ("/usr/man");
+ return xstrdup ("/usr/share/man");
return manpath;
}
2008-01-30 18:47:16 +01:00
@@ -1155,8 +1167,8 @@ char *get_catpath (const char *name, int
struct list *list;
for (list = namestore; list; list = list->next)
- if (((cattype & SYSTEM_CAT) && list->flag == MANDB_MAP) ||
- ((cattype & USER_CAT) && list->flag == MANDB_MAP_USER)) {
+ if (((cattype & SYSTEM_CATP) && list->flag == MANDB_MAP) ||
+ ((cattype & USER_CATP) && list->flag == MANDB_MAP_USER)) {
size_t manlen = strlen (list->key);
if (STRNEQ (name, list->key, manlen)) {
const char *suffix = name + manlen;
2007-12-12 18:16:54 +01:00
@@ -1164,16 +1176,30 @@ char *get_catpath (const char *name, int
2006-12-19 00:17:06 +01:00
if (*suffix == '/') {
++suffix;
- catpath = strappend (catpath, "/",
- NULL);
+ catpath = strappend (catpath, "/", NULL);
}
if (STRNEQ (suffix, "man", 3)) {
suffix += 3;
- catpath = strappend (catpath, "cat",
- NULL);
+ catpath = strappend (catpath, "cat", NULL);
}
catpath = strappend (catpath, suffix, NULL);
- return catpath;
2008-01-30 18:47:16 +01:00
+ if (cattype & FILE_CATP)
2007-12-12 18:16:54 +01:00
+ return catpath;
2006-12-19 00:17:06 +01:00
+ if (is_directory (catpath) == 1)
+ return catpath;
2008-01-30 18:47:16 +01:00
+ if ((cattype & WHATIS_CATP) == 0) {
2007-12-12 18:16:54 +01:00
+ const char locale_delims[] = "_@,.";
+ const char *delim;
+ for (delim = locale_delims; *delim != '\0'; ++delim) {
+ char * tmp = strrchr (catpath, *delim);
+ if (!tmp)
+ continue;
+ *tmp = '\0';
+ if (is_directory (catpath) == 1)
+ return catpath;
+ }
+ }
+ free (catpath);
2006-12-19 00:17:06 +01:00
}
}
2007-02-09 16:58:14 +01:00
--- src/security.c
2007-12-12 18:16:54 +01:00
+++ src/security.c 2007-12-10 14:24:24.347643000 +0100
2006-12-19 00:17:06 +01:00
@@ -87,10 +87,13 @@ extern int errno;
# ifdef POSIX_SAVED_IDS
# if defined (HAVE_SETEUID)
# define SET_EUID(euid) seteuid(euid)
+# define SET_EGID(egid) setegid(egid)
# elif defined (HAVE_SETREUID)
# define SET_EUID(euid) setreuid(-1, euid)
+# define SET_EGID(egid) setregid(-1, egid)
# elif defined (HAVE_SETRESUID)
# define SET_EUID(euid) setresuid(-1, euid, -1)
+# define SET_EGID(egid) setresgid(-1, egid, -1)
# endif /* HAVE_SETEUID */
/* Sort out the function to use to swap ruid with euid. Used if no suid. */
@@ -98,8 +101,10 @@ extern int errno;
# else /* !POSIX_SAVED_IDS */
# if defined (HAVE_SETREUID)
# define SWAP_UIDS(ida, idb) setreuid(idb, ida)
+# define SWAP_GIDS(ida, idb) setregid(idb, ida)
# elif defined (HAVE_SETRESUID)
# define SWAP_UIDS(ida, idb) setresuid(idb, ida, -1)
+# define SWAP_GIDS(ida, idb) setresgid(idb, ida, -1)
# warning Using setresuid() whithout _POSIX_SAVED_IDS!
# endif /* HAVE_SETREUID */
# endif /* POSIX_SAVED_IDS */
@@ -111,7 +116,10 @@ extern int errno;
uid_t ruid; /* initial real user id */
uid_t euid; /* initial effective user id */
+gid_t rgid; /* initial real group id */
+gid_t egid; /* initial effective group id */
uid_t uid; /* current euid */
+gid_t gid; /* current egid */
static struct passwd *man_owner;
@@ -125,10 +133,17 @@ static __inline__ void gripe_set_euid (v
error (FATAL, errno, _("can't set effective uid"));
}
+static __inline__ void gripe_set_egid ()
+{
+ error (FATAL, errno, _( "can't set effective gid"));
+}
+
void init_security (void)
{
ruid = getuid ();
+ rgid = getgid ();
uid = euid = geteuid ();
+ gid = egid = getegid ();
2007-12-12 18:16:54 +01:00
debug ("ruid=%d, euid=%d\n", (int) ruid, (int) euid);
2006-12-19 00:17:06 +01:00
priv_drop_count = 0;
2007-12-12 18:16:54 +01:00
drop_effective_privs ();
@@ -202,6 +217,28 @@ void regain_effective_privs (void)
2006-12-19 00:17:06 +01:00
uid = euid;
}
+
+ if (gid != rgid) {
+# ifdef POSIX_SAVED_IDS
+ if (SET_EGID (rgid))
+# else
+ if (SWAP_GIDS (egid, rgid))
+# endif
+ gripe_set_egid();
+
+ gid = rgid;
+ }
+
+ if (gid != egid) {
+# ifdef POSIX_SAVED_IDS
+ if (SET_EGID (egid))
+# else
+ if (SWAP_GIDS (rgid, egid))
+# endif
+ gripe_set_egid();
+
+ gid = egid;
+ }
#endif /* SECURE_MAN_UID */
}
2007-02-09 16:58:14 +01:00
--- src/straycats.c
2008-02-28 02:01:41 +01:00
+++ src/straycats.c 2008-01-30 11:57:57.562451000 +0100
2006-12-19 00:17:06 +01:00
@@ -48,6 +48,7 @@ extern char *strrchr();
#include <sys/types.h>
#include <sys/stat.h>
+#include <fcntl.h>
#if defined(HAVE_UNISTD_H)
# include <unistd.h>
2007-12-12 18:16:54 +01:00
@@ -102,12 +103,6 @@ static int check_for_stray (void)
2006-12-19 00:17:06 +01:00
struct dirent *catlist;
size_t lenman, lencat;
int strays = 0;
-#ifdef HAVE_CANONICALIZE_FILE_NAME
- /* no PATH_MAX then */
- char *fullpath;
-#else
- char fullpath[PATH_MAX];
-#endif
cdir = opendir (catdir);
if (!cdir) {
2007-12-12 18:16:54 +01:00
@@ -197,6 +192,11 @@ static int check_for_stray (void)
2006-12-19 00:17:06 +01:00
found = 0;
2007-12-12 18:16:54 +01:00
if (!found) {
2006-12-19 00:17:06 +01:00
+#ifdef HAVE_CANONICALIZE_FILE_NAME
+ char *fullpath; /* no PATH_MAX then */
+#else
+ char fullpath[PATH_MAX];
+#endif
2007-12-12 18:16:54 +01:00
pipeline *decomp;
2006-12-19 00:17:06 +01:00
struct mandata *exists;
lexgrog lg;
2007-12-12 18:16:54 +01:00
@@ -312,13 +312,17 @@ static int check_for_stray (void)
2006-12-19 00:17:06 +01:00
2007-12-12 18:16:54 +01:00
if (lg.whatis)
free (lg.whatis);
- pipeline_free (decomp);
+ if (decomp)
+ pipeline_free (decomp);
next_exists:
- free_mandata_struct (exists);
2006-12-19 00:17:06 +01:00
- free (mandir_copy);
2007-12-12 18:16:54 +01:00
+ if (exists)
+ free_mandata_struct (exists);
2006-12-19 00:17:06 +01:00
+ if (mandir_copy)
+ free (mandir_copy);
}
2007-12-12 18:16:54 +01:00
next_section:
- free (section);
+ if (section)
+ free (section);
}
closedir (cdir);
return strays;
2008-01-30 18:47:16 +01:00
@@ -382,7 +386,7 @@ int straycats (const char *manpath)
return 0;
}
- catpath = get_catpath (manpath, SYSTEM_CAT | USER_CAT);
+ catpath = get_catpath (manpath, SYSTEM_CATP|USER_CATP);
/* look in the usual catpath location */
mandir = xstrdup (manpath);
2007-12-12 18:16:54 +01:00
--- src/ult_src.c
+++ src/ult_src.c 2007-12-10 14:34:00.376977000 +0100
@@ -328,12 +328,17 @@ const char *ult_src (const char *name, c
2006-12-19 00:17:06 +01:00
}
2007-12-12 18:16:54 +01:00
pipeline_start (decomp);
2006-12-19 00:17:06 +01:00
- /* make sure that we skip over any comments */
+ /*
+ * make sure that we skip over any comments
+ * ... even if we handle TCL/TK manual pages
+ */
do {
2007-12-12 18:16:54 +01:00
buffer = pipeline_readline (decomp);
- } while (buffer && STRNEQ (buffer, ".\\\"", 3));
+ } while (buffer && *buffer &&
2006-12-19 00:17:06 +01:00
+ (STRNEQ (buffer, ".\\\"", 3) ||
2007-12-12 18:16:54 +01:00
+ STRNEQ (buffer, "'\\\"", 3)));
2006-12-19 00:17:06 +01:00
- if (buffer) {
2007-12-12 18:16:54 +01:00
+ if (buffer && *buffer) {
2006-12-19 00:17:06 +01:00
char *include = test_for_include (buffer);
if (include) {
const char *ult;
2007-02-09 16:58:14 +01:00
--- src/ult_src.h
2007-12-12 18:16:54 +01:00
+++ src/ult_src.h 2007-12-10 13:24:29.922796000 +0100
2006-12-19 00:17:06 +01:00
@@ -21,9 +21,10 @@
2007-12-12 18:16:54 +01:00
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
2006-12-19 00:17:06 +01:00
*/
-#define SO_LINK 0001
-#define SOFT_LINK 0002
-#define HARD_LINK 0004
+#define SO_LINK 0x0001
+#define SOFT_LINK 0x0002
+#define HARD_LINK 0x0004
+#define WHATISBUF 0x0008
extern const char *ult_src (const char *name, const char *path,
struct stat *buf, int flags);
2007-02-09 16:58:14 +01:00
--- src/util.c
2007-12-12 18:16:54 +01:00
+++ src/util.c 2007-12-10 13:24:29.958801000 +0100
2006-12-19 00:17:06 +01:00
@@ -58,6 +58,9 @@ extern char *strcpy();
# include <unistd.h>
#endif /* HAVE_UNISTD_H */
+#include <libintl.h>
+#define _(String) gettext (String)
+
#include "manconfig.h"
#include "libdb/mydbm.h" /* for full definition of MAN_DB */
#include "lib/pipeline.h"
2007-12-12 18:16:54 +01:00
--- src/whatis.c
2008-02-28 02:01:41 +01:00
+++ src/whatis.c 2008-01-30 12:01:59.721229000 +0100
2007-12-12 18:16:54 +01:00
@@ -687,7 +687,7 @@ static int search (char *page)
debug ("lower(%s) = \"%s\"\n", page, lowpage);
for (mp = manpathlist; *mp; mp++) {
- catpath = get_catpath (*mp, SYSTEM_CAT | USER_CAT);
2008-01-30 18:47:16 +01:00
+ catpath = get_catpath (*mp, SYSTEM_CATP|USER_CATP|WHATIS_CATP);
2007-12-12 18:16:54 +01:00
if (catpath) {
database = mkdbname (catpath);
2007-02-09 16:58:14 +01:00
--- src/wrapper.c
2008-01-30 18:47:16 +01:00
+++ src/wrapper.c 2008-01-07 13:06:01.941835000 +0100
2006-12-19 00:17:06 +01:00
@@ -25,6 +25,7 @@
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
+#include <grp.h>
#include <pwd.h>
#include <grp.h>
#include <sys/types.h>
2007-12-12 18:16:54 +01:00
@@ -48,7 +49,7 @@
2006-12-19 00:17:06 +01:00
* it is fixed at compile time to avoid a full class of
* dangers ...
*/
-struct {
+static struct {
const char *prog;
const char *run;
const char *user;
2007-12-12 18:16:54 +01:00
@@ -64,10 +65,11 @@ struct {
2006-12-19 00:17:06 +01:00
2007-12-12 18:16:54 +01:00
char *program_name;
2006-12-19 00:17:06 +01:00
-int main (int argc, char **argv)
2007-12-12 18:16:54 +01:00
+int main (int argc, char **argv, char *envp[])
2006-12-19 00:17:06 +01:00
{
- uid_t ruid;
- char *fakeroot;
+ uid_t ruid, euid;
+ gid_t rgid;
+// char *fakeroot;
struct passwd *pwd;
2007-12-12 18:16:54 +01:00
argc = argc; /* not used */
2008-01-10 02:13:07 +01:00
@@ -83,57 +85,56 @@ int main (int argc, char **argv)
2007-12-12 18:16:54 +01:00
program_name = xstrdup (basename (argv[0]));
2006-12-19 00:17:06 +01:00
ruid = getuid ();
- fakeroot = getenv ("FAKEROOTKEY");
+ euid = geteuid();
+ rgid = getgid ();
+// fakeroot = getenv ("FAKEROOTKEY");
#ifdef DEBUG
printf ("%s:\n", program_name);
- printf ("real = %d, = %d, fakeroot = %d\n",
- (int) ruid, (fakeroot != 0));
+// printf ("real = %d, = %d, fakeroot = %d\n", (int) ruid, (fakeroot != 0));
#endif
- for (wlp = wrapped_list; wlp->prog && strcmp (program_name, wlp->prog);
- ++wlp)
- ;
+ for (wlp = wrapped_list; wlp->prog && strcmp (program_name, wlp->prog); ++wlp)
+ /* __asm__ __volatile__("": : :"memory") */;
if (!wlp->prog) {
fprintf (stderr, _("Don't know which program should I run being >%s<\n"),
program_name);
return -ENOENT;
}
-
- if (!fakeroot && ruid == 0) {
+#ifdef DEBUG
+ printf ("%s\n", wlp->run);
+#endif
+ if (/* !fakeroot && */ (ruid == 0 || euid == 0)) {
pwd = getpwnam (wlp->user);
- /*
- if (!pwd
- || setgid (pwd->pw_gid)
- || initgroups (wlp->user, pwd->pw_gid)
- || setuid (pwd->pw_uid)) {
- fprintf (stderr, _("%s: Failed su to user %s\n"),
- wlp->prog, wlp->user);
- return -EACCES;
- }
- */
if (!pwd) {
- fprintf (stderr, _("%s: Failed su to user %s\n"),
- wlp->prog, wlp->user);
+ fprintf (stderr, _("%s: Failed su to user %s\n"), wlp->prog, wlp->user);
return -EACCES;
}
- if (setgid (pwd->pw_gid)) {
- fprintf (stderr, _("%s: Failed su to user %s\n"),
- wlp->prog, wlp->user);
+ if (ruid == 0) {
+ ruid = pwd->pw_uid;
+ rgid = pwd->pw_gid;
2008-01-10 02:13:07 +01:00
+ } else {
+#ifndef MAN_CATS
+ /* No permissions required to create files
+ * under the sub directories of /var/chache/man */
+ pwd->pw_uid = ruid;
+ pwd->pw_gid = rgid;
+#endif
2006-12-19 00:17:06 +01:00
+ }
+ if (setregid (rgid, pwd->pw_gid)) {
+ fprintf (stderr, _("%s: Failed su to user %s\n"), wlp->prog, wlp->user);
return -EACCES;
}
- if (initgroups (wlp->user, pwd->pw_gid)) {
- fprintf (stderr, _("%s: Failed su to user %s\n"),
- wlp->prog, wlp->user);
+ if (initgroups (wlp->user, rgid)) {
+ fprintf (stderr, _("%s: Failed su to user %s\n"), wlp->prog, wlp->user);
return -EACCES;
}
- if (setuid (pwd->pw_uid)) {
- fprintf (stderr, _("%s: Failed su to user %s\n"),
- wlp->prog, wlp->user);
+ if (setreuid (ruid, pwd->pw_uid)) {
+ fprintf (stderr, _("%s: Failed su to user %s\n"), wlp->prog, wlp->user);
return -EACCES;
}
}
- execv (wlp->run, argv);
- perror ("execv");
+ execve (wlp->run, argv, envp);
+ perror ("execve");
return -errno;
}