man-db/man-db-2.6.1-wildcards.patch
Peter Schiffer b2bffc6b83 - resolves: #677669
added support for wildcards in path
- resolves: #693458
  fixed error with .so links
2012-04-24 15:32:21 +02:00

216 lines
5.1 KiB
Diff

diff -upr man-db-2.6.1.orig/src/globbing.c man-db-2.6.1/src/globbing.c
--- man-db-2.6.1.orig/src/globbing.c 2010-09-26 23:08:14.000000000 +0200
+++ man-db-2.6.1/src/globbing.c 2012-04-24 14:30:30.113882075 +0200
@@ -427,3 +427,30 @@ char **look_for_file (const char *hier,
else
return gbuf.gl_pathv;
}
+
+char **expand_path (const char *path)
+{
+ int res = 0;
+ char **result = NULL;
+ glob_t globbuf;
+
+ res = glob (path, 0, NULL, &globbuf);
+ /* if glob failed, return the given path */
+ if (res != 0) {
+ result = (char **) xmalloc (2 * sizeof(char **));
+ result[0] = xstrndup (path, strlen(path));
+ result[1] = NULL;
+ return result;
+ }
+
+ result = (char **) xmalloc ((globbuf.gl_pathc + 1) * sizeof(char **));
+ size_t i;
+ for (i = 0; i < globbuf.gl_pathc; i++) {
+ result[i] = xstrndup (globbuf.gl_pathv[i], strlen (globbuf.gl_pathv[i]));
+ }
+ result[globbuf.gl_pathc] = NULL;
+
+ globfree (&globbuf);
+
+ return result;
+}
diff -upr man-db-2.6.1.orig/src/globbing.h man-db-2.6.1/src/globbing.h
--- man-db-2.6.1.orig/src/globbing.h 2008-12-11 00:06:18.000000000 +0100
+++ man-db-2.6.1/src/globbing.h 2012-03-26 20:35:49.580882731 +0200
@@ -29,3 +29,6 @@ enum look_for_file_opts {
/* globbing.c */
extern char **look_for_file (const char *hier, const char *sec,
const char *unesc_name, int cat, int opts);
+
+/* Expand path with wildcards into list of all existing directories. */
+extern char **expand_path (const char *path);
diff -upr man-db-2.6.1.orig/src/Makefile.am man-db-2.6.1/src/Makefile.am
--- man-db-2.6.1.orig/src/Makefile.am 2012-02-05 14:25:20.000000000 +0100
+++ man-db-2.6.1/src/Makefile.am 2012-03-26 20:35:49.581882637 +0200
@@ -72,6 +72,8 @@ zsoelim_LDADD = $(LIBMAN) $(libpipeline_
accessdb_SOURCES = \
accessdb.c
catman_SOURCES = \
+ globbing.c \
+ globbing.h \
catman.c \
manp.c \
manp.h
@@ -140,10 +142,14 @@ mandb_SOURCES = \
ult_src.c \
ult_src.h
manpath_SOURCES = \
+ globbing.c \
+ globbing.h \
manp.c \
manp.h \
manpath.c
whatis_SOURCES = \
+ globbing.c \
+ globbing.h \
manconv.c \
manconv.h \
manp.c \
diff -upr man-db-2.6.1.orig/src/manp.c man-db-2.6.1/src/manp.c
--- man-db-2.6.1.orig/src/manp.c 2012-02-05 14:18:59.000000000 +0100
+++ man-db-2.6.1/src/manp.c 2012-03-26 20:35:49.617879267 +0200
@@ -75,6 +75,7 @@
#endif
#include "manp.h"
+#include "globbing.h"
struct list {
char *key;
@@ -1035,32 +1036,45 @@ char *get_manpath_from_path (const char
static void add_dir_to_list (char **lp, const char *dir)
{
int status;
- int pos = 0;
-
- while (*lp != NULL) {
- if (pos > MAXDIRS - 1)
- gripe_overlong_list ();
- if (!strcmp (*lp, dir)) {
- debug ("%s is already in the manpath\n", dir);
- return;
+ int pos = 0, i = 0;
+ char *d = NULL;
+ char **expanded_dirs = NULL;
+
+ expanded_dirs = expand_path (dir);
+ for (i = 0; expanded_dirs[i] != NULL; i++) {
+ d = expanded_dirs[i];
+
+ while (*lp != NULL) {
+ if (pos > MAXDIRS - 1)
+ gripe_overlong_list ();
+ if (!strcmp (*lp, d)) {
+ debug ("%s is already in the manpath\n", d);
+ return;
+ }
+ lp++;
+ pos++;
}
- lp++;
- pos++;
- }
- /* Not found -- add it. */
+ /* Not found -- add it. */
+
+ status = is_directory (d);
- status = is_directory (dir);
+ if (status < 0)
+ gripe_stat_file (d);
+ else if (status == 0)
+ gripe_not_directory (d);
+ else if (status == 1) {
+ debug ("adding %s to manpath\n", d);
- if (status < 0)
- gripe_stat_file (dir);
- else if (status == 0)
- gripe_not_directory (dir);
- else if (status == 1) {
- debug ("adding %s to manpath\n", dir);
+ *lp = xstrdup (d);
+ }
- *lp = xstrdup (dir);
+ free (d);
}
+
+ /* free also the last NULL pointer */
+ free (expanded_dirs[i]);
+ free (expanded_dirs);
}
/* path does not exist in config file: check to see if path/../man,
@@ -1104,33 +1118,47 @@ static inline char *has_mandir (const ch
static char **add_dir_to_path_list (char **mphead, char **mp, const char *p)
{
- int status;
+ int status, i = 0;
char *cwd;
+ char *d = NULL;
+ char **expanded_dirs = NULL;
if (mp - mphead > MAXDIRS - 1)
gripe_overlong_list ();
- status = is_directory (p);
-
- if (status < 0)
- gripe_stat_file (p);
- else if (status == 0)
- gripe_not_directory (p);
- else {
- /* deal with relative paths */
+ expanded_dirs = expand_path (p);
+ for (i = 0; expanded_dirs[i] != NULL; i++) {
+ d = expanded_dirs[i];
+
+ status = is_directory (d);
+
+ if (status < 0)
+ gripe_stat_file (d);
+ else if (status == 0)
+ gripe_not_directory (d);
+ else {
+ /* deal with relative paths */
+
+ if (*d != '/') {
+ cwd = xgetcwd ();
+ if (!cwd)
+ error (FATAL, errno,
+ _("can't determine current directory"));
+ *mp = appendstr (cwd, "/", d, NULL);
+ } else
+ *mp = xstrdup (d);
- if (*p != '/') {
- cwd = xgetcwd ();
- if (!cwd)
- error (FATAL, errno,
- _("can't determine current directory"));
- *mp = appendstr (cwd, "/", p, NULL);
- } else
- *mp = xstrdup (p);
+ debug ("adding %s to manpathlist\n", *mp);
+ mp++;
+ }
- debug ("adding %s to manpathlist\n", *mp);
- mp++;
+ free (d);
}
+
+ /* free also the last NULL pointer */
+ free (expanded_dirs[i]);
+ free (expanded_dirs);
+
return mp;
}