patches for easier mirroring, to eliminate a special copy, to make www.freebsd.org/security a full copy of security.freebsd.org and be eventually be the same. For now files are just sitting there. The symlinks are missing. Discussed on: www (repository location) Discussed with: simon (so)
		
			
				
	
	
		
			98 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
			
		
		
	
	
			98 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Diff
		
	
	
	
	
	
| Index: gen/fts.c
 | |
| ===================================================================
 | |
| RCS file: /home/ncvs/src/lib/libc/gen/fts.c,v
 | |
| retrieving revision 1.14.2.1
 | |
| diff -u -r1.14.2.1 fts.c
 | |
| --- gen/fts.c	2001/03/05 04:44:42	1.14.2.1
 | |
| +++ gen/fts.c	2001/08/18 23:21:03
 | |
| @@ -63,7 +63,7 @@
 | |
|  static int	 fts_palloc __P((FTS *, size_t));
 | |
|  static FTSENT	*fts_sort __P((FTS *, FTSENT *, int));
 | |
|  static u_short	 fts_stat __P((FTS *, FTSENT *, int));
 | |
| -static int	 fts_safe_changedir __P((FTS *, FTSENT *, int));
 | |
| +static int	 fts_safe_changedir __P((FTS *, FTSENT *, int, char *));
 | |
|  
 | |
|  #define	ISDOT(a)	(a[0] == '.' && (!a[1] || (a[1] == '.' && !a[2])))
 | |
|  
 | |
| @@ -71,7 +71,6 @@
 | |
|  #define	ISSET(opt)	(sp->fts_options & (opt))
 | |
|  #define	SET(opt)	(sp->fts_options |= (opt))
 | |
|  
 | |
| -#define	CHDIR(sp, path)	(!ISSET(FTS_NOCHDIR) && chdir(path))
 | |
|  #define	FCHDIR(sp, fd)	(!ISSET(FTS_NOCHDIR) && fchdir(fd))
 | |
|  
 | |
|  /* fts_build flags */
 | |
| @@ -275,6 +274,7 @@
 | |
|  fts_read(sp)
 | |
|  	register FTS *sp;
 | |
|  {
 | |
| +	struct stat sb;
 | |
|  	register FTSENT *p, *tmp;
 | |
|  	register int instr;
 | |
|  	register char *t;
 | |
| @@ -351,7 +351,7 @@
 | |
|  		 * FTS_STOP or the fts_info field of the node.
 | |
|  		 */
 | |
|  		if (sp->fts_child != NULL) {
 | |
| -			if (fts_safe_changedir(sp, p, -1)) {
 | |
| +			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 != NULL; 
 | |
| @@ -449,11 +449,10 @@
 | |
|  			return (NULL);
 | |
|  		}
 | |
|  		(void)_close(p->fts_symfd);
 | |
| -	} else if (!(p->fts_flags & FTS_DONTCHDIR)) {
 | |
| -		if (CHDIR(sp, "..")) {
 | |
| -			SET(FTS_STOP);
 | |
| -			return (NULL);
 | |
| -		}
 | |
| +	} else if (!(p->fts_flags & FTS_DONTCHDIR) &&
 | |
| +		   fts_safe_changedir(sp, p->fts_parent, -1, "..")) {
 | |
| +		SET(FTS_STOP);
 | |
| +		return (NULL);
 | |
|  	}
 | |
|  	p->fts_info = p->fts_errno ? FTS_ERR : FTS_DP;
 | |
|  	return (sp->fts_cur = p);
 | |
| @@ -640,7 +639,7 @@
 | |
|  	 */
 | |
|  	cderrno = 0;
 | |
|  	if (nlinks || type == BREAD) {
 | |
| -		if (fts_safe_changedir(sp, cur, dirfd(dirp))) {
 | |
| +		if (fts_safe_changedir(sp, cur, dirfd(dirp), NULL)) {
 | |
|  			if (nlinks && type == BREAD)
 | |
|  				cur->fts_errno = errno;
 | |
|  			cur->fts_flags |= FTS_DONTCHDIR;
 | |
| @@ -806,7 +805,8 @@
 | |
|  	 */
 | |
|  	if (descend && (type == BCHILD || !nitems) &&
 | |
|  	    (cur->fts_level == FTS_ROOTLEVEL ?
 | |
| -	    FCHDIR(sp, sp->fts_rfd) : CHDIR(sp, ".."))) {
 | |
| +	    FCHDIR(sp, sp->fts_rfd) :
 | |
| +	    fts_safe_changedir(sp, cur->fts_parent, -1, ".."))) {
 | |
|  		cur->fts_info = FTS_ERR;
 | |
|  		SET(FTS_STOP);
 | |
|  		return (NULL);
 | |
| @@ -1069,10 +1069,11 @@
 | |
|   * Assumes p->fts_dev and p->fts_ino are filled in.
 | |
|   */
 | |
|  static int
 | |
| -fts_safe_changedir(sp, p, fd)
 | |
| +fts_safe_changedir(sp, p, fd, path)
 | |
|  	FTS *sp;
 | |
|  	FTSENT *p;
 | |
|  	int fd;
 | |
| +	char *path;
 | |
|  {
 | |
|  	int ret, oerrno, newfd;
 | |
|  	struct stat sb;
 | |
| @@ -1080,7 +1081,7 @@
 | |
|  	newfd = fd;
 | |
|  	if (ISSET(FTS_NOCHDIR))
 | |
|  		return (0);
 | |
| -	if (fd < 0 && (newfd = _open(p->fts_accpath, O_RDONLY, 0)) < 0)
 | |
| +	if (fd < 0 && (newfd = _open(path, O_RDONLY, 0)) < 0)
 | |
|  		return (-1);
 | |
|  	if (fstat(newfd, &sb)) {
 | |
|  		ret = -1;
 |