void acl_scan_dir_rm2(ACL_SCAN_DIR *scan) { const char *myname = "acl_scan_dir_rm2"; const char *name; char path[256]; struct acl_stat sbuf; for (;;) { if ((name = acl_scan_dir_next(scan)) == NULL) { if (scan->current != NULL) snprintf(path, sizeof(path), "%s", ACL_SCAN_DIR_PATH(scan)); else path[0] = 0; /* ±ØÐëÍ˳ö¸Ã¿ÕĿ¼ºó²Å¿ÉÒÔɾ³ý¸ÃĿ¼ */ if (acl_scan_dir_pop(scan) == 0) { /* ɾ³ý×²ã¿ÕĿ¼ */ if (path[0] != 0 && SANE_RMDIR(path) == 0) scan->ndirs++; break; } /* ɾ³ý¿ÕĿ¼ */ if (path[0] != 0 && SANE_RMDIR(path) == 0) scan->ndirs++; continue; } snprintf(path, sizeof(path), "%s/%s", ACL_SCAN_DIR_PATH(scan), name); if (acl_stat(path, &sbuf) < 0) { char tbuf[256]; acl_msg_error("%s(%d), %s: stat file(%s) error(%s)", __FILE__, __LINE__, myname, path, acl_last_strerror(tbuf, sizeof(tbuf))); break; } if (S_ISDIR(sbuf.st_mode)) { scan->file_name[0] = 0; if (scan->recursive && acl_scan_dir_push(scan, name) < 0) break; if (scan->scan_fn && scan->scan_fn(scan, scan->scan_ctx) < 0) break; continue; } else ACL_SAFE_STRNCPY(scan->file_name, name, sizeof(scan->file_name)); if (scan->scan_fn && scan->scan_fn(scan, scan->scan_ctx) < 0) break; scan->nfiles++; scan->nsize += sbuf.st_size; SANE_UNLINK(path); } }
int acl_scan_dir_push(ACL_SCAN_DIR *scan, const char *path) { const char *myname = "acl_scan_dir_push"; ACL_SCAN_INFO *info; info = (ACL_SCAN_INFO *) acl_mymalloc(sizeof(*info)); if (scan->current) { info->path = acl_concatenate(ACL_SCAN_DIR_PATH(scan), "/", path, (char *) 0); } else { info->path = acl_mystrdup(path); } if ((info->dir_name = opendir(info->path)) == 0) { char tbuf[256]; acl_msg_error("%s(%d), %s: open directory(%s) error(%s)", __FILE__, __LINE__, myname, info->path, acl_last_strerror(tbuf, sizeof(tbuf))); return (-1); } if (acl_msg_verbose > 1) acl_msg_info("%s: open %s", myname, info->path); info->parent = scan->current; scan->current = info; return (0); }
acl_int64 acl_scan_dir_size2(ACL_SCAN_DIR *scan, int *nfile, int *ndir) { const char *myname = "acl_scan_dir_size2"; const char *name; char pathbuf[MAX_PATH]; struct acl_stat sbuf; while (1) { if ((name = acl_scan_dir_next(scan)) == NULL) { if (acl_scan_dir_pop(scan) == NULL) break; continue; } snprintf(pathbuf, sizeof(pathbuf), "%s%c%s", ACL_SCAN_DIR_PATH(scan), PATH_SEP_C, name); if (acl_stat(pathbuf, &sbuf) < 0) { acl_msg_error("%s(%d), %s: stat file(%s) error(%s)", __FILE__, __LINE__, myname, pathbuf, acl_last_serror()); break; } memcpy(&scan->current->sbuf, &sbuf, sizeof(sbuf)); if (S_ISDIR(sbuf.st_mode)) { scan->ndirs++; scan->file_name[0] = 0; if (scan->recursive && acl_scan_dir_push(scan, name) < 0) break; } else { ACL_SAFE_STRNCPY(scan->file_name, name, sizeof(scan->file_name)); scan->nfiles++; scan->nsize += sbuf.st_size; } if (scan->scan_fn && scan->scan_fn(scan, scan->scan_ctx) < 0) break; } if (nfile) *nfile = scan->nfiles; if (ndir) *ndir = scan->ndirs; return scan->nsize; }
const char *acl_scan_dir_next_name(ACL_SCAN_DIR *scan, int *is_file) { const char *myname = "acl_scan_dir_next_name"; const char *name; char pathbuf[MAX_PATH]; struct acl_stat sbuf; for (;;) { if ((name = acl_scan_dir_next(scan)) == NULL) { if (acl_scan_dir_pop(scan) == 0) return NULL; continue; } snprintf(pathbuf, sizeof(pathbuf), "%s%c%s", ACL_SCAN_DIR_PATH(scan), PATH_SEP_C, name); if (acl_stat(pathbuf, &sbuf) < 0) { acl_msg_error("%s(%d), %s: stat file(%s) error(%s)", __FILE__, __LINE__, myname, pathbuf, acl_last_serror()); return NULL; } memcpy(&scan->current->sbuf, &sbuf, sizeof(sbuf)); scan->nsize += sbuf.st_size; if (!S_ISDIR(sbuf.st_mode)) { if (is_file) *is_file = 1; return name; } scan->ndirs++; if (scan->recursive && acl_scan_dir_push(scan, name) < 0) return NULL; if (is_file) *is_file = 0; return name; } }
int acl_scan_dir_push(ACL_SCAN_DIR *scan, const char *path) { const char *myname = "acl_scan_dir_push"; ACL_SCAN_INFO *info; if (path == NULL || *path == 0) acl_msg_fatal("%s(%d), %s: path null", __FILE__, __LINE__, myname); info = (ACL_SCAN_INFO *) acl_mymalloc(sizeof(*info)); if (scan->current) info->path = acl_concatenate(ACL_SCAN_DIR_PATH(scan), PATH_SEP_S, path, (char *) 0); else { size_t len = strlen(path); const char *ptr = path + len - 1; #ifdef ACL_WINDOWS while (ptr > path && (*ptr == '/' || *ptr == '\\')) #else while (ptr > path && *ptr == '/') #endif ptr--; len = ptr - path + 1; info->path = (char*) acl_mymalloc(len + 1); memcpy(info->path, path, len); info->path[len] = 0; } if ((info->dir_name = opendir(info->path)) == 0) { acl_msg_error("%s(%d), %s: open directory(%s) error(%s)", __FILE__, __LINE__, myname, info->path, acl_last_serror()); return -1; } info->parent = scan->current; scan->current = info; return 0; }
const char *acl_scan_dir_next_file(ACL_SCAN_DIR *scan) { const char *myname = "acl_scan_dir_next_file"; const char *name; char pathbuf[256]; struct acl_stat sbuf; for (;;) { if ((name = acl_scan_dir_next(scan)) == NULL) { if (acl_scan_dir_pop(scan) == 0) return (NULL); continue; } snprintf(pathbuf, sizeof(pathbuf), "%s/%s", ACL_SCAN_DIR_PATH(scan), name); if (acl_stat(pathbuf, &sbuf) < 0) { char tbuf[256]; acl_msg_error("%s(%d), %s: stat file(%s) error(%s)", __FILE__, __LINE__, myname, pathbuf, acl_last_strerror(tbuf, sizeof(tbuf))); return (NULL); } memcpy(&scan->current->sbuf, &sbuf, sizeof(sbuf)); scan->nsize += sbuf.st_size; if (S_ISDIR(sbuf.st_mode)) { scan->ndirs++; if (scan->recursive && acl_scan_dir_push(scan, name) < 0) return (NULL); } else { scan->nfiles++; return (name); } } }
const char *acl_scan_dir_path(ACL_SCAN_DIR *scan) { if (scan->current == NULL) return NULL; return ACL_SCAN_DIR_PATH(scan); }
const char *acl_scan_dir_path(ACL_SCAN_DIR *scan) { if (scan == NULL || scan->current == NULL) return (NULL); return (ACL_SCAN_DIR_PATH(scan)); }