void file_dfs(char *arg, t_vector *stack, t_vector *dirs, char *name) { struct stat dd; struct dirent *dp; char *path_name; char *dirname; DIR *dir; dirname = (vector_size(dirs) ? dir_from_vector(dirs) : my_strdup("./")); if ((dir = opendir(dirname))) { while ((dp = readdir(dir)) != NULL) { path_name = complete_path(dirname, dp->d_name); if (lstat(path_name, &dd) == -1) my_fprintf(2, "globbing: can't stat %s\n", path_name); if ((name[0] != '.') && (dp->d_name[0] == '.')); else if ((S_ISDIR(dd.st_mode) || (!my_strstr(arg, "/"))) && (match(dp->d_name, name))) matching_file(arg, stack, dirs, dp); xsfree(path_name); } closedir(dir); } xsfree(dirname); }
int rotate_log(struct rotator *rr,char *filename) { char *dir,*base,*oldname,*newname; DIR *dirh; struct dirent des,*de; struct array *names; struct assoc *changes,*orders; int order,i,n; dirbasename(filename,&dir,&base); log_debug(("Rotating in '%s'",dir)); dirh = opendir(dir); if(!dirh) { log_error(("Could not rotate log file")); return 1; } names = array_create(type_free,0); changes = assoc_create(0,0,type_free,0); orders = assoc_create(0,0,type_free,0); while(1) { if(readdir_r(dirh,&des,&de)) { log_error(("Problem reading directory during log rotation")); break; } if(!de) { break; } order = matching_file(rr,filename,de->d_name,&newname); if(order == MATCH_IGNORE) { continue; } if(order == MATCH_DELETE) { log_debug(("delete %s",de->d_name)); unlink(de->d_name); } else { oldname = strdup(de->d_name); array_insert(names,oldname); assoc_set(changes,oldname,newname); assoc_set(orders,oldname,make_int(order)); } } if(closedir(dirh)) { log_error(("Could not closedir during log rotation!")); /* But continue: what else to do? */ } array_sort(names,sort_names,orders); n = array_length(names); for(i=0;i<n;i++) { oldname = array_index(names,i); newname = assoc_lookup(changes,oldname); log_warn(("name=%s -> %s",oldname,newname)); rename_file(rr,dir,oldname,newname); } assoc_release(changes); assoc_release(orders); array_release(names); free(dir); free(base); return 0; }