Annotation of /trunk/man/patches/man-1.6c-cut-duplicate-manpaths.patch
Parent Directory | Revision Log
Revision 324 -
(hide annotations)
(download)
Mon Aug 20 16:04:40 2007 UTC (17 years, 1 month ago) by niro
File size: 2148 byte(s)
Mon Aug 20 16:04:40 2007 UTC (17 years, 1 month ago) by niro
File size: 2148 byte(s)
-missing cron file and added some fixes
1 | niro | 324 | http://bugs.gentoo.org/90186 |
2 | |||
3 | If we have entries in MANPATH that are really symlinks to other entries, | ||
4 | then many man functions will yield duplicate entries. | ||
5 | |||
6 | Without this patch, we see this behavior: | ||
7 | $ echo $MANPATH | ||
8 | /usr/share/man:/usr/man | ||
9 | $ man --path | ||
10 | /usr/share/man:/usr/man | ||
11 | $ ls -ld /usr/share/man /usr/man | ||
12 | lrwxrwxrwx 1 /usr/man -> /usr/share/man | ||
13 | drwxr-xr-x 36 /usr/share/man | ||
14 | $ man -k passwd | ||
15 | passwd (1) - change user password | ||
16 | passwd (1) - change user password | ||
17 | |||
18 | With this patch, we get: | ||
19 | $ echo $MANPATH | ||
20 | /usr/share/man:/usr/man | ||
21 | $ man --path | ||
22 | /usr/share/man | ||
23 | $ ls -ld /usr/share/man /usr/man | ||
24 | lrwxrwxrwx 1 /usr/man -> /usr/share/man | ||
25 | drwxr-xr-x 36 /usr/share/man | ||
26 | $ man -k passwd | ||
27 | passwd (1) - change user password | ||
28 | |||
29 | --- man-1.6c/src/manpath.c | ||
30 | +++ man-1.6c/src/manpath.c | ||
31 | @@ -380,6 +380,44 @@ | ||
32 | } | ||
33 | } | ||
34 | |||
35 | +void trim_symlinked_manpaths (void); | ||
36 | +void | ||
37 | +trim_symlinked_manpaths () { | ||
38 | + /* | ||
39 | + * Skip symlinks to other entries in path. | ||
40 | + * Do this after we've built the entire list. | ||
41 | + */ | ||
42 | + struct stat *stat_cache; | ||
43 | + size_t i, j, size; | ||
44 | + | ||
45 | + if (!mandirlist) | ||
46 | + return; | ||
47 | + | ||
48 | + for (size = 0; mandirlist[size]; ++size) | ||
49 | + /* count # of elements */; | ||
50 | + if (size == 0) | ||
51 | + return; | ||
52 | + /* cache stat information for every element */ | ||
53 | + stat_cache = (struct stat *) my_malloc (size * sizeof(*stat_cache)); | ||
54 | + for (i = 0; i < size; ++i) | ||
55 | + stat(mandirlist[i], &stat_cache[i]); | ||
56 | + | ||
57 | +#define EQU_STAT(s,d) ((s).st_dev == (d).st_dev && (s).st_ino == (d).st_ino) | ||
58 | + for (i = 0; i < size; ++i) { | ||
59 | + for (j = i+1; j < size; ++j) { | ||
60 | + if (EQU_STAT(stat_cache[i], stat_cache[j])) { | ||
61 | + /* these two entries are the same, so cut out the second one */ | ||
62 | + memmove(mandirlist+j, mandirlist+j+1, (size-j)*sizeof(*mandirlist)); | ||
63 | + memmove(stat_cache+j, stat_cache+j+1, (size-j)*sizeof(*stat_cache)); | ||
64 | + mandirlist[--size] = NULL; | ||
65 | + --j; | ||
66 | + } | ||
67 | + } | ||
68 | + } | ||
69 | + | ||
70 | + free(stat_cache); | ||
71 | +} | ||
72 | + | ||
73 | void | ||
74 | init_manpath () { | ||
75 | static int done = 0; | ||
76 | @@ -391,6 +431,7 @@ | ||
77 | (manp = getenv ("MANPATH")) == NULL) | ||
78 | manp = ""; /* default path */ | ||
79 | split (manp, to_mandirlist, 0); | ||
80 | + trim_symlinked_manpaths (); | ||
81 | done = 1; | ||
82 | } | ||
83 | } |