int unix_dir_loop(Stream_t *Stream, MainParam_t *mp) { DeclareThis(Dir_t); struct dirent *entry; char *newName; int ret=0; #ifdef FCHDIR_MODE int fd; fd = open(".", O_RDONLY); if(chdir(This->pathname) < 0) { fprintf(stderr, "Could not chdir into %s (%s)\n", This->pathname, strerror(errno)); return -1; } #endif while((entry=readdir(This->dir)) != NULL) { if(got_signal) break; if(isSpecial(entry->d_name)) continue; #ifndef FCHDIR_MODE newName = malloc(strlen(This->pathname) + 1 + strlen(entry->d_name) + 1); if(!newName) { ret = ERROR_ONE; break; } strcpy(newName, This->pathname); strcat(newName, "/"); strcat(newName, entry->d_name); #else newName = entry->d_name; #endif ret |= unix_loop(Stream, mp, newName, 0); #ifndef FCHDIR_MODE free(newName); #endif } #ifdef FCHDIR_MODE if(fchdir(fd) < 0) perror("Could not chdir back to .."); close(fd); #endif return ret; }
int main_loop(MainParam_t *mp, char **argv, int argc) { int i; int ret, Bret; Bret = 0; if(argc != 1 && mp->targetName) { fprintf(stderr, "Several file names given, but last argument (%s) not a directory\n", mp->targetName); } for (i = 0; i < argc; i++) { if ( got_signal ) break; mp->originalArg = argv[i]; mp->basenameHasWildcard = strpbrk(_basename(mp->originalArg), "*[?") != 0; if (mp->unixcallback && skip_drive(argv[i]) == argv[i]) ret = unix_loop(0, mp, argv[i], 1); else ret = dos_loop(mp, argv[i]); if (! (ret & (GOT_ONE | ERROR_ONE)) ) { /* one argument was unmatched */ fprintf(stderr, "%s: File \"%s\" not found\n", progname, argv[i]); ret |= ERROR_ONE; } Bret |= ret; if(mp->fast_quit && (Bret & (MISSED_ONE | ERROR_ONE))) break; } FREE(&mp->targetDir); if(Bret & ERROR_ONE) return 1; if ((Bret & GOT_ONE) && ( Bret & MISSED_ONE)) return 2; if (Bret & MISSED_ONE) return 1; return 0; }