make sure we don't include . in recursive listings

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@10699 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Johan Danielsson
2001-09-14 11:32:52 +00:00
parent 8d6f10f7cb
commit a53e6efc5f

View File

@@ -118,6 +118,7 @@ free_fileinfo(struct fileinfo *f)
#define LS_RECURSIVE (1 << 11) #define LS_RECURSIVE (1 << 11)
#define LS_EXTRA_BLANK (1 << 12) #define LS_EXTRA_BLANK (1 << 12)
#define LS_SHOW_DIRNAME (1 << 13) #define LS_SHOW_DIRNAME (1 << 13)
#define LS_DIR_FLAG (1 << 14) /* these files come via list_dir */
#ifndef S_ISTXT #ifndef S_ISTXT
#define S_ISTXT S_ISVTX #define S_ISTXT S_ISVTX
@@ -460,6 +461,9 @@ lstat_file (const char *file, struct stat *sb)
return lstat (file, sb); return lstat (file, sb);
} }
#define IS_DOT_DOTDOT(X) ((X)[0] == '.' && ((X)[1] == '\0' || \
((X)[1] == '.' && (X)[2] == '\0')))
static void static void
list_files(FILE *out, const char **files, int n_files, int flags) list_files(FILE *out, const char **files, int n_files, int flags)
{ {
@@ -658,8 +662,14 @@ list_files(FILE *out, const char **files, int n_files, int flags)
} }
next: next:
if(((flags & LS_DIRS) == 0 || (flags & LS_RECURSIVE)) && dirs != NULL) { if(((flags & LS_DIRS) == 0 || (flags & LS_RECURSIVE)) && dirs != NULL) {
for(i = 0; i < n_files; i++) for(i = 0; i < n_files; i++) {
if(dirs[i]) { if(dirs[i]) {
const char *p = strrchr(files[i], '/');
if(p == NULL)
p = files[i];
else
p++;
if(!(flags & LS_DIR_FLAG) || !IS_DOT_DOTDOT(p)) {
if((flags & LS_SHOW_DIRNAME)) { if((flags & LS_SHOW_DIRNAME)) {
if ((flags & LS_EXTRA_BLANK)) if ((flags & LS_EXTRA_BLANK))
sec_fprintf2(out, "\r\n"); sec_fprintf2(out, "\r\n");
@@ -668,6 +678,8 @@ list_files(FILE *out, const char **files, int n_files, int flags)
list_dir(out, files[i], flags | LS_DIRS | LS_EXTRA_BLANK); list_dir(out, files[i], flags | LS_DIRS | LS_EXTRA_BLANK);
} }
} }
}
}
out: out:
for(i = 0; i < n_files; i++) for(i = 0; i < n_files; i++)
free_fileinfo(&fi[i]); free_fileinfo(&fi[i]);
@@ -737,7 +749,7 @@ list_dir(FILE *out, const char *directory, int flags)
++n_files; ++n_files;
} }
closedir(d); closedir(d);
list_files(out, (const char**)files, n_files, flags); list_files(out, (const char**)files, n_files, flags | LS_DIR_FLAG);
} }
static int static int
@@ -781,8 +793,11 @@ parse_flags(const char *options)
case 'l': case 'l':
flags = (flags & ~LS_DISP_MODE) | LS_DISP_LONG; flags = (flags & ~LS_DISP_MODE) | LS_DISP_LONG;
break; break;
case 't': case 'r':
flags = (flags & ~LS_SORT_MODE) | LS_SORT_MTIME; flags |= LS_SORT_REVERSE;
break;
case 'R':
flags |= LS_RECURSIVE;
break; break;
case 's': case 's':
flags |= LS_SIZE; flags |= LS_SIZE;
@@ -790,15 +805,24 @@ parse_flags(const char *options)
case 'S': case 'S':
flags = (flags & ~LS_SORT_MODE) | LS_SORT_SIZE; flags = (flags & ~LS_SORT_MODE) | LS_SORT_SIZE;
break; break;
case 'r': case 't':
flags |= LS_SORT_REVERSE; flags = (flags & ~LS_SORT_MODE) | LS_SORT_MTIME;
break;
case 'R':
flags |= LS_RECURSIVE;
break; break;
case 'x': case 'x':
flags = (flags & ~LS_DISP_MODE) | LS_DISP_CROSS; flags = (flags & ~LS_DISP_MODE) | LS_DISP_CROSS;
break; break;
/* these are a bunch of unimplemented flags from BSD ls */
case 'k': /* display sizes in kB */
case 'c': /* last change time */
case 'L': /* list symlink target */
case 'm': /* stream output */
case 'o': /* BSD file flags */
case 'p': /* display / after directories */
case 'q': /* print non-graphic characters */
case 'u': /* use last access time */
case 'T': /* display complete time */
case 'W': /* include whiteouts */
break;
} }
} }
return flags; return flags;