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); } }
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; } }
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); } } }
void acl_scan_dir_close(ACL_SCAN_DIR *scan) { while (scan->current) acl_scan_dir_pop(scan); acl_myfree(scan); }