Exemple #1
0
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);
}
Exemple #2
0
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;
}