Пример #1
0
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);
	}
}
Пример #2
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;
}
Пример #3
0
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;
	}
}
Пример #4
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);
		}
	}
}
Пример #5
0
void acl_scan_dir_close(ACL_SCAN_DIR *scan)
{
	while (scan->current)
		acl_scan_dir_pop(scan);
	acl_myfree(scan);
}