man/man-db-2.5.0.dif

2043 lines
64 KiB
Plaintext
Raw Normal View History

--- .pkgextract
+++ .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
+patch -p0 -s --suffix=.groff < ../man-db-2.3.19deb4.0-groff.dif
+patch -p0 -s --suffix=.err < ../man-db-2.5.0-error.dif
+patch -p0 -s --suffix=.sect < ../man-db-2.4.3-section.dif
+patch -p0 -s --suffix=.secu4 < ../man-db-2.5.0-security4.dif
+patch -p0 -s --suffix=.firefox< ../man-db-2.4.3-firefox.dif
+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
--- GNUmakefile.in
+++ GNUmakefile.in 2007-12-11 12:56:21.536072000 +0100
@@ -35,7 +35,7 @@
# Make targets are: #
# #
# all install uninstall mostlyclean clean distclean realclean TAGS ID #
-# FILES lib src man intl libdb update RCS dist #
+# FILES lib src man libdb update RCS dist #
#------------------------------------------------------------------------#
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
-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
include include/Defines
@@ -163,7 +163,7 @@ __TAGS:
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.
--- configure.ac
+++ configure.ac 2008-01-29 19:07:22.794596000 +0100
@@ -10,17 +10,30 @@ AC_CONFIG_HEADER(config.h)
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
datemark=20071007
date=`LANG=C date -d $datemark +'%Y-%m-%d'`
AC_SUBST(date)dnl
dnl
+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
dnl
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
fi
dnl
MAN_CHECK_PROGS([eqn], [EQN], [use EQN to preprocess equations], [eqn geqn])
+MAN_CHECK_PROGS([geqn], [GEQN], [use GEQN to preprocess equations], [geqn])
+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
+ test $geqn -ef $eqn && neqn="$eqn -T$nroff_device"
+fi
MAN_CHECK_PROGS([neqn], [NEQN], [use NEQN to preprocess equations for character devices], [neqn gneqn])
dnl
dnl if we fail to find an neqn, use eqn and try to force it to output
@@ -258,9 +276,15 @@ then
compress_ext="gz"
fi
MAN_CHECK_PROGS([compress], [COMPRESS], [use COMPRESS as UNIX compression utility], [compress])
-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"
@@ -334,9 +358,6 @@ AC_ARG_ENABLE(mandirs,
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
@@ -529,7 +550,6 @@ AC_CONFIG_FILES(GNUmakefile
include/Defines
include/comp_src.h
include/manconfig.h
- intl/Makefile
po/Makefile.in)
AC_OUTPUT
--- mk_catdirs
+++ mk_catdirs 2007-12-10 12:51:50.430084000 +0100
@@ -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}"
+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}"
+
+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}
+
+test "$(id -u)" -ne 0 || chown man:daemon -R ${CACHE}
+
--- include/Defines.in
+++ include/Defines.in 2007-12-10 12:51:50.466089000 +0100
@@ -98,7 +98,11 @@ DEFAULT_TARGETS = TAGS all install unins
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
+++ include/comp_src.h.in 2007-12-10 12:51:50.498093000 +0100
@@ -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 */
--- include/manconfig.h.in
+++ include/manconfig.h.in 2008-01-30 11:56:48.181631000 +0100
@@ -73,7 +73,7 @@
#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 @@
#ifndef NROFF_MISSING
# ifndef NROFF
-# define NROFF "@nroff@"
+# define NROFF "nroff -mandocdb"
# endif
#endif
@@ -240,8 +240,12 @@
#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
@@ -385,11 +389,17 @@ extern char *trim_spaces (const char *s)
extern char *lang_dir (const char *filename);
#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
@@ -414,12 +424,13 @@ extern char *program_name; /* the basena
#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. */
-#define SYSTEM_CAT 1
-#define USER_CAT 2
+#define SYSTEM_CATP 1
+#define USER_CATP 2
+#define FILE_CATP 4
+#define WHATIS_CATP 8
/* string macros */
#define STREQ(a,b) (strcmp(a,b) == 0)
--- intl/Makefile.in
+++ intl/Makefile.in 2007-12-10 12:51:50.562101000 +0100
@@ -177,7 +177,7 @@ libgnuintl.h.msvc-shared Makefile.msvc
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:
--- lib/basename.c
+++ lib/basename.c 2007-12-10 12:51:50.598106000 +0100
@@ -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
--- lib/cleanup.c
+++ lib/cleanup.c 2007-12-10 13:07:01.233682000 +0100
@@ -102,7 +102,7 @@ trap_signal (int signo, struct sigaction
act.sa_handler = sighandler;
sigemptyset (&act.sa_mask);
- act.sa_flags = 0;
+ act.sa_flags = SA_ONESHOT;
return xsigaction (signo, &act, oldact);
}
--- lib/xmalloc.c
+++ 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;
+#include "manconfig.h"
+
static void *
fixup_null_alloc (size_t n)
{
--- libdb/Makefile.in
+++ libdb/Makefile.in 2007-12-10 13:08:09.382330000 +0100
@@ -35,9 +35,6 @@ include $(top_srcdir)/include/Defines
MANDEFS =
MANCPPFLAGS = -I$(top_srcdir)/include -I$(top_srcdir) -I$(srcdir)
-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 \
--- libdb/mydbm.h
+++ 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)
# 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)
# 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
@@ -98,6 +98,7 @@ der Manualseiten gefolgt vom Typ der dor
.TS
tab (@);
l l.
+0@Dateiheader (gewöhnlich in \fI/usr/include\fR)
1@Ausführbare Programme oder Shellbefehle
2@Systemaufrufe (Kernelfunktionen)
3@Bibliotheksaufrufe (Funktionen in System-Bibliotheken)
--- 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
.TS
tab (@);
l l.
+0@Ficheros (se encuentran generalmente en \fI/usr/include\fR)
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
.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
--- man/ja.UTF-8/man1/man.man1
+++ man/ja.UTF-8/man1/man.man1 2007-12-10 13:11:42.941431000 +0100
@@ -104,6 +104,7 @@
.TS
tab (@);
l l.
+0@
1@実行プログラムまたはシェルのコマンド
2@システムコール (カーネルが提供する関数)
3@ライブラリコール (システムライブラリに含まれる関数)
--- man/man1/man.man1
+++ man/man1/man.man1 2007-12-10 12:53:31.282886000 +0100
@@ -114,6 +114,7 @@ numbers of the manual followed by the ty
.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)
--- src/Makefile.in
+++ src/Makefile.in 2007-12-10 13:13:47.713263000 +0100
@@ -40,7 +40,7 @@ include ../include/Defines
MANDEFS = -DCONFIG_FILE=\"$(config_file)\" \
-DLOCALEDIR=\"$(gnulocaledir)\" $(DEFS_$(subst /,_,$@))
-MANCPPFLAGS = -I../include -I$(top_srcdir) -I$(srcdir) -I../intl
+MANCPPFLAGS = -I../include -I$(top_srcdir) -I$(srcdir) -I.
#----------------------------------------------------------------#
# user changeable definitions can be found in ../include/Defines #
@@ -123,7 +123,7 @@ apropos: whatis.c
# Rules to test code as program unit
lexgrog: lexgrog.c compression.o descriptions.o encodings.o fake_security.o \
ult_src.o util.o
- $(LINK.c) -DTEST $^ $(LDLIBS) -o $@
+ $(LINK.c) -g -DTEST $^ $(LDLIBS) -o $@
globbing: globbing.c util.o
$(LINK.c) -DTEST $^ $(LDLIBS) -o $@
@@ -132,8 +132,10 @@ globbing: globbing.c util.o
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)
--- src/catman.c
+++ src/catman.c 2008-01-30 12:02:20.699895000 +0100
@@ -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) {
--- src/check_mandirs.c
+++ src/check_mandirs.c 2007-12-10 13:15:48.608604000 +0100
@@ -391,10 +391,10 @@ static short testmandirs (const char *pa
}
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);
@@ -590,7 +590,7 @@ short update_db (const char *manpath)
return new;
}
- debug ("failed to open %s O_RDONLY\n", database);
+ debug ("failed to open database %s O_RDONLY\n", database);
return EOF;
}
@@ -766,6 +766,7 @@ static short purge_whatis (const char *p
"would delete\n", name, info->ext);
return 1;
}
+ return 1;
}
/* Check that multi keys are correctly constructed. */
@@ -828,6 +829,11 @@ short purge_missing (const char *manpath
gripe_rwopen_failed ();
return 0;
}
+ if (dbver_rd (dbf)) {
+ MYDBM_CLOSE (dbf);
+ dbf = NULL;
+ return 0;
+ }
key = MYDBM_FIRSTKEY (dbf);
@@ -846,6 +852,14 @@ short purge_missing (const char *manpath
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);
if (!MYDBM_DPTR (content))
return count;
--- src/fake_security.c
+++ src/fake_security.c 2007-12-10 12:53:31.362896000 +0100
@@ -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;
--- src/lexgrog.l
+++ src/lexgrog.l 2007-12-10 16:36:13.786133000 +0100
@@ -67,7 +67,7 @@ extern int errno;
#include "encodings.h"
#include "ult_src.h"
-#define YY_READ_BUF_SIZE 1024
+#define YY_READ_BUF_SIZE YY_BUF_SIZE
#define MAX_NAME 2048
#ifdef PROFILE
@@ -75,10 +75,10 @@ static int ctr[YY_NUM_RULES];
# 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;
@@ -87,6 +87,7 @@ static char filters[MAX_FILTERS];
static int fill_mode;
static int waiting_for_quote;
+static int have_separator;
static pipeline *decomp;
@@ -131,7 +132,7 @@ static const char args[] = "mcwfE:hV";
%}
%option ecs meta-ecs
-%option 8bit batch caseful never-interactive
+%option 8bit batch caseful never-interactive align
%option nostdinit
%option warn
%option noyywrap nounput
@@ -160,8 +161,9 @@ font_change \\f([[:upper:]1-4]|\({upper}
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. */
/* 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})
-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)?)
+
+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})
/* eptgrv : eqn, pic, tbl, grap, refer, vgrind */
tbl_request \.TS
@@ -208,8 +229,13 @@ vgrind_request \.vS
%%
/* 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].* |
@@ -260,6 +286,7 @@ vgrind_request \.vS
<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';
@@ -285,28 +312,31 @@ vgrind_request \.vS
{bol}{typeface}{blank}+ | /* type face commands */
{bol}\.ft{blank}.* | /* font change */
{bol}\.V[be]{blank}.* | /* pod2man, verbatim mode */
- {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 ();
/* Toggle fill mode */
-<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>{
@@ -322,6 +352,7 @@ vgrind_request \.vS
{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 */
@@ -350,11 +381,8 @@ vgrind_request \.vS
for later processing */
<MAN_NAME>{
{bol}\.br{blank}* |
- {bol}\.LP{blank}* |
- {bol}\.PP{blank}* |
+ {bol}{paragr}{blank}* |
{bol}\.P{blank}* |
- {bol}\.IP{blank}.* |
- {bol}\.HP{blank}.* |
{bol}\.RS{blank}.* |
{bol}\.RE{blank}.* add_char_to_whatis ((char) 0x11);
}
@@ -367,7 +395,7 @@ vgrind_request \.vS
<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}. {
@@ -383,7 +411,7 @@ vgrind_request \.vS
%%
/* 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."),
@@ -393,7 +421,7 @@ static void too_big (void)
}
/* 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 ();
@@ -404,8 +432,10 @@ static void add_str_to_whatis (const cha
}
/* 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 == '"')
@@ -417,14 +447,30 @@ static void add_char_to_whatis (unsigned
/* 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.
@@ -500,6 +546,7 @@ int find_name_decompressed (pipeline *p,
fill_mode = 1;
waiting_for_quote = 0;
+ have_separator = 0;
if (p_lg->type)
BEGIN (CAT_FILE);
--- src/man.c
+++ src/man.c 2008-02-26 13:05:42.254465287 +0100
@@ -98,6 +98,7 @@ static char *cwd;
#include <utime.h>
#include <sys/types.h>
#include <sys/stat.h>
+#include <sys/time.h>
#if HAVE_SYS_WAIT_H
# include <sys/wait.h>
@@ -147,6 +148,8 @@ extern int errno;
#ifdef SECURE_MAN_UID
extern uid_t ruid;
extern uid_t euid;
+extern gid_t rgid;
+extern gid_t egid;
#endif /* SECURE_MAN_UID */
/* the default preprocessor sequence */
@@ -177,6 +180,10 @@ const char *lang;
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;
@@ -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[
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 */
@@ -400,25 +407,6 @@ static void gripe_no_name (const char *s
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))) {
- debug ("is a tty\n");
- tcgetattr (fileno (stdin), &tms);
- if (!tms_set++)
- atexit (set_term);
- }
-}
-
static int get_roff_line_length (void)
{
int line_length = get_line_length ();
@@ -503,11 +491,11 @@ static __inline__ char **manopt_to_env (
{
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;
@@ -624,37 +612,52 @@ static int local_man_loop (const char *a
display (NULL, "", NULL, "(stdin)", NULL);
else {
struct stat st;
+ char *pwd = cwd;
+ char *file = basename((char*)argv);
- if (cwd[0]) {
- debug ("chdir %s\n", cwd);
- if (chdir (cwd)) {
- error (0, errno, _("can't chdir to %s"), cwd);
+ if (strcmp(argv, file)) {
+ char *dlm;
+ pwd = strdupa(argv);
+
+ if ((dlm = strrchr(pwd, '/')))
+ *dlm = '\0';
+ }
+
+ if (pwd[0]) {
+ debug ("chdir %s\n", pwd);
+ 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;
}
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;
}
if (exit_status == OK) {
char *argv_copy = xstrdup (argv);
lang = lang_dir (argv);
- if (!display (NULL, argv, NULL, basename (argv_copy),
+ if (!lang || !*lang)
+ lang = internal_locale;
+ if (!display (NULL, file, NULL, basename (argv_copy),
NULL)) {
if (local_mf)
error (0, errno, "%s", argv);
@@ -668,12 +671,6 @@ static int local_man_loop (const char *a
return exit_status;
}
-static void int_handler (int signo)
-{
- debug ("\ninterrupt signal %d handler\n", signo);
- exit (INTERRUPTED);
-}
-
int main (int argc, char *argv[])
{
int argc_env, exit_status = OK;
@@ -692,7 +689,16 @@ int main (int argc, char *argv[])
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") &&
@@ -745,8 +751,6 @@ int main (int argc, char *argv[])
init_security ();
#endif /* SECURE_MAN_UID */
- signal (SIGINT, int_handler);
-
pipeline_install_sigchld ();
read_config_file ();
@@ -755,9 +759,13 @@ int main (int argc, char *argv[])
if (external)
do_extern (argc, argv);
- get_term (); /* stores terminal settings */
#ifdef SECURE_MAN_UID
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);
+ }
#endif /* SECURE_MAN_UID */
#ifdef HAVE_SETLOCALE
@@ -776,6 +784,7 @@ int main (int argc, char *argv[])
setenv ("LANGUAGE", internal_locale, 1);
++_nl_msg_cat_cntr;
multiple_locale = NULL;
+#define MULTIPLE_LOCALE_IS_NULL 1
}
}
@@ -838,6 +847,22 @@ int main (int argc, char *argv[])
}
if (manp == NULL) {
+#if MULTIPLE_LOCALE_IS_NULL
+ char * tmp_locale = xstrdup(internal_locale);
+ char * ptr;
+
+ manp = get_manpath (alt_system_name);
+
+ /*
+ * 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;
@@ -859,6 +884,7 @@ int main (int argc, char *argv[])
debug ("checking for locale %s\n", tmp_locale);
manp = add_nls_manpath (manp, tmp_locale);
}
+#endif
} else
free (get_manpath (NULL));
@@ -1177,7 +1203,7 @@ static __inline__ const char *is_section
}
/* 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)
{
static char *directive = NULL;
@@ -1196,7 +1222,8 @@ static const char *get_preprocessors_fro
if (!line)
return NULL;
- 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);
+ } else
+ 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;
@@ -1259,13 +1306,13 @@ static pipeline *make_roff_command (cons
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 */
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
#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);
@@ -1632,6 +1682,18 @@ static void setenv_less (const char *tit
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
@@ -1644,6 +1706,9 @@ static pipeline *make_display_command (c
setenv_less (title);
+ if (!htmlout)
+ disable_x();
+
if (file) {
if (ascii) {
p = pipeline_new ();
@@ -1686,7 +1751,7 @@ static pipeline *make_display_command (c
return p;
}
-
+#ifdef MAN_CATS
/* return a (malloced) temporary name in cat_file's directory */
static char *tmp_cat_filename (const char *cat_file)
{
@@ -1789,8 +1854,6 @@ static int commit_tmp_cat (const char *c
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)
{
@@ -1864,6 +1927,7 @@ static int close_cat_stream (pipeline *c
free (tmp_cat_file);
return status;
}
+#endif /* MAN_CATS */
/* TODO: This should all be refactored after work on the decompression
* library is complete.
@@ -1876,6 +1940,7 @@ void discard_stderr (pipeline *p)
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
@@ -2037,6 +2102,7 @@ static void format_display (pipeline *de
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,
@@ -2074,6 +2140,7 @@ static void display_catman (const char *
pop_cleanup();
free (tmpcat);
}
+#endif /* MAN_CATS */
/*
* optionally chdir to dir, if necessary update cat_file from man_file
@@ -2096,10 +2163,18 @@ static int display (const char *dir, con
if (dir) {
debug ("chdir %s\n", dir);
+ 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 */
@@ -2112,11 +2187,10 @@ static int display (const char *dir, con
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;
@@ -2125,7 +2199,7 @@ static int display (const char *dir, con
else
man_modtime = stb.st_mtime;
}
-
+#endif /* MAN_CATS */
display_to_stdout = troff;
#ifdef TROFF_IS_GROFF
if (htmlout)
@@ -2236,6 +2310,7 @@ static int display (const char *dir, con
printf ("%s", cat_file);
}
putchar ('\n');
+#ifdef MAN_CATS
} else if (catman) {
if (format) {
if (!save_cat)
@@ -2247,6 +2322,7 @@ static int display (const char *dir, con
display_catman (cat_file, decomp,
format_cmd);
}
+#endif /* MAN_CATS */
} else if (format) {
/* no cat or out of date */
pipeline *disp_cmd;
@@ -2296,8 +2372,10 @@ static int display (const char *dir, con
}
}
- pipeline_free (format_cmd);
- pipeline_free (decomp);
+ if (format_cmd)
+ pipeline_free (format_cmd);
+ if (decomp)
+ pipeline_free (decomp);
if (!prompt)
prompt = found;
@@ -2338,8 +2416,7 @@ static char *find_cat_file (const char *
*/
if (!STREQ (man_file, original)) {
global_manpath = is_global_mandir (man_file);
- cat_path = get_catpath
- (man_file, global_manpath ? SYSTEM_CAT : USER_CAT);
+ cat_path = get_catpath (man_file, (global_manpath ? SYSTEM_CATP : USER_CATP)|FILE_CATP);
if (cat_path) {
cat_file = convert_name (cat_path, 0);
@@ -2366,8 +2443,7 @@ static char *find_cat_file (const char *
}
global_manpath = is_global_mandir (original);
- cat_path = get_catpath
- (original, global_manpath ? SYSTEM_CAT : USER_CAT);
+ cat_path = get_catpath (original, (global_manpath ? SYSTEM_CATP : USER_CATP)|FILE_CATP);
if (cat_path) {
cat_file = convert_name (cat_path, 0);
@@ -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
#ifdef MAN_DB_UPDATES
if (!exists && !skip) {
debug ("dbdelete_wrapper (%s, %p)\n",
- candp->req_name, candp->source);
+ candp->req_name, candp->source->addr);
dbdelete_wrapper (candp->req_name, candp->source);
}
#endif /* MAN_DB_UPDATES */
@@ -2977,7 +3051,7 @@ static int try_db (const char *manpath,
/* find out where our db for this manpath should be */
- catpath = get_catpath (manpath, global_manpath ? SYSTEM_CAT : USER_CAT);
+ catpath = get_catpath (manpath, (global_manpath ? SYSTEM_CATP : USER_CATP)|FILE_CATP);
if (catpath) {
database = mkdbname (catpath);
free (catpath);
--- src/man_db.conf.in
+++ src/man_db.conf.in 2007-12-11 13:27:28.109209000 +0100
@@ -20,6 +20,15 @@
MANDATORY_MANPATH /usr/man
MANDATORY_MANPATH /usr/share/man
MANDATORY_MANPATH /usr/local/man
+MANDATORY_MANPATH /usr/local/share/man
+MANDATORY_MANPATH /opt/man
+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
#---------------------------------------------------------
# set up PATH to MANPATH mapping
# ie. what man tree holds man pages for what binary directory.
@@ -34,8 +43,10 @@ MANPATH_MAP /usr/local/bin /usr/local/m
MANPATH_MAP /usr/local/bin /usr/local/share/man
MANPATH_MAP /usr/local/sbin /usr/local/man
MANPATH_MAP /usr/local/sbin /usr/local/share/man
-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
+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
@@ -63,12 +74,133 @@ MANPATH_MAP /opt/sbin /opt/man
#
# *MANPATH* -> *CATPATH*
#
-MANDB_MAP /usr/man /var/cache/man/fsstnd
+MANDB_MAP /usr/share/man/ca /var/cache/man/ca
+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
+MANDB_MAP /usr/share/man/en /var/cache/man/en
+MANDB_MAP /usr/share/man/es /var/cache/man/es
+MANDB_MAP /usr/share/man/es_ES /var/cache/man/es
+MANDB_MAP /usr/share/man/et /var/cache/man/et
+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
+MANDB_MAP /usr/share/man/sk /var/cache/man/sk
+MANDB_MAP /usr/share/man/sr /var/cache/man/sr
+MANDB_MAP /usr/share/man/sv /var/cache/man/sv
+MANDB_MAP /usr/share/man/uk /var/cache/man/uk
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
-MANDB_MAP /usr/X11R6/man /var/cache/man/X11R6
-MANDB_MAP /opt/man /var/cache/man/opt
+#
+MANDB_MAP /usr/local/man/ca /var/cache/man/local/ca
+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
+MANDB_MAP /usr/local/man/en /var/cache/man/local/en
+MANDB_MAP /usr/local/man/es /var/cache/man/local/es
+MANDB_MAP /usr/local/man/es_ES /var/cache/man/local/es
+MANDB_MAP /usr/local/man/et /var/cache/man/local/et
+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
+MANDB_MAP /usr/local/man/sk /var/cache/man/local/sk
+MANDB_MAP /usr/local/man/sr /var/cache/man/local/sr
+MANDB_MAP /usr/local/man/sv /var/cache/man/local/sv
+MANDB_MAP /usr/local/man/uk /var/cache/man/local/uk
+MANDB_MAP /usr/local/man /var/cache/man/local
+#
+MANDB_MAP /usr/local/share/man/ca /var/cache/man/local/ca
+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
+MANDB_MAP /usr/local/share/man/en /var/cache/man/local/en
+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
+MANDB_MAP /usr/local/share/man/et /var/cache/man/local/et
+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
+MANDB_MAP /usr/local/share/man/sk /var/cache/man/local/sk
+MANDB_MAP /usr/local/share/man/sr /var/cache/man/local/sr
+MANDB_MAP /usr/local/share/man/sv /var/cache/man/local/sv
+MANDB_MAP /usr/local/share/man/uk /var/cache/man/local/uk
+MANDB_MAP /usr/local/share/man /var/cache/man/local
+#
+MANDB_MAP /opt/share/man/ca /var/cache/man/opt/ca
+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
+MANDB_MAP /opt/share/man/en /var/cache/man/opt/en
+MANDB_MAP /opt/share/man/es /var/cache/man/opt/es
+MANDB_MAP /opt/share/man/es /var/cache/man/opt/es
+MANDB_MAP /opt/share/man/et /var/cache/man/opt/et
+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
+MANDB_MAP /opt/share/man/ja_JP /var/cache/man/opt/ja
+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
+MANDB_MAP /opt/share/man/sk /var/cache/man/opt/sk
+MANDB_MAP /opt/share/man/sr /var/cache/man/opt/sr
+MANDB_MAP /opt/share/man/sv /var/cache/man/opt/sv
+MANDB_MAP /opt/share/man/uk /var/cache/man/opt/uk
+MANDB_MAP /opt/share/man /var/cache/man/opt
#
#---------------------------------------------------------
# Program definitions. These are commented out by default as the value
@@ -80,7 +212,7 @@ MANDB_MAP /opt/man /var/cache/man/opt
#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@
@@ -107,7 +239,7 @@ MANDB_MAP /opt/man /var/cache/man/opt
# 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
+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
#---------------------------------------------------------
# Flags.
# NOCACHE keeps man from creating cat pages.
--- src/mandb.c
+++ src/mandb.c 2008-01-30 12:01:40.242753000 +0100
@@ -143,6 +143,8 @@ static const char *xtmpfile;
#ifdef SECURE_MAN_UID
extern uid_t ruid;
extern uid_t euid;
+extern gid_t rgid;
+extern gid_t egid;
#endif /* SECURE_MAN_UID */
static char *manpathlist[MAXDIRS];
@@ -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
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 */
}
@@ -610,8 +615,14 @@ int main (int argc, char *argv[])
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 */
--- src/manp.c
+++ src/manp.c 2008-01-30 12:01:02.982017000 +0100
@@ -63,6 +63,7 @@
# include <strings.h>
#else /* no string(s) header */
extern char *strtok();
+extern char *strsep();
extern char *strchr();
extern char *strstr();
#endif
@@ -86,6 +87,7 @@ extern int errno;
#include "security.h"
#include "encodings.h"
#include "manp.h"
+#include "security.h"
struct list {
char *key;
@@ -694,6 +696,8 @@ char *get_manpath (const char *systems)
#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 */
@@ -722,6 +726,8 @@ mkcatdirs (const char *mandir, const cha
#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 ();
}
@@ -732,9 +738,14 @@ mkcatdirs (const char *mandir, const cha
int j;
regain_effective_privs ();
debug ("creating catdir hierarchy %s ", catdir);
- 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,
@@ -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);
#ifdef SECURE_MAN_UID
if (ruid == 0)
- chown (catname,
- man_owner->pw_uid, 0);
+ chown (catname, man_owner->pw_uid, 0);
+ if (rgid == 0)
+ chown (catname, -1, man_owner->pw_gid);
#endif /* SECURE_MAN_UID */
}
}
@@ -886,7 +898,7 @@ static char *def_path (int flag)
/* If we have complete config file failure... */
if (!manpath)
- return xstrdup ("/usr/man");
+ return xstrdup ("/usr/share/man");
return manpath;
}
@@ -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;
@@ -1164,16 +1176,30 @@ char *get_catpath (const char *name, int
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;
+ if (cattype & FILE_CATP)
+ return catpath;
+ if (is_directory (catpath) == 1)
+ return catpath;
+ if ((cattype & WHATIS_CATP) == 0) {
+ 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);
}
}
--- src/security.c
+++ src/security.c 2007-12-10 14:24:24.347643000 +0100
@@ -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 ();
debug ("ruid=%d, euid=%d\n", (int) ruid, (int) euid);
priv_drop_count = 0;
drop_effective_privs ();
@@ -202,6 +217,28 @@ void regain_effective_privs (void)
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 */
}
--- src/straycats.c
+++ src/straycats.c 2008-01-30 11:57:57.562451000 +0100
@@ -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>
@@ -102,12 +103,6 @@ static int check_for_stray (void)
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) {
@@ -197,6 +192,11 @@ static int check_for_stray (void)
found = 0;
if (!found) {
+#ifdef HAVE_CANONICALIZE_FILE_NAME
+ char *fullpath; /* no PATH_MAX then */
+#else
+ char fullpath[PATH_MAX];
+#endif
pipeline *decomp;
struct mandata *exists;
lexgrog lg;
@@ -312,13 +312,17 @@ static int check_for_stray (void)
if (lg.whatis)
free (lg.whatis);
- pipeline_free (decomp);
+ if (decomp)
+ pipeline_free (decomp);
next_exists:
- free_mandata_struct (exists);
- free (mandir_copy);
+ if (exists)
+ free_mandata_struct (exists);
+ if (mandir_copy)
+ free (mandir_copy);
}
next_section:
- free (section);
+ if (section)
+ free (section);
}
closedir (cdir);
return strays;
@@ -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);
--- 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
}
pipeline_start (decomp);
- /* 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 {
buffer = pipeline_readline (decomp);
- } while (buffer && STRNEQ (buffer, ".\\\"", 3));
+ } while (buffer && *buffer &&
+ (STRNEQ (buffer, ".\\\"", 3) ||
+ STRNEQ (buffer, "'\\\"", 3)));
- if (buffer) {
+ if (buffer && *buffer) {
char *include = test_for_include (buffer);
if (include) {
const char *ult;
--- src/ult_src.h
+++ src/ult_src.h 2007-12-10 13:24:29.922796000 +0100
@@ -21,9 +21,10 @@
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-#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);
--- src/util.c
+++ src/util.c 2007-12-10 13:24:29.958801000 +0100
@@ -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"
--- src/whatis.c
+++ src/whatis.c 2008-01-30 12:01:59.721229000 +0100
@@ -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);
+ catpath = get_catpath (*mp, SYSTEM_CATP|USER_CATP|WHATIS_CATP);
if (catpath) {
database = mkdbname (catpath);
--- src/wrapper.c
+++ src/wrapper.c 2008-01-07 13:06:01.941835000 +0100
@@ -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>
@@ -48,7 +49,7 @@
* 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;
@@ -64,10 +65,11 @@ struct {
char *program_name;
-int main (int argc, char **argv)
+int main (int argc, char **argv, char *envp[])
{
- uid_t ruid;
- char *fakeroot;
+ uid_t ruid, euid;
+ gid_t rgid;
+// char *fakeroot;
struct passwd *pwd;
argc = argc; /* not used */
@@ -83,57 +85,56 @@ int main (int argc, char **argv)
program_name = xstrdup (basename (argv[0]));
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;
+ } 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
+ }
+ 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;
}