static char * recursive_args(int argc, const char *argv[]) { if (argc == 0) { ForEachFile(str2Fname("."), register_file); } else { int i; for (i = 0; i < argc; i++) { const char *arg = argv[i]; const Fchar *Farg = str2Fname(arg); if (is_new_old_separator(arg)) { add_string_to_args(Farg); } else { ForEachFile(Farg, register_file); } } } add_char_to_args('\0'); return args; }
static void do_ForEachFile( const Fchar *fn, void (*proc)(const Fchar *, const char *, const struct stat *), int max_depth ) { Fchar fname[MAX_FILE_NAME_LENGTH]; Fchar separator; Fnamecpy(fname, (!fn || !*fn) ? str2Fname(".") : fn); separator = get_separator(fname); if (!separator) { (*proc)(fname, "both / and \\ used as separators", 0); return; } clean_name(fname, separator); do_FEF(fname, proc, -1, (struct ino_link *)0, separator, max_depth); }
static void do_FEF( Fchar *fn, void (*proc)(const Fchar *, const char *, const struct stat *), int dev, struct ino_link *inop, Fchar separator, int max_depth ) { struct stat fs; Dir_t *dir; if (proc == 0) return; /* just make sure */ if (LSTAT(fn, &fs) < 0) { (*proc)(fn, strerror(errno), &fs); return; } /* report on file fn */ (*proc)(fn, (char*)0, &fs); if (max_depth == 0) return; if ((fs.st_mode & S_IFMT) != S_IFDIR) return; #ifdef S_IFLNK /* don't follow links */ if ((fs.st_mode & S_IFMT) == S_IFLNK) return; #endif /* treat directory */ if (dev < 0) { /* no device known yet */ dev = fs.st_dev; } if (fs.st_dev != dev) { return; } dir = Opendir(fn); if (dir == 0) { (*proc)(fn, "directory not readable", &fs); } else { /* scan new directory */ int fnl = Fnamelen(fn); Dirent_t *dent; struct ino_link ino; /* worry about loops in the file system */ if (in_ino_list(inop, &fs)) { (*proc)(fn, "loop in file system", &fs); Closedir(dir); return; } link_ino_list(inop, &ino, &fs); /* shape up the directory name */ if (fn[fnl-1] != separator) { /* append separator */ fn[fnl++] = separator; fn[fnl] = '\0'; } /* descend */ while ((dent = Readdir(dir)) != (Dirent_t *)0) { if ( Fnamecmp(dent->d_name, str2Fname(".")) == 0 || Fnamecmp(dent->d_name, str2Fname("..")) == 0 ) continue; if (Fnamecmp(dent->d_name, str2Fname("")) == 0) { (*proc)(fn, "directory contains empty file name", &fs ); continue; } /* append name */ Fnamecat(fn, dent->d_name); do_FEF(fn, proc, dev, &ino, separator, max_depth-1); /* remove name again*/ fn[fnl] = '\0'; } Closedir(dir); } }