SHA256
1
0
forked from pool/man
Dr. Werner Fink 2012-10-02 17:06:04 +00:00 committed by Git OBS Bridge
parent 85696dd54c
commit f9d228b03d
21 changed files with 894 additions and 1744 deletions

View File

@ -1,86 +0,0 @@
Index: man-db-2.5.2/configure.ac
===================================================================
--- man-db-2.5.2.orig/configure.ac
+++ man-db-2.5.2/configure.ac
@@ -20,6 +20,8 @@ dnl
AC_PROG_CC
AC_PROG_CPP
AC_GNU_SOURCE
+AM_PROG_AR
+AM_PROG_CC_C_O
dnl
dnl check for system defaults
dnl
diff -urN man-db-2.5.2.orig/aclocal.m4 man-db-2.5.2/aclocal.m4
--- man-db-2.5.2.orig/aclocal.m4 2012-07-02 05:51:00.699476202 +0800
+++ man-db-2.5.2/aclocal.m4 2012-07-02 05:51:15.795287476 +0800
@@ -449,7 +449,7 @@
AM_MISSING_PROG(MAKEINFO, makeinfo)
AM_PROG_INSTALL_SH
AM_PROG_INSTALL_STRIP
-AC_REQUIRE([AM_PROG_MKDIR_P])dnl
+AC_REQUIRE([AC_PROG_MKDIR_P])dnl
# We need awk for the "check" target. The system "awk" is bad on
# some platforms.
AC_REQUIRE([AC_PROG_AWK])dnl
@@ -625,10 +625,10 @@
# gives unlimited permission to copy and/or distribute it,
# with or without modifications, as long as this notice is preserved.
-# AM_PROG_MKDIR_P
+# AC_PROG_MKDIR_P
# ---------------
# Check for `mkdir -p'.
-AC_DEFUN([AM_PROG_MKDIR_P],
+AC_DEFUN([AC_PROG_MKDIR_P],
[AC_PREREQ([2.60])dnl
AC_REQUIRE([AC_PROG_MKDIR_P])dnl
dnl Automake 1.8 to 1.9.6 used to define mkdir_p. We now use MKDIR_P,
diff -urN man-db-2.5.2.orig/configure.ac man-db-2.5.2/configure.ac
--- man-db-2.5.2.orig/configure.ac 2012-07-02 05:51:00.679476451 +0800
+++ man-db-2.5.2/configure.ac 2012-07-02 06:39:30.342100663 +0800
@@ -4,7 +4,7 @@
# Initialise and check we're in the correct directory.
AC_INIT([man-db], [2.5.2], [cjwatson@debian.org])
AC_CONFIG_AUX_DIR(tools)
-AM_INIT_AUTOMAKE([1.10 -Wall -Werror foreign])
+AM_INIT_AUTOMAKE([1.10 -Wall foreign])
AC_PREREQ([2.59])
AC_CONFIG_SRCDIR(src/man.c)
diff -urN man-db-2.5.2.orig/gnulib/m4/gnulib-common.m4 man-db-2.5.2/gnulib/m4/gnulib-common.m4
--- man-db-2.5.2.orig/gnulib/m4/gnulib-common.m4 2012-07-02 05:51:00.657476726 +0800
+++ man-db-2.5.2/gnulib/m4/gnulib-common.m4 2012-07-02 05:51:15.795287476 +0800
@@ -36,7 +36,7 @@
# Remove this macro when we can assume autoconf >= 2.60.
m4_ifdef([AC_PROG_MKDIR_P], [], [
AC_DEFUN([AC_PROG_MKDIR_P],
- [AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake
+ [AC_REQUIRE([AC_PROG_MKDIR_P])dnl defined by automake
MKDIR_P='$(mkdir_p)'
AC_SUBST([MKDIR_P])])])
diff -urN man-db-2.5.2.orig/m4/intl.m4 man-db-2.5.2/m4/intl.m4
--- man-db-2.5.2.orig/m4/intl.m4 2012-07-02 05:51:00.681476426 +0800
+++ man-db-2.5.2/m4/intl.m4 2012-07-02 05:51:15.796287464 +0800
@@ -25,7 +25,7 @@
AC_DEFUN([AM_INTL_SUBDIR],
[
AC_REQUIRE([AC_PROG_INSTALL])dnl
- AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake
+ AC_REQUIRE([AC_PROG_MKDIR_P])dnl defined by automake
AC_REQUIRE([AC_PROG_CC])dnl
AC_REQUIRE([AC_CANONICAL_HOST])dnl
AC_REQUIRE([gt_GLIBC2])dnl
diff -urN man-db-2.5.2.orig/m4/po.m4 man-db-2.5.2/m4/po.m4
--- man-db-2.5.2.orig/m4/po.m4 2012-07-02 05:51:00.681476426 +0800
+++ man-db-2.5.2/m4/po.m4 2012-07-02 05:51:15.796287464 +0800
@@ -24,7 +24,7 @@
[
AC_REQUIRE([AC_PROG_MAKE_SET])dnl
AC_REQUIRE([AC_PROG_INSTALL])dnl
- AC_REQUIRE([AM_PROG_MKDIR_P])dnl defined by automake
+ AC_REQUIRE([AC_PROG_MKDIR_P])dnl defined by automake
AC_REQUIRE([AM_NLS])dnl
dnl Release version of the gettext macros. This is used to ensure that

View File

@ -1,31 +0,0 @@
--- src/globbing.c
+++ src/globbing.c 2007-09-19 13:35:04.128822519 +0200
@@ -340,13 +340,22 @@ char **look_for_file (const char *unesc_
/* allow lookups like "3x foo" to match "../man3/foo.3x" */
if ((layout & LAYOUT_GNU) && CTYPE (isdigit, *sec) && sec[1] != '\0') {
- path = appendstr (path, hier, cat ? "/cat" : "/man", "\t",
- NULL);
- *strrchr (path, '\t') = *sec;
- pattern = end_pattern (appendstr (pattern, name, NULL), sec);
+ off_t nptr, nsec;
- status = match_in_directory (path, pattern, !match_case,
- &gbuf);
+ path = appendstr (path, hier, cat ? "/cat" : "/man", NULL);
+ nptr = strlen(path);
+ path = appendstr (path, sec, NULL);
+ nsec = nptr + strlen(sec);
+
+ while (nsec > nptr) {
+ *(path + nsec--) = '\0';
+ if (pattern)
+ *pattern = '\0';
+ pattern = end_pattern (appendstr (pattern, name, NULL), sec);
+ status = match_in_directory (path, pattern, !match_case, &gbuf);
+ if ((status == 0) && (gbuf.gl_pathc != 0))
+ break;
+ }
}
/* AIX glob.h doesn't define GLOB_NOMATCH and the manpage is vague

View File

@ -1,32 +0,0 @@
--- src/mandb.c
+++ src/mandb.c 2008-04-21 13:06:01.440910914 +0200
@@ -36,6 +36,7 @@
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h> /* for chmod() */
+#include <fcntl.h> /* for open () */
#include <dirent.h>
#include <unistd.h>
@@ -414,11 +415,20 @@ static short mandb (const char *catpath,
char pid[23];
short amount;
char *dbname;
+ int fd;
dbname = mkdbname (catpath);
sprintf (pid, "%d", getpid ());
database = appendstr (NULL, catpath, "/", pid, NULL);
-
+
+ /* Just for the case that catpath isn't a system catpath */
+ drop_effective_privs ();
+ fd = open (database, O_WRONLY | O_CREAT | O_EXCL, 0644);
+ regain_effective_privs ();
+ if (fd < 0)
+ error (FATAL, errno, _("can't create a temporary filename"));
+ close(fd);
+
if (!quiet)
printf (_("Processing manual pages under %s...\n"), manpath);
#ifdef NDBM

View File

@ -1,305 +0,0 @@
--- config.h.in
+++ config.h.in 2007-12-07 15:50:23.000000000 +0100
@@ -454,6 +454,9 @@
/* Define to 1 if you have the `z' library (-lz). */
#undef HAVE_LIBZ
+/* Define to 1 if you have libzio for opening compressed manuals */
+#undef HAVE_ZIO
+
/* Define to 1 if you have the <limits.h> header file. */
#undef HAVE_LIMITS_H
--- configure.ac
+++ configure.ac 2008-04-21 13:18:38.854059561 +0200
@@ -94,7 +94,18 @@ AC_ARG_WITH(sections,
sections="$withval"
fi],
[: ${sections=1 n l 8 3 2 5 4 9 6 7}])
-
+AC_ARG_WITH(zio,
+[AS_HELP_STRING([--with-zio=LIBRARY], [use zlib/libbz2 wrapper library LIBRARY (libzio)])],
+ [if test -z "$withval" -o "$withval" = "yes"
+ then
+ zio=libzio
+ elif test "$withval" = "no"
+ then
+ AC_MSG_ERROR(--with-zio requires an argument)
+ else
+ zio=$withval
+ fi],
+ : ${zio=no})
# Finish the argument parsing.
AC_SUBST(man_owner)dnl
AC_SUBST(man_mode)dnl
@@ -294,6 +305,29 @@ AC_SUBST(gunzip)
AC_SUBST(uncompress)
AC_SUBST(bunzip2)
MAN_COMPRESS_LIB([z], [gzopen])
+dnl Check for zlib and libbz2 libraries to use this together
+dnl with SuSE's libzio to open compressed info files.
+dnl
+if test "$zio" = "no" || test -n "$zio"
+then
+ AC_CHECK_HEADER(zio.h,[
+ for lib in ${zio#lib} zio
+ do
+ AC_CHECK_LIB($lib, fzopen, [LIBS="-l$lib $LIBS"
+ AC_DEFINE([COMP_SRC],[],[Define if you have compressors and want to support compressed cat files.])
+ AC_DEFINE([HAVE_ZIO],[],[Define to 1 if you have libzio for opening compressed manuals])])
+ done])
+ AC_CHECK_HEADER(zlib.h,[
+ for lib in z gz
+ do
+ AC_CHECK_LIB($lib, gzopen, [LIBS="$LIBS -Wl,--no-as-needed -l$lib" ; break])
+ done])
+ AC_CHECK_HEADER(bzlib.h,[
+ for lib in bz2 bzip2
+ do
+ AC_CHECK_LIB($lib, BZ2_bzopen, [LIBS="$LIBS -Wl,--no-as-needed -l$lib" ; break])
+ done])
+fi
dnl To add more decompressors just follow the scheme above.
# Work out which manual page hierarchy scheme might be in use.
--- lib/decompress.c
+++ lib/decompress.c 2008-04-23 10:48:04.431353342 +0000
@@ -36,6 +36,10 @@
# include "zlib.h"
#endif /* HAVE_LIBZ */
+#ifdef HAVE_ZIO
+# include "zio.h"
+#endif /* HAVE_ZIO */
+
#include "manconfig.h"
#include "comp_src.h"
#include "pipeline.h"
@@ -66,6 +70,32 @@ static void decompress_zlib (void *data
#endif /* HAVE_LIBZ */
+#ifdef HAVE_ZIO
+
+static void decompress_zio (void *data)
+{
+ const char *what = (const char*)data;
+ FILE *file;
+
+ file = fdzopen(dup (fileno (stdin)), "r", what);
+ if (!file)
+ return;
+
+ for (;;) {
+ char buffer[4096];
+ int r = fread(buffer, sizeof(char), sizeof(buffer), file);
+ if (r <= 0)
+ break;
+ if (fwrite (buffer, 1, (size_t) r, stdout) < (size_t) r)
+ break;
+ }
+
+ fclose(file);
+ return;
+}
+
+#endif /* HAVE_ZIO */
+
pipeline *decompress_open (const char *filename)
{
command *cmd;
@@ -77,9 +107,53 @@ pipeline *decompress_open (const char *f
char *ext;
struct compression *comp;
- if (stat (filename, &st) < 0 && !S_ISDIR (st.st_mode))
+ if (stat (filename, &st) < 0 || S_ISDIR (st.st_mode))
return NULL;
+#ifdef HAVE_ZIO
+ ext = strrchr(filename, '.');
+ if (ext && STREQ (ext, ".gz")) {
+ /* informational only; no shell quoting concerns */
+ char *name = appendstr (NULL, "zcat < ", filename, NULL);
+ cmd = command_new_function (name, &decompress_zio, "g");
+ free (name);
+ p = pipeline_new_commands (cmd, NULL);
+ if (strcmp(program_name, "mandb") == 0)
+ p->libzio = 1;
+ goto got_pipeline;
+ }
+ if (ext && STREQ (ext, ".z")) {
+ /* informational only; no shell quoting concerns */
+ char *name = appendstr (NULL, "zcat < ", filename, NULL);
+ cmd = command_new_function (name, &decompress_zio, "z");
+ free (name);
+ p = pipeline_new_commands (cmd, NULL);
+ if (strcmp(program_name, "mandb") == 0)
+ p->libzio = 1;
+ goto got_pipeline;
+ }
+ if (ext && STREQ (ext, ".bz2")) {
+ /* informational only; no shell quoting concerns */
+ char *name = appendstr (NULL, "bzcat < ", filename, NULL);
+ cmd = command_new_function (name, &decompress_zio, "b");
+ free (name);
+ p = pipeline_new_commands (cmd, NULL);
+ if (strcmp(program_name, "mandb") == 0)
+ p->libzio = 1;
+ goto got_pipeline;
+ }
+ if (ext && STREQ (ext, ".Z")) {
+ /* informational only; no shell quoting concerns */
+ char *name = appendstr (NULL, "zcat < ", filename, NULL);
+ cmd = command_new_function (name, &decompress_zio, "Z");
+ free (name);
+ p = pipeline_new_commands (cmd, NULL);
+ if (strcmp(program_name, "mandb") == 0)
+ p->libzio = 1;
+ goto got_pipeline;
+ }
+#endif /* HAVE_ZIO */
+
#ifdef HAVE_LIBZ
filename_len = strlen (filename);
if (filename_len > 3 && STREQ (filename + filename_len - 3, ".gz")) {
--- lib/pipeline.c
+++ lib/pipeline.c 2008-04-23 10:52:16.655715088 +0000
@@ -50,6 +50,10 @@
#include "error.h"
#include "pipeline.h"
+#ifdef HAVE_ZIO
+# include "zio.h"
+#endif /* HAVE_ZIO */
+
/* ---------------------------------------------------------------------- */
/* Functions to build individual commands. */
@@ -441,6 +445,9 @@ pipeline *pipeline_new (void)
p->commands = xnmalloc (p->commands_max, sizeof *p->commands);
p->pids = NULL;
p->statuses = NULL;
+#ifdef HAVE_ZIO
+ p->libzio = 0;
+#endif
p->want_in = p->want_out = 0;
p->want_infile = p->want_outfile = NULL;
p->infd = p->outfd = -1;
@@ -479,6 +486,9 @@ pipeline *pipeline_join (pipeline *p1, p
pipeline *p = XMALLOC (pipeline);
int i;
+#ifdef HAVE_ZIO
+ assert (p->libzio);
+#endif
assert (!p1->pids);
assert (!p2->pids);
assert (!p1->statuses);
@@ -614,6 +624,9 @@ void pipeline_commands (pipeline *p, ...
FILE *pipeline_get_infile (pipeline *p)
{
+#ifdef HAVE_ZIO
+ assert (!p->libzio);
+#endif
assert (p->pids); /* pipeline started */
assert (p->statuses);
if (p->infile)
@@ -627,6 +640,12 @@ FILE *pipeline_get_infile (pipeline *p)
FILE *pipeline_get_outfile (pipeline *p)
{
+#ifdef HAVE_ZIO
+ if (p->libzio) {
+ assert (p->outfile != (FILE*)0);
+ return p->outfile;
+ }
+#endif
assert (p->pids); /* pipeline started */
assert (p->statuses);
if (p->outfile)
@@ -707,6 +726,24 @@ void pipeline_start (pipeline *p)
int infd[2];
sigset_t set, oset;
+#ifdef HAVE_ZIO
+ if (p->ncommands != 1) /* A pipe to the following commands required */
+ p->libzio = 0;
+
+ if (p->libzio) {
+ struct command_function *cmdf;
+
+ assert (p->ncommands == 1);
+ assert (p->commands[0]->tag == COMMAND_FUNCTION);
+ assert (p->want_infile != NULL);
+
+ cmdf = &p->commands[0]->u.function;
+
+ p->outfile = fzopen(p->want_infile, "r");
+
+ return;
+ }
+#endif
/* Flush all pending output so that subprocesses don't inherit it. */
fflush (NULL);
@@ -1009,6 +1046,19 @@ int pipeline_wait (pipeline *p)
pipeline_dump (p, stderr);
}
+#ifdef HAVE_ZIO
+ if (p->libzio) {
+ assert (p->outfile != (FILE*)0);
+ if (fclose (p->outfile)) {
+ error (0, errno, _("closing pipeline output stream failed"));
+ ret = 1;
+ }
+ p->outfile = (FILE*)0;
+ p->outfd = -1;
+ return ret;
+ }
+#endif
+
assert (p->pids); /* pipeline started */
assert (p->statuses);
@@ -1549,11 +1599,20 @@ static const char *get_block (pipeline *
if (!peek)
p->peek_offset = 0;
-
+#ifdef HAVE_ZIO
+ if (p->libzio) {
+ assert (p->outfile != (FILE*)0);
+ r = fread (p->buffer + readstart, sizeof(char), toread, p->outfile);
+ goto out;
+ }
+#endif
assert (p->outfd != -1);
r = read (p->outfd, p->buffer + readstart, toread);
if (r == -1)
return NULL;
+#ifdef HAVE_ZIO
+out:
+#endif
p->buflen = readstart + r;
if (peek)
p->peek_offset += r;
--- lib/pipeline.h
+++ lib/pipeline.h 2008-04-22 13:52:44.846881571 +0000
@@ -60,6 +60,14 @@ typedef struct pipeline {
pid_t *pids;
int *statuses; /* -1 until command exits */
+#ifdef HAVE_ZIO
+ /*
+ * Uses for e.g. simple decompression the help of libzio.
+ * Do not fork in this case but open the compressed files.
+ */
+ int libzio;
+#endif
+
/* To be set by the caller. If positive, these contain
* caller-supplied file descriptors for the input and output of the
* whole pipeline. If negative, pipeline_start() will create pipes

View File

@ -1,168 +0,0 @@
--- include/manconfig.h.in
+++ include/manconfig.h.in 2008-04-21 13:32:56.000000000 +0200
@@ -375,8 +375,10 @@ extern char *program_name; /* the basena
#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)
--- src/catman.c
+++ src/catman.c 2008-01-30 12:02:21.000000000 +0100
@@ -450,7 +450,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/man.c
+++ src/man.c 2008-04-21 17:53:02.000000000 +0200
@@ -1249,8 +1304,7 @@ static pipeline *make_roff_command (cons
#ifdef ALT_EXT_FORMAT
/* Check both external formatter locations */
if (dir && !recode) {
- 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) {
@@ -2366,8 +2450,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);
@@ -2394,8 +2477,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);
@@ -2884,9 +2966,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,
@@ -3001,7 +3081,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/mandb.c
+++ src/mandb.c 2008-01-30 12:01:40.000000000 +0100
@@ -484,10 +486,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);
}
--- src/manp.c
+++ src/manp.c 2008-01-30 12:01:03.000000000 +0100
@@ -1134,8 +1145,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;
@@ -1143,16 +1154,30 @@ char *get_catpath (const char *name, int
if (*suffix == '/') {
++suffix;
- catpath = appendstr (catpath, "/",
- NULL);
+ catpath = appendstr (catpath, "/", NULL);
}
if (STRNEQ (suffix, "man", 3)) {
suffix += 3;
- catpath = appendstr (catpath, "cat",
- NULL);
+ catpath = appendstr (catpath, "cat", NULL);
}
catpath = appendstr (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/whatis.c
+++ src/whatis.c 2008-04-21 13:21:57.000000000 +0200
@@ -651,7 +651,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/straycats.c
+++ src/straycats.c 2008-04-21 15:47:04.000000000 +0200
@@ -338,7 +343,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);

View File

@ -1,62 +0,0 @@
--- src/encodings.c
+++ src/encodings.c 2008-08-12 15:26:22.959763175 +0200
@@ -106,6 +106,11 @@ static struct directory_entry directory_
{ "cs", "ISO-8859-2", "ISO-8859-2" }, /* Czech */
{ "hr", "ISO-8859-2", "ISO-8859-2" }, /* Croatian */
{ "hu", "ISO-8859-2", "ISO-8859-2" }, /* Hungarian */
+ { "zh_TW", "BIG5", "BIG5" }, /* Traditional Chinese */
+ { "zh_HK", "BIG5HKSCS", "BIG5HKSCS" }, /* Traditional Chinese */
+ { "zh_CN", "GB18030", "GB18030" }, /* Simplified Chinese */
+ { "zh_SG", "GB18030", "GB18030" }, /* Simplified Chinese */
+ { "zh", "GB18030", "GB18030" }, /* Simplified Chinese */
{ "ja", "EUC-JP", "EUC-JP" }, /* Japanese */
{ "ko", "EUC-KR", "EUC-KR" }, /* Korean */
{ "pl", "ISO-8859-2", "ISO-8859-2" }, /* Polish */
@@ -208,6 +213,7 @@ static struct charset_entry charset_tabl
{ "EUC-CN", "nippon" },
{ "EUC-JP", "nippon" },
{ "EUC-TW", "nippon" },
+ { "GB18030", "nippon" },
{ "GBK", "nippon" },
#endif /* MULTIBYTE_GROFF */
@@ -281,6 +287,7 @@ static struct less_charset_entry less_ch
{ "UTF-8", "utf-8", NULL },
#ifdef MULTIBYTE_GROFF
+ { "GB18030", "zh", NULL },
{ "EUC-JP", "iso8859", "japanese-ujis" },
{ "KOI8-R", "koi8-r", NULL },
#endif /* MULTIBYTE_GROFF */
@@ -405,6 +412,13 @@ char *get_page_encoding (const char *lan
* roff encoding = UTF-8
* output encoding = UTF-8
* EUC-JP -> iconv -> UTF-8 -> groff -Tutf8 -> UTF-8
+ *
+ * /usr/share/man/zh_CN.GB18030, locale zh_CN.UTF-8
+ * page encoding = GB18030
+ * source encoding = GB18030
+ * roff encoding = UTF-8
+ * output encoding = UTF-8
+ * GB18030 -> iconv -> UTF-8 -> groff -Tutf8 -> UTF-8
*/
const char *get_source_encoding (const char *lang)
{
@@ -545,7 +559,7 @@ static int compatible_encodings (const c
*/
if ((STREQ (input, "BIG5") || STREQ (input, "BIG5HKSCS") ||
STREQ (input, "EUC-JP") ||
- STREQ (input, "EUC-CN") || STREQ (input, "GBK") ||
+ STREQ (input, "EUC-CN") || STREQ (input, "GB18030") || STREQ (input, "GBK") ||
STREQ (input, "EUC-KR") ||
STREQ (input, "EUC-TW")) &&
STREQ (output, "UTF-8"))
@@ -639,7 +653,7 @@ const char *get_roff_encoding (const cha
STRNEQ (ctype, "zh_HK", 5) ||
STRNEQ (ctype, "zh_SG", 5) ||
STRNEQ (ctype, "zh_TW", 5))
- roff_encoding = "UTF-8";
+ roff_encoding = source_encoding; /* "UTF-8"; */
}
#endif /* MULTIBYTE_GROFF */

View File

@ -1,23 +0,0 @@
--- lib/pipeline.c
+++ lib/pipeline.c 2008-11-21 10:53:20.554776039 +0000
@@ -54,6 +54,20 @@
# include "zio.h"
#endif /* HAVE_ZIO */
+#ifdef __linux__
+# include <sys/socket.h>
+# include <netdb.h>
+# include <netinet/in.h>
+# ifndef SHUT_RD
+# define SHUT_RD 0
+# endif
+# ifndef SHUT_WR
+# define SHUT_WR 1
+# endif
+# define pipe(v) (((socketpair(AF_UNIX,SOCK_STREAM,0,v) < 0) || \
+ (shutdown((v)[1],SHUT_RD) < 0) || (shutdown((v)[0],SHUT_WR) < 0)) ? -1 : 0)
+#endif
+
/* ---------------------------------------------------------------------- */
/* Functions to build individual commands. */

View File

@ -1,108 +0,0 @@
--- manual/files.me
+++ manual/files.me 2009-01-15 01:02:11.000000000 +0100
@@ -135,9 +135,11 @@ manpath.
However, if the element is not mentioned in the config file, a man directory
relative to it will be sought.
The subdirectories
-.i ../man
+.i ../man ,
+.i man ,
+.i ../share/man ,
or
-.i man
+.i share/man
relative to the path component are appended to the internal manpath if they
exist.
Finally, the internal manpath is stripped of duplicate paths before
--- src/manp.c
+++ src/manp.c 2009-01-15 01:02:11.000000000 +0100
@@ -58,6 +58,7 @@
#include <unistd.h>
#include "xgetcwd.h"
+#include "xvasprintf.h"
#include "gettext.h"
#define _(String) gettext (String)
@@ -886,7 +887,8 @@ static char *def_path (int flag)
* directories listed in the man_db.config file. If so, and it is
* not already in the manpath, add it. If the directory is not listed
* in the man_db.config file, see if there is a subdirectory `../man' or
- * `man'. If so, and it is not already in the manpath, add it.
+ * `man', or, for FHS-compliance, `../share/man' or `share/man'. If so,
+ * and it is not already in the manpath, add it.
* Example: user has $HOME/bin in his path and the directory
* $HOME/man exists -- the directory $HOME/man will be added
* to the manpath.
@@ -941,13 +943,15 @@ static inline char *get_manpath_from_pat
t = has_mandir (p);
if (t) {
- debug ("but does have a ../man or man "
+ debug ("but does have a ../man, man, "
+ "../share/man, or share/man "
"subdirectory\n");
add_dir_to_list (tmplist, t);
free (t);
} else
- debug ("and doesn't have ../man or man "
+ debug ("and doesn't have ../man, man, "
+ "../share/man, or share/man "
"subdirectories\n");
}
}
@@ -1022,34 +1026,41 @@ static void add_dir_to_list (char **lp,
}
}
-/* path does not exist in config file: check to see if path/../man or
- path/man exist. If so return it, if not return NULL. */
+/* path does not exist in config file: check to see if path/../man,
+ path/man, path/../share/man, or path/share/man exist. If so return
+ it, if not return NULL. */
static inline char *has_mandir (const char *path)
{
- char *newpath = NULL;
+ char *newpath;
/* don't assume anything about path, especially that it ends in
"bin" or even has a '/' in it! */
char *subdir = strrchr (path, '/');
if (subdir) {
- const int prefix_len = subdir + 1 - path;
- newpath = xmalloc (prefix_len + sizeof ("man") + 1);
- strncpy (newpath, path, prefix_len);
- strcpy (newpath + prefix_len, "man");
-
+ newpath = xasprintf ("%.*s/man", subdir - path, path);
if (is_directory (newpath) == 1)
return newpath;
- else
- *newpath = '\0';
+ free (newpath);
}
- newpath = appendstr (newpath, path, "/man", NULL);
-
+ newpath = appendstr (NULL, path, "/man", NULL);
if (is_directory (newpath) == 1)
return newpath;
+ free (newpath);
+
+ if (subdir) {
+ newpath = xasprintf ("%.*s/share/man", subdir - path, path);
+ if (is_directory (newpath) == 1)
+ return newpath;
+ free (newpath);
+ }
+ newpath = appendstr (NULL, path, "/share/man", NULL);
+ if (is_directory (newpath) == 1)
+ return newpath;
free (newpath);
+
return NULL;
}

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:3da6a5983a3dd1233b45d66cfcc44e787f8cd6cfc77d5b97cb154414ea70a4ca
size 1315763

50
man-db-2.6.3-chinese.dif Normal file
View File

@ -0,0 +1,50 @@
--- lib/encodings.c
+++ lib/encodings.c 2012-10-01 14:42:07.895867558 +0000
@@ -224,6 +224,7 @@ static struct charset_entry charset_tabl
{ "EUC-CN", "nippon" },
{ "EUC-JP", "nippon" },
{ "EUC-TW", "nippon" },
+ { "GB18030", "nippon" },
{ "GBK", "nippon" },
# else /* !MULTIBYTE_GROFF */
/* If we have a smarter version of groff, this is better dealt with
@@ -311,6 +312,7 @@ static struct less_charset_entry less_ch
#ifdef MULTIBYTE_GROFF
{ "CP1251", "windows", NULL },
+ { "GB18030", "zh", NULL },
{ "EUC-JP", "iso8859", "japanese-ujis" },
{ "KOI8-R", "koi8-r", NULL },
/* close enough? */
@@ -502,6 +504,13 @@ char *get_page_encoding (const char *lan
* roff encoding = ISO-8859-15
* output encoding = ISO-8859-15
* ISO-8859-15 -> groff -Tascii8 -> ISO-8859-15 -> iconv -> UTF-8
+ *
+ * /usr/share/man/zh_CN.GB18030, locale zh_CN.UTF-8
+ * page encoding = GB18030
+ * source encoding = GB18030
+ * roff encoding = UTF-8
+ * output encoding = UTF-8
+ * GB18030 -> iconv -> UTF-8 -> groff -Tutf8 -> UTF-8
*/
const char *get_source_encoding (const char *lang)
{
@@ -654,7 +663,7 @@ static int compatible_encodings (const c
*/
if ((STREQ (input, "BIG5") || STREQ (input, "BIG5HKSCS") ||
STREQ (input, "EUC-JP") ||
- STREQ (input, "EUC-CN") || STREQ (input, "GBK") ||
+ STREQ (input, "EUC-CN") || STREQ (input, "GB18030") || STREQ (input, "GBK") ||
STREQ (input, "EUC-KR") ||
STREQ (input, "EUC-TW")) &&
STREQ (output, "UTF-8"))
@@ -758,7 +767,7 @@ const char *get_roff_encoding (const cha
STRNEQ (ctype, "zh_HK", 5) ||
STRNEQ (ctype, "zh_SG", 5) ||
STRNEQ (ctype, "zh_TW", 5))
- roff_encoding = "UTF-8";
+ roff_encoding = source_encoding; /* "UTF-8"; */
}
#endif /* MULTIBYTE_GROFF */

View File

@ -1,6 +1,6 @@
--- src/man.c
+++ src/man.c 2007-07-18 12:45:24.091833039 +0000
@@ -2031,21 +2031,23 @@ static void format_display (pipeline *de
+++ src/man.c 2012-10-01 14:34:29.003506558 +0000
@@ -2312,21 +2312,23 @@ static void format_display (pipeline *de
if (!status)
break;
}
@ -16,7 +16,7 @@
}
+ if (!status)
+ sleep(5); /* firefox runs into background to fast */
if (remove_directory (htmldir) == -1)
if (remove_directory (htmldir, 0) == -1)
error (0, errno, _("can't remove directory %s"),
htmldir);
free (htmlfile);

View File

@ -1,6 +1,6 @@
--- src/man.c
+++ src/man.c 2008-11-28 13:12:22.171541000 +0100
@@ -3223,12 +3223,132 @@ static int locate_page (const char *manp
+++ src/man.c 2008-11-28 12:12:22.000000000 +0000
@@ -3712,12 +3712,132 @@ static int locate_page (const char *manp
return found;
}
@ -133,7 +133,7 @@
global_manpath = is_global_mandir (candp->path);
if (!global_manpath)
drop_effective_privs ();
@@ -3250,9 +3370,51 @@ static int display_pages (struct candida
@@ -3739,9 +3859,51 @@ static int display_pages (struct candida
regain_effective_privs ();
if (found && !findall)

50
man-db-2.6.3-man0.dif Normal file
View File

@ -0,0 +1,50 @@
--- man/de/man1/man.man1
+++ man/de/man1/man.man1 2008-04-21 13:41:49.000000000 +0200
@@ -97,6 +97,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/man1/man.man1
+++ man/es/man1/man.man1 2008-04-21 13:41:57.000000000 +0200
@@ -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/man1/man.man1
+++ man/it/man1/man.man1 2008-04-21 13:42:02.000000000 +0200
@@ -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/man1/man.man1
+++ man/ja/man1/man.man1 2008-04-21 13:42:05.000000000 +0200
@@ -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.000000000 +0100
@@ -119,6 +119,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)

View File

@ -1,6 +1,6 @@
--- src/man.c
+++ src/man.c 2006-06-13 14:01:19.000000000 +0000
@@ -1142,7 +1142,7 @@ static inline const char *is_section (co
+++ src/man.c 2012-10-01 14:24:23.251006952 +0000
@@ -1368,7 +1368,7 @@ static inline const char *is_section (co
{
const char **vs;
@ -9,17 +9,16 @@
if (STREQ (*vs, name))
return name;
/* allow e.g. 3perl but disallow 8139too and libfoo */
@@ -2565,7 +2565,8 @@ static int compare_candidates (const str
@@ -2943,7 +2943,7 @@ static int compare_candidates (const str
/* Find out whether lsource->ext is ahead of rsource->ext in
* section_list.
*/
const char **sp;
- for (sp = section_list; *sp; ++sp) {
+
+ for (sp = section_list; sp && *sp; ++sp) {
if (!*(*sp + 1)) {
/* No extension */
if (!sec_left && **sp == *(left->ext))
@@ -3209,7 +3210,7 @@ static int man (const char *name, int *f
if (!sec_left && **sp == *(lsource->ext))
@@ -3918,7 +3918,7 @@ static int man (const char *name, int *f
} else {
const char **sp;

View File

@ -0,0 +1,48 @@
--- src/mandb.c
+++ src/mandb.c 2012-10-01 14:30:11.619507260 +0000
@@ -37,6 +37,7 @@
#include <errno.h>
#include <sys/types.h>
#include <sys/stat.h> /* for chmod() */
+#include <fcntl.h> /* for open () */
#include <dirent.h>
#include <unistd.h>
#include <signal.h>
@@ -420,11 +421,20 @@ static int mandb (const char *catpath, c
char *dbname;
char *cachedir_tag;
struct stat st;
+ int fd;
dbname = mkdbname (catpath);
sprintf (pid, "%d", getpid ());
database = appendstr (NULL, catpath, "/", pid, NULL);
-
+
+ /* Just for the case that catpath isn't a system catpath */
+ drop_effective_privs ();
+ fd = open (database, O_WRONLY | O_CREAT | O_EXCL, 0644);
+ regain_effective_privs ();
+ if (fd < 0)
+ error (FATAL, errno, _("can't create a temporary filename"));
+ close(fd);
+
if (!quiet)
printf (_("Processing manual pages under %s...\n"), manpath);
@@ -432,6 +442,7 @@ static int mandb (const char *catpath, c
if (stat (cachedir_tag, &st) == -1 && errno == ENOENT) {
FILE *cachedir_tag_file;
+ drop_effective_privs ();
cachedir_tag_file = fopen (cachedir_tag, "w");
if (cachedir_tag_file) {
fputs ("Signature: 8a477f597d28d172789f06886806bc55\n"
@@ -443,6 +454,7 @@ static int mandb (const char *catpath, c
cachedir_tag_file);
fclose (cachedir_tag_file);
}
+ regain_effective_privs ();
}
free (cachedir_tag);

170
man-db-2.6.3-zio.dif Normal file
View File

@ -0,0 +1,170 @@
--- config.h.in
+++ config.h.in 2012-10-02 09:06:48.591006953 +0000
@@ -674,6 +674,9 @@
/* Define to 1 if you have the `z' library (-lz). */
#undef HAVE_LIBZ
+/* Define to 1 if you have libzio for opening compressed manuals */
+#undef HAVE_ZIO
+
/* Define to 1 if you have the <linewrap.h> header file. */
#undef HAVE_LINEWRAP_H
--- configure.ac
+++ configure.ac 2012-10-02 09:55:06.783914808 +0000
@@ -98,6 +98,18 @@ AC_ARG_WITH([sections],
sections="$withval"
fi],
[: ${sections=1 n l 8 3 2 5 4 9 6 7}])
+AC_ARG_WITH([zio],
+[AS_HELP_STRING([--with-zio=LIBRARY], [use zlib/libbz2 wrapper library LIBRARY (libzio)])],
+ [if test -z "$withval" -o "$withval" = "yes"
+ then
+ zio=libzio
+ elif test "$withval" = "no"
+ then
+ AC_MSG_ERROR(--with-zio requires an argument)
+ else
+ zio=$withval
+ fi],
+ [: ${zio=no}])
AC_ARG_ENABLE([automatic-create],
[AS_HELP_STRING([--enable-automatic-create], [allow man to create user databases on the fly])],
[if test "$enableval" = "yes"
@@ -375,6 +387,40 @@ AC_SUBST([unlzma])
AC_SUBST([unxz])
AC_SUBST([unlzip])
MAN_COMPRESS_LIB([z], [gzopen])
+dnl Check for zlib and libbz2 libraries to use this together
+dnl with SuSE's libzio to open compressed info files.
+dnl
+if test "$zio" = "no" || test -n "$zio"
+then
+ AC_CHECK_HEADER(zio.h,[
+ for lib in ${zio#lib} zio
+ do
+ AC_CHECK_LIB($lib, fzopen, [LIBS="-l$lib $LIBS"; am_cv_libzio=yes])
+ done
+ ])
+ if test "$am_cv_libzio" = yes; then
+ AC_DEFINE([COMP_SRC],[],[Define if you have compressors and want to support compressed cat files.])
+ AC_DEFINE([HAVE_ZIO],[],[Define to 1 if you have libzio for opening compressed manuals])
+ AC_CHECK_HEADER(zlib.h,[
+ for lib in z gz
+ do
+ AC_CHECK_LIB($lib, gzopen, [LIBS="$LIBS -Wl,--no-as-needed -l$lib"; break])
+ done
+ ])
+ AC_CHECK_HEADER(bzlib.h,[
+ for lib in bz2 bzip2
+ do
+ AC_CHECK_LIB($lib, BZ2_bzopen, [LIBS="$LIBS -Wl,--no-as-needed -l$lib"; break])
+ done
+ ])
+ AC_CHECK_HEADER(lzma.h, [
+ for lib in lzma lzmadec
+ do
+ AC_CHECK_LIB($lib, lzmadec_open, [LIBS="$LIBS -Wl,--no-as-needed -l$lib"; break])
+ done
+ ])
+ fi
+fi
dnl To add more decompressors just follow the scheme above.
# Work out which manual page hierarchy scheme might be in use.
--- lib/decompress.c
+++ lib/decompress.c 2012-10-02 09:05:43.787007258 +0000
@@ -36,6 +36,10 @@
# include "zlib.h"
#endif /* HAVE_LIBZ */
+#ifdef HAVE_ZIO
+# include "zio.h"
+#endif /* HAVE_ZIO */
+
#include "manconfig.h"
#include "comp_src.h"
#include "pipeline.h"
@@ -66,6 +70,32 @@ static void decompress_zlib (void *data
#endif /* HAVE_LIBZ */
+#ifdef HAVE_ZIO
+
+static void decompress_zio (void *data)
+{
+ const char *what = (const char*)data;
+ FILE *file;
+
+ file = fdzopen(dup (fileno (stdin)), "r", what);
+ if (!file)
+ return;
+
+ for (;;) {
+ char buffer[4096];
+ int r = fread(buffer, sizeof(char), sizeof(buffer), file);
+ if (r <= 0)
+ break;
+ if (fwrite (buffer, 1, (size_t) r, stdout) < (size_t) r)
+ break;
+ }
+
+ fclose(file);
+ return;
+}
+
+#endif /* HAVE_ZIO */
+
pipeline *decompress_open (const char *filename)
{
pipecmd *cmd;
@@ -80,6 +110,37 @@ pipeline *decompress_open (const char *f
if (stat (filename, &st) < 0 || S_ISDIR (st.st_mode))
return NULL;
+#ifdef HAVE_ZIO
+ ext = strrchr (filename, '.');
+ if (ext) {
+ char opt[2] = {'\0', '\0'};
+ char *name;
+
+ if (STREQ (ext, ".gz"))
+ *opt = 'g';
+ else if (STREQ (ext, ".z"))
+ *opt = 'z';
+ else if (STREQ (ext, ".bz2"))
+ *opt = 'b';
+ else if (STREQ (ext, ".xz"))
+ *opt = 'x';
+ else if (STREQ (ext, ".lzma"))
+ *opt = 'l';
+ else if (STREQ (ext, ".Z"))
+ *opt = 'Z';
+ else
+ goto nozio;
+
+ /* informational only; no shell quoting concerns */
+ name = appendstr (NULL, "libzio < ", filename, NULL);
+ cmd = pipecmd_new_function (name, &decompress_zio, NULL,
+ opt);
+ free (name);
+ p = pipeline_new_commands (cmd, NULL);
+ goto got_pipeline;
+ }
+#endif /* HAVE_ZIO */
+
#ifdef HAVE_LIBZ
filename_len = strlen (filename);
if (filename_len > 3 && STREQ (filename + filename_len - 3, ".gz")) {
@@ -93,7 +154,11 @@ pipeline *decompress_open (const char *f
}
#endif /* HAVE_LIBZ */
+#ifdef HAVE_ZIO
+nozio:
+#else
ext = strrchr (filename, '.');
+#endif /* HAVE_LIBZ */
if (ext) {
++ext;

File diff suppressed because it is too large Load Diff

3
man-db-2.6.3.tar.xz Normal file
View File

@ -0,0 +1,3 @@
version https://git-lfs.github.com/spec/v1
oid sha256:51db85cbbdcb99927865bad4c653a8b18991831e751cc501098a772924e26b47
size 1388944

View File

@ -1,3 +0,0 @@
version https://git-lfs.github.com/spec/v1
oid sha256:67a9fbffb34c693617f7d43cee527acad9610bd30be437069519c326a442724d
size 313

129
man.spec
View File

@ -25,9 +25,13 @@ BuildRequires: gettext-tools
BuildRequires: groff
BuildRequires: less
BuildRequires: libbz2-devel
BuildRequires: libpipeline-devel
BuildRequires: libzio-devel
BuildRequires: pkg-config
BuildRequires: po4a
BuildRequires: xz-devel
BuildRequires: zlib-devel
Version: 2.5.2
Version: 2.6.3
Release: 0
Summary: A Program for Displaying man Pages
License: GPL-2.0+
@ -38,25 +42,21 @@ Provides: man_db
Requires: glibc-locale
Requires: groff >= 1.18
Requires: less
Source: man-db-%{version}.tar.bz2
Source: man-db-%{version}.tar.xz
Source1: sysconfig.cron-man
Source2: cron.daily.do_mandb
Source3: cron.daily.clean_catman
Source4: mancoding
Source5: wrapper.c
Patch0: man-db-%{version}.dif
Patch1: man-db_%{version}-2.diff.bz2
Source6: man-db-2.6.3-man0.dif
Patch2: man-db-2.3.19deb4.0-groff.dif
Patch4: man-db-2.4.3-section.dif
Patch5: man-db-2.5.1-security4.dif
Patch6: man-db-2.4.3-firefox.dif
Patch7: man-db-%{version}-chinese.dif
Patch8: man-db-2.5.1-globbing.dif
Patch9: man-db-2.5.1-zio.dif
Patch10: man-db-2.5.1-listall.dif
Patch11: man-db-%{version}-catp.dif
Patch12: man-db-2.5.2-fastpipe.dif
Patch13: man-db-2.5.2-fhs.dif
Patch14: automake-1.12.patch
Patch4: man-db-2.6.3-section.dif
Patch5: man-db-2.6.3-security4.dif
Patch6: man-db-2.6.3-firefox.dif
Patch7: man-db-2.6.3-chinese.dif
Patch9: man-db-2.6.3-zio.dif
Patch10: man-db-2.6.3-listall.dif
BuildRoot: %{_tmppath}/%{name}-%{version}-build
%global _sysconfdir /etc
@ -74,22 +74,14 @@ Authors:
%prep
%setup -n man-db-%{version}
%patch1 -p1 -b .debian
%patch2 -p0 -b .groff
%patch4 -p0 -b .sect
%patch5 -p0 -b .secu4
%patch6 -p0 -b .firefox
%patch7 -p0 -b .chinese
%patch8 -p0 -b .globbing
%patch9 -p0 -b .zio
%patch10 -p0 -b .listall
%patch11 -p0 -b .catp
%patch12 -p0 -b .fp
%patch13 -p0 -b .fhs
%patch0 -p0
%if 0%{?suse_version} > 1210
%patch14 -p1
%endif
%patch0 -p0
%build
gettextize --force --copy --no-changelog
@ -115,40 +107,35 @@ Authors:
Cg g s m)
SEC="${SEC[@]}"
rm -f configure
CFLAGS="${RPM_OPT_FLAGS} -funroll-loops -pipe -D_GNU_SOURCE -D_SVID_SOURCE -Wall"
%global optflags %{optflags} -funroll-loops -pipe -D_GNU_SOURCE -D_SVID_SOURCE -Wall
CFLAGS="%{optflags}"
LDFLAGS=
LIBS=
export CFLAGS LDFLAGS LIBS
%if %suse_version > 1030
aclocal -I ${PWD}/m4 -I ${PWD}/gnulib/m4
autoconf -B ${PWD}/m4 -B ${PWD}/gnulib/m4
LINGUAS=
for d in $(cat man/LINGUAS*) ; do
test -d %{_datadir}/locale/$d || continue
LINGUAS="${LINGUAS:+$LINGUAS }$d"
done
export CFLAGS LDFLAGS LIBS LINGUAS
aclocal -I ${PWD} -I ${PWD}/m4 -I ${PWD}/gnulib/m4
autoconf -B ${PWD} -B ${PWD}/m4 -B ${PWD}/gnulib/m4
automake --add-missing
%else
sed -ri 's/(m4_PACKAGE_VERSION,[[:blank:]]*\[)2.61(\])/\12.60\2/' aclocal.m4
sed -ri 's/(AM_INIT_AUTOMAKE\(\[)1.10/\11.9.6/' configure.ac
sed -ri 's/intl//' Makefile.am
aclocal -I ${PWD}/m4 -I ${PWD}/gnulib/m4
autoconf -B ${PWD}/m4 -B ${PWD}/gnulib/m4
mkdir -p tools
touch tools/compile
export MKDIR_P="mkdir -p"
%endif
./configure \
--enable-dups \
--enable-setuid=man \
--with-device=utf8 \
--prefix=%{_prefix} \
--mandir=%{_mandir} \
--localstatedir=%{_localstatedir} \
--libexecdir=%{_prefix}/lib \
--with-zio \
--with-gnu-ld \
--disable-rpath \
--enable-mb-groff \
--with-db=gdbm \
--enable-nls \
%configure \
--enable-dups \
--enable-setuid=man \
--with-device=utf8 \
--with-zio \
--with-gnu-ld \
--disable-rpath \
--disable-automatic-create \
--enable-automatic-update \
--disable-cats \
--enable-threads=posix \
--enable-mb-groff \
--with-db=gdbm \
--enable-nls \
--with-config-file=%{_sysconfdir}/manpath.config \
--without-included-gettext \
--without-included-gettext \
--with-sections="${SEC}"
make %{?_smp_mflags} nls=all
for man in $(find man/ -type f -a -name '*.man[0-9]'); do
@ -166,22 +153,33 @@ Authors:
" $man
esac
done
gcc $CFLAGS -I gnulib/lib/ -I include/ --include config.h --include configmake.h \
-o wrapper %{S:5} -L gnulib/lib/.libs/ -lgnu
%install
%if %suse_version <= 1030
export MKDIR_P="mkdir -p"
%endif
rm -rf %{buildroot}%{_localstatedir}/cache/man
rm -rf %{buildroot}%{_localstatedir}/cache/man
mkdir -p %{buildroot}%{_datadir}/doc/packages/man
mkdir -p %{buildroot}%{_prefix}/lib/man-db
mkdir -p %{buildroot}%{_bindir}
mkdir -p %{buildroot}/etc
make nls=all install DESTDIR=%{buildroot}
if test -x %{buildroot}%{_bindir}/wrapper ; then
rm -f %{buildroot}%{_bindir}/mandb
rm -f %{buildroot}%{_bindir}/man
mv %{buildroot}%{_bindir}/wrapper %{buildroot}%{_bindir}/mandb
ln -sf mandb %{buildroot}%{_bindir}/man
mv %{buildroot}%{_libdir}/man-db/libman*%{version}.so \
%{buildroot}%{_libdir}/
rm -rfv %{buildroot}%{_libdir}/man-db/
mv %{buildroot}%{_datadir}/doc/man-db/man-db-manual.* \
%{buildroot}%{_datadir}/doc/packages/man/
# wrapper
if test -x %{buildroot}%{_bindir}/mandb ; then
mv %{buildroot}%{_bindir}/mandb %{buildroot}%{_prefix}/lib/man-db/
fi
if test -x %{buildroot}%{_bindir}/man ; then
mv %{buildroot}%{_bindir}/man %{buildroot}%{_prefix}/lib/man-db/
fi
install wrapper %{buildroot}%{_bindir}/mandb
ln -sf mandb %{buildroot}%{_bindir}/man
mkdir -p %{buildroot}%{_mandir}
pushd %{buildroot}%{_mandir}/
rm -rf *.ascii/
@ -213,7 +211,8 @@ test -d var/catman/ && rm -rf var/catman/ || true
%files -f man-db.lang
%defattr(-,root,root)
%doc docs/COPYING
%doc docs/ChangeLog
%doc ChangeLog
%doc %{_datadir}/doc/packages/man/man-db-manual.*
%config /etc/manpath.config
%attr(0744,root,root) /etc/cron.daily/suse-clean_catman
%attr(0744,root,root) /etc/cron.daily/suse-do_mandb
@ -230,25 +229,19 @@ test -d var/catman/ && rm -rf var/catman/ || true
%{_bindir}/manpath
%{_bindir}/whatis
%{_bindir}/zsoelim
%if %suse_version > 1030
%dir %attr(0755,root,root) %{_prefix}/lib/man-db
%attr(0755,root,root) %{_prefix}/lib/man-db/man
%attr(0755,root,root) %{_prefix}/lib/man-db/mandb
%attr(0755,man,man) %{_prefix}/lib/man-db/manconv
%attr(0755,man,man) %{_prefix}/lib/man-db/globbing
%else
%dir %attr(0711,root,root) %{_prefix}/lib/man-db
%attr(0711,root,root) %{_prefix}/lib/man-db/man
%attr(0711,root,root) %{_prefix}/lib/man-db/mandb
%attr(0711,man,man) %{_prefix}/lib/man-db/manconv
%attr(0711,man,man) %{_prefix}/lib/man-db/globbing
%endif
%{_sbindir}/accessdb
%{_libdir}/libman*.so
%{_datadir}/groff/site-tmac/tmac.andb
%{_datadir}/groff/site-tmac/tmac.andocdb
%doc %{_mandir}/man1/*.1.gz
%doc %{_mandir}/man5/*.5.gz
%doc %{_mandir}/man8/*.8.gz
%dir %{_mandir}/id
%defattr(-,man,man)
%{_localstatedir}/cache/man/*
%{_localstatedir}/adm/fillup-templates/sysconfig.cron-man

138
wrapper.c Normal file
View File

@ -0,0 +1,138 @@
/*
* wrapper.c - wrapper program around man and mandb
*
* Copyright (C) 2000 Fabrizio Polacco <fpolacco@debian.org>
* Copyright (C) 2001, 2002 Colin Watson.
*
* This file is part of man-db.
*
* man-db is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* man-db is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with man-db; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif /* HAVE_CONFIG_H */
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <grp.h>
#include <pwd.h>
#include <grp.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include "dirname.h"
#include "gettext.h"
#include <locale.h>
#define _(Text) gettext (Text)
#include "manconfig.h"
/* this list is used to authenticate the program running.
* it is fixed at compile time to avoid a full class of
* dangers ...
*/
static struct {
const char *prog;
const char *run;
const char *user;
} *wlp, wrapped_list[] =
{ /* prog run user */
#ifdef DEBUG
{ "_man", "src/man", "man" },
{ "_mandb", "src/mandb", "man" },
#endif
{ "man", "/usr/lib/man-db/man", "man" },
{ "mandb", "/usr/lib/man-db/mandb", "man" },
{ 0, 0, 0, }};
char *program_name;
int main (int argc, char **argv, char *envp[])
{
uid_t ruid, euid;
gid_t rgid;
struct passwd *pwd;
argc = argc; /* not used */
/* We don't warn about this setlocale() call failing, as the program
* we call will do that.
*/
setlocale (LC_ALL, "");
bindtextdomain (PACKAGE, LOCALEDIR);
bindtextdomain (PACKAGE "-gnulib", LOCALEDIR);
textdomain (PACKAGE);
/* this wrapper can be run as "man" or as "mandb" */
program_name = base_name (argv[0]);
ruid = getuid ();
euid = geteuid();
rgid = getgid ();
#ifdef DEBUG
printf ("%s:\n", program_name);
#endif
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;
}
#ifdef DEBUG
printf ("%s\n", wlp->run);
#endif
if (ruid == 0 || euid == 0) {
pwd = getpwnam (wlp->user);
if (!pwd) {
fprintf (stderr, _("%s: Failed su to user %s\n"), wlp->prog, wlp->user);
return -EACCES;
}
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/cache/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, rgid)) {
fprintf (stderr, _("%s: Failed su to user %s\n"), wlp->prog, wlp->user);
return -EACCES;
}
if (setreuid (ruid, pwd->pw_uid)) {
fprintf (stderr, _("%s: Failed su to user %s\n"), wlp->prog, wlp->user);
return -EACCES;
}
}
execve (wlp->run, argv, envp);
perror ("execve");
return -errno;
}