diff options
author | sevan <sevan@pkgsrc.org> | 2015-03-26 14:16:12 +0000 |
---|---|---|
committer | sevan <sevan@pkgsrc.org> | 2015-03-26 14:16:12 +0000 |
commit | 2a4914a379bfc7f9a13f6177875706a042747bb8 (patch) | |
tree | da216e71fc774288c10fe2e57bf97a69ec0fa58f /textproc | |
parent | 22f54b5d05c17e6ca18c578470db1cd5ba1e297c (diff) | |
download | pkgsrc-2a4914a379bfc7f9a13f6177875706a042747bb8.tar.gz |
Use the patch from upstream for the upcoming version to address the issue of
operating systems lacking dirfd(3) as implemented by Ingo Schwarze.
Confirmed to resolve build issues on Solaris 9 & higher.
Reviewed by wiz@
Diffstat (limited to 'textproc')
-rw-r--r-- | textproc/mdocml/Makefile | 3 | ||||
-rw-r--r-- | textproc/mdocml/distinfo | 5 | ||||
-rw-r--r-- | textproc/mdocml/patches/patch-compat_fts.c | 275 | ||||
-rw-r--r-- | textproc/mdocml/patches/patch-compat_fts.h | 33 |
4 files changed, 303 insertions, 13 deletions
diff --git a/textproc/mdocml/Makefile b/textproc/mdocml/Makefile index bd2619229c4..b137471cec7 100644 --- a/textproc/mdocml/Makefile +++ b/textproc/mdocml/Makefile @@ -1,6 +1,7 @@ -# $NetBSD: Makefile,v 1.48 2015/03/14 10:24:38 wiz Exp $ +# $NetBSD: Makefile,v 1.49 2015/03/26 14:16:12 sevan Exp $ DISTNAME= mdocml-1.13.3 +PKGREVISION= 1 CATEGORIES= textproc devel MASTER_SITES= http://mdocml.bsd.lv/snapshots/ diff --git a/textproc/mdocml/distinfo b/textproc/mdocml/distinfo index 8b1715a8fca..9be72745c17 100644 --- a/textproc/mdocml/distinfo +++ b/textproc/mdocml/distinfo @@ -1,7 +1,8 @@ -$NetBSD: distinfo,v 1.38 2015/03/19 08:29:40 tron Exp $ +$NetBSD: distinfo,v 1.39 2015/03/26 14:16:12 sevan Exp $ SHA1 (mdocml-1.13.3.tar.gz) = 3ccfbb492a477b84343c97de743b3dd5bd3c763b RMD160 (mdocml-1.13.3.tar.gz) = 47d1096708b45b15d8f198404fd6608d164bb66a Size (mdocml-1.13.3.tar.gz) = 358971 bytes -SHA1 (patch-compat_fts.c) = bc20484964d8ff0aa2af07d581bad39a6c056a5a +SHA1 (patch-compat_fts.c) = 9ae6bc956e44b87ac957d6d8d9e9179e6a6cb25a +SHA1 (patch-compat_fts.h) = a1b38d4af483df59cabbe7c9925f52a4445c2898 SHA1 (patch-roff.7) = 22335024f83abc347ca39aabf7ab8d9cb38f7db2 diff --git a/textproc/mdocml/patches/patch-compat_fts.c b/textproc/mdocml/patches/patch-compat_fts.c index 6b0e4191e8d..f4e0726fe31 100644 --- a/textproc/mdocml/patches/patch-compat_fts.c +++ b/textproc/mdocml/patches/patch-compat_fts.c @@ -1,17 +1,272 @@ -$NetBSD: patch-compat_fts.c,v 1.3 2015/03/19 08:29:40 tron Exp $ +$NetBSD: patch-compat_fts.c,v 1.4 2015/03/26 14:16:12 sevan Exp $ -Fix build under Solaris 10. +"We always use FTS_NOCHDIR, so delete the directory changing code. +This not only simplifies matters, but also helps operating systems +lacking dirfd(3), for example Solaris 10." ---- compat_fts.c.orig 2015-03-13 12:38:38.000000000 +0000 -+++ compat_fts.c 2015-03-19 08:22:11.000000000 +0000 -@@ -76,6 +76,10 @@ +--- compat_fts.c.orig 2015-03-26 04:03:30.000000000 +0000 ++++ compat_fts.c +@@ -60,7 +60,6 @@ static size_t fts_maxarglen(char * cons + static void fts_padjust(FTS *, FTSENT *); + static int fts_palloc(FTS *, size_t); + static unsigned short fts_stat(FTS *, FTSENT *); +-static int fts_safe_changedir(FTS *, FTSENT *, int, const char *); - #define FCHDIR(sp, fd) (!ISSET(FTS_NOCHDIR) && fchdir(fd)) + #define ISDOT(a) (a[0] == '.' && (!a[1] || (a[1] == '.' && !a[2]))) + #ifndef O_DIRECTORY +@@ -74,8 +73,6 @@ static int fts_safe_changedir(FTS *, FT + #define ISSET(opt) (sp->fts_options & (opt)) + #define SET(opt) (sp->fts_options |= (opt)) -+#ifdef __sun__ -+#define dirfd(fd) ((fd)->dd_fd) -+#endif -+ +-#define FCHDIR(sp, fd) (!ISSET(FTS_NOCHDIR) && fchdir(fd)) +- FTS * fts_open(char * const *argv, int options, void *dummy) { +@@ -146,17 +143,6 @@ fts_open(char * const *argv, int options + sp->fts_cur->fts_link = root; + sp->fts_cur->fts_info = FTS_INIT; + +- /* +- * If using chdir(2), grab a file descriptor pointing to dot to ensure +- * that we can get back here; this could be avoided for some paths, +- * but almost certainly not worth the effort. Slashes, symbolic links, +- * and ".." are all fairly nasty problems. Note, if we can't get the +- * descriptor we run anyway, just more slowly. +- */ +- if (!ISSET(FTS_NOCHDIR) && +- (sp->fts_rfd = open(".", O_RDONLY | O_CLOEXEC)) < 0) +- SET(FTS_NOCHDIR); +- + if (nitems == 0) + free(parent); + +@@ -213,25 +199,13 @@ fts_close(FTS *sp) + free(p); + } + +- /* Stash the original directory fd if needed. */ +- rfd = ISSET(FTS_NOCHDIR) ? -1 : sp->fts_rfd; +- + /* Free up child linked list, sort array, path buffer, stream ptr.*/ + if (sp->fts_child) + fts_lfree(sp->fts_child); + free(sp->fts_path); + free(sp); + +- /* Return to original directory, checking for error. */ +- if (rfd != -1) { +- int saved_errno; +- error = fchdir(rfd); +- saved_errno = errno; +- (void)close(rfd); +- errno = saved_errno; +- } +- +- return (error); ++ return (0); + } + + /* +@@ -274,25 +248,11 @@ fts_read(FTS *sp) + } + + /* +- * Cd to the subdirectory. +- * +- * If have already read and now fail to chdir, whack the list +- * to make the names come out right, and set the parent errno +- * so the application will eventually get an error condition. +- * Set the FTS_DONTCHDIR flag so that when we logically change +- * directories back to the parent we don't do a chdir. +- * + * If haven't read do so. If the read fails, fts_build sets + * FTS_STOP or the fts_info field of the node. + */ + if (sp->fts_child) { +- if (fts_safe_changedir(sp, p, -1, p->fts_accpath)) { +- p->fts_errno = errno; +- p->fts_flags |= FTS_DONTCHDIR; +- for (p = sp->fts_child; p; p = p->fts_link) +- p->fts_accpath = +- p->fts_parent->fts_accpath; +- } ++ /* nothing */ + } else if ((sp->fts_child = fts_build(sp)) == NULL) { + if (ISSET(FTS_STOP)) + return (NULL); +@@ -352,23 +312,6 @@ name: t = sp->fts_path + NAPPEND(p->fts + /* NUL terminate the pathname. */ + sp->fts_path[p->fts_pathlen] = '\0'; + +- /* +- * Return to the parent directory. If at a root node or came through +- * a symlink, go back through the file descriptor. Otherwise, cd up +- * one directory. +- */ +- if (p->fts_level == FTS_ROOTLEVEL) { +- if (FCHDIR(sp, sp->fts_rfd)) { +- SET(FTS_STOP); +- sp->fts_cur = p; +- return (NULL); +- } +- } else if (!(p->fts_flags & FTS_DONTCHDIR) && +- fts_safe_changedir(sp, p->fts_parent, -1, "..")) { +- SET(FTS_STOP); +- sp->fts_cur = p; +- return (NULL); +- } + p->fts_info = p->fts_errno ? FTS_ERR : FTS_DP; + return (sp->fts_cur = p); + } +@@ -432,32 +375,6 @@ fts_build(FTS *sp) + } + + /* +- * If we're going to need to stat anything or we want to descend +- * and stay in the directory, chdir. If this fails we keep going, +- * but set a flag so we don't chdir after the post-order visit. +- * We won't be able to stat anything, but we can still return the +- * names themselves. Note, that since fts_read won't be able to +- * chdir into the directory, it will have to return different path +- * names than before, i.e. "a/b" instead of "b". Since the node +- * has already been visited in pre-order, have to wait until the +- * post-order visit to return the error. There is a special case +- * here, if there was nothing to stat then it's not an error to +- * not be able to stat. This is all fairly nasty. If a program +- * needed sorted entries or stat information, they had better be +- * checking FTS_NS on the returned nodes. +- */ +- cderrno = 0; +- if (fts_safe_changedir(sp, cur, dirfd(dirp), NULL)) { +- cur->fts_errno = errno; +- cur->fts_flags |= FTS_DONTCHDIR; +- descend = 0; +- cderrno = errno; +- (void)closedir(dirp); +- dirp = NULL; +- } else +- descend = 1; +- +- /* + * Figure out the max file name length that can be stored in the + * current path -- the inner loop allocates more path as necessary. + * We really wouldn't have to do the maxlen calculations here, we +@@ -468,10 +385,8 @@ fts_build(FTS *sp) + * each new name into the path. + */ + len = NAPPEND(cur); +- if (ISSET(FTS_NOCHDIR)) { +- cp = sp->fts_path + len; +- *cp++ = '/'; +- } ++ cp = sp->fts_path + len; ++ *cp++ = '/'; + len++; + maxlen = sp->fts_pathlen - len; + +@@ -518,8 +433,7 @@ mem1: saved_errno = errno; + /* Did realloc() change the pointer? */ + if (oldaddr != sp->fts_path) { + doadjust = 1; +- if (ISSET(FTS_NOCHDIR)) +- cp = sp->fts_path + len; ++ cp = sp->fts_path + len; + } + maxlen = sp->fts_pathlen - len; + } +@@ -542,20 +456,11 @@ mem1: saved_errno = errno; + return (NULL); + } + +- if (cderrno) { +- p->fts_info = FTS_NS; +- p->fts_errno = cderrno; +- p->fts_accpath = cur->fts_accpath; +- } else { +- /* Build a file name for fts_stat to stat. */ +- if (ISSET(FTS_NOCHDIR)) { +- p->fts_accpath = p->fts_path; +- memmove(cp, p->fts_name, p->fts_namelen + 1); +- } else +- p->fts_accpath = p->fts_name; +- /* Stat it. */ +- p->fts_info = fts_stat(sp, p); +- } ++ /* Build a file name for fts_stat to stat. */ ++ p->fts_accpath = p->fts_path; ++ memmove(cp, p->fts_name, p->fts_namelen + 1); ++ /* Stat it. */ ++ p->fts_info = fts_stat(sp, p); + + /* We walk in directory order so "ls -f" doesn't get upset. */ + p->fts_link = NULL; +@@ -581,26 +486,9 @@ mem1: saved_errno = errno; + * If not changing directories, reset the path back to original + * state. + */ +- if (ISSET(FTS_NOCHDIR)) { +- if (len == sp->fts_pathlen || nitems == 0) +- --cp; +- *cp = '\0'; +- } +- +- /* +- * If descended after called from fts_children or after called from +- * fts_read and nothing found, get back. At the root level we use +- * the saved fd; if one of fts_open()'s arguments is a relative path +- * to an empty directory, we wind up here with no other way back. If +- * can't get back, we're done. +- */ +- if (descend && !nitems && +- (cur->fts_level == FTS_ROOTLEVEL ? FCHDIR(sp, sp->fts_rfd) : +- fts_safe_changedir(sp, cur->fts_parent, -1, ".."))) { +- cur->fts_info = FTS_ERR; +- SET(FTS_STOP); +- return (NULL); +- } ++ if (len == sp->fts_pathlen || nitems == 0) ++ --cp; ++ *cp = '\0'; + + /* If didn't find anything, return NULL. */ + if (!nitems) { +@@ -771,38 +659,4 @@ fts_maxarglen(char * const *argv) + return (max + 1); + } + +-/* +- * Change to dir specified by fd or p->fts_accpath without getting +- * tricked by someone changing the world out from underneath us. +- * Assumes p->fts_dev and p->fts_ino are filled in. +- */ +-static int +-fts_safe_changedir(FTS *sp, FTSENT *p, int fd, const char *path) +-{ +- int ret, oerrno, newfd; +- struct stat sb; +- +- newfd = fd; +- if (ISSET(FTS_NOCHDIR)) +- return (0); +- if (fd < 0 && (newfd = open(path, O_RDONLY|O_DIRECTORY|O_CLOEXEC)) < 0) +- return (-1); +- if (fstat(newfd, &sb)) { +- ret = -1; +- goto bail; +- } +- if (p->fts_dev != sb.st_dev || p->fts_ino != sb.st_ino) { +- errno = ENOENT; /* disinformation */ +- ret = -1; +- goto bail; +- } +- ret = fchdir(newfd); +-bail: +- oerrno = errno; +- if (fd < 0) +- (void)close(newfd); +- errno = oerrno; +- return (ret); +-} +- + #endif diff --git a/textproc/mdocml/patches/patch-compat_fts.h b/textproc/mdocml/patches/patch-compat_fts.h new file mode 100644 index 00000000000..f26045d385c --- /dev/null +++ b/textproc/mdocml/patches/patch-compat_fts.h @@ -0,0 +1,33 @@ +$NetBSD: patch-compat_fts.h,v 1.1 2015/03/26 14:16:12 sevan Exp $ + +"We always use FTS_NOCHDIR, so delete the directory changing code. +This not only simplifies matters, but also helps operating systems +lacking dirfd(3), for example Solaris 10." + +--- compat_fts.h.orig 2015-03-26 04:16:43.000000000 +0000 ++++ compat_fts.h +@@ -40,13 +40,12 @@ typedef struct { + struct _ftsent *fts_child; /* linked list of children */ + dev_t fts_dev; /* starting device # */ + char *fts_path; /* path for this descent */ +- int fts_rfd; /* fd for root */ + size_t fts_pathlen; /* sizeof(path) */ + + #define FTS_NOCHDIR 0x0004 /* don't change directories */ + #define FTS_PHYSICAL 0x0010 /* physical walk */ + #define FTS_XDEV 0x0040 /* don't cross devices */ +-#define FTS_OPTIONMASK 0x00ff /* valid user option mask */ ++#define FTS_OPTIONMASK 0x0054 /* valid user option mask */ + + #define FTS_STOP 0x2000 /* (private) unrecoverable error */ + int fts_options; /* fts_open options, global flags */ +@@ -85,9 +84,6 @@ typedef struct _ftsent { + #define FTS_SL 12 /* symbolic link */ + unsigned short fts_info; /* user flags for FTSENT structure */ + +-#define FTS_DONTCHDIR 0x01 /* don't chdir .. to the parent */ +- unsigned short fts_flags; /* private flags for FTSENT structure */ +- + #define FTS_NOINSTR 3 /* no instructions */ + #define FTS_SKIP 4 /* discard node */ + unsigned short fts_instr; /* fts_set() instructions */ |