9 noDots(const struct dirent * e)
11 if ( e->d_name[0] == '.'
12 && (e->d_name[1] == '\0'
13 || (e->d_name[1] == '.' && e->d_name[2] == '\0')) )
21 struct FileInfo *oldInfo
22 ,int (*function)(const struct FileInfo * i))
25 struct dirent * * names;
32 if ( *oldInfo->source == '\0' ) {
37 if ( oldInfo->stat.st_dev == 0
38 && oldInfo->stat.st_ino == 0
39 && oldInfo->stat.st_mode == 0 ) {
40 if ( lstat(oldInfo->source, &oldInfo->stat) != 0 )
42 oldInfo->isSymbolicLink = ((oldInfo->stat.st_mode & S_IFMT) == S_IFLNK);
44 if ( oldInfo->isSymbolicLink )
45 if ( stat(oldInfo->source, &oldInfo->stat) != 0 )
46 memset((void *)&oldInfo->stat, 0, sizeof(oldInfo->stat));
49 if ( !oldInfo->processDirectoriesAfterTheirContents ) {
51 status = (*function)(oldInfo);
53 status = post_process(oldInfo);
56 if ( (count = scandir(oldInfo->source, &names, noDots, alphasort)) < 0 )
59 length = strlen(oldInfo->source);
60 if ( oldInfo->source[length-1] == '/' )
63 memcpy(pathname, oldInfo->source, length+1);
64 pathname[length] = '/';
65 filename = &pathname[length+1];
68 while ( count-- > 0 ) {
69 struct FileInfo i = *oldInfo;
71 strcpy(filename, (*n)->d_name);
74 if ( lstat(pathname, &i.stat) != 0 && errno != ENOENT ) {
75 fprintf(stderr, "Can't stat %s: %s\n", pathname, strerror(errno));
78 i.isSymbolicLink = ((i.stat.st_mode & S_IFMT) == S_IFLNK);
80 if ( i.isSymbolicLink )
81 if ( stat(pathname, &i.stat) != 0 )
82 memset((void *)&i.stat, 0, sizeof(i.stat));
89 i.destination = join_paths(d, i.destination, &i.source[i.directoryLength]);
92 i.destination = i.source;
94 if ( !i.isSymbolicLink && (i.stat.st_mode & S_IFMT) == S_IFDIR )
95 status = descend(&i, function);
98 status = (*function)(&i);
100 status = post_process(&i);
103 if ( !i.processDirectoriesAfterTheirContents
105 && (i.stat.st_mode & S_IFMT) == S_IFDIR )
106 descend(&i, function);
108 if ( status != 0 && !i.force ) {
109 while ( count-- > 0 )
116 if ( oldInfo->processDirectoriesAfterTheirContents ) {
118 status = (*function)(oldInfo);
120 status = post_process(oldInfo);