static void do_copy_all(char *src, char *dst) { int err; DIR *dirp; char *c, *buf; diag_printf("Copy all files from %s to %s\n", src, dst); dirp = opendir(src); if(dirp == NULL) { diag_printf("Can't open directory \"%s\"\n", src); return; } for(;;) { struct dirent *entry = readdir( dirp ); char srcname[PATH_MAX]; char dstname[PATH_MAX]; if( entry == NULL ) break; strcpy(srcname, src); strcpy(dstname, dst); if( !(src[0] == '/' && src[1] == 0 ) ) strcat(srcname, "/" ); if( !(dst[0] == '/' && dst[1] == 0 ) ) strcat(dstname, "/" ); strcat(srcname, entry->d_name ); strcat(dstname, entry->d_name ); if ((c = rindex(srcname, '.')) != (char *)NULL) { if (strcmp(c, ".jpg") == 0) { diag_printf("Copy %s => %s\n", srcname, dstname); do_copy_file(srcname, dstname); } } } closedir(dirp); }
static gboolean copy_one(const char *filename, void *userdata) { copy_task_t *ct = (copy_task_t *)userdata; const char *fromfile; string_var tofile, mappedfile; // TODO: WTF /* construct the target filename */ if (ct->flatten_) fromfile = file_basename_c(filename); else fromfile = filename; if (ct->tofile_ != 0) tofile = ct->expand(ct->tofile_); else if (ct->exp_todir_ != 0) tofile = g_strconcat(ct->exp_todir_, "/", filename, 0); else { ct->result_ = FALSE; /* failed */ return FALSE; /* stop iteration */ } if ((mappedfile = ct->mapper_->map(tofile)) == 0) return TRUE; /* keep going */ log::infof("%s -> %s\n", filename, mappedfile.data()); /* TODO: apply proj->basedir */ if (file_is_directory(filename) == 0) { int r; unsigned ncopied = ct->ncopied_; r = file_apply_children(filename, copy_one, userdata); if (r < 0) { log::perror(filename); } else if (ncopied == ct->ncopied_ && ct->include_empty_dirs_) { /* no files copied underneath this directory -- it must be empty */ /* TODO: sensible mode from original directory */ /* TODO: control uid,gid */ if (file_build_tree(mappedfile, 0755)) { log::perror(filename); ct->result_ = FALSE; } } } else { if (!do_copy_file(filename, mappedfile)) ct->result_ = FALSE; } return ct->result_; /* keep going if we didn't fail */ }