コード例 #1
0
ファイル: acl_scan_dir.c プロジェクト: kagajubo/acl
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_scan_dir.c プロジェクト: kagajubo/acl
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);
}
コード例 #3
0
ファイル: acl_scan_dir.c プロジェクト: LazyPlanet/acl
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;
}
コード例 #4
0
ファイル: acl_scan_dir.c プロジェクト: LazyPlanet/acl
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;
	}
}
コード例 #5
0
ファイル: acl_scan_dir.c プロジェクト: LazyPlanet/acl
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;
}
コード例 #6
0
ファイル: acl_scan_dir.c プロジェクト: kagajubo/acl
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);
		}
	}
}
コード例 #7
0
ファイル: acl_scan_dir.c プロジェクト: LazyPlanet/acl
const char *acl_scan_dir_path(ACL_SCAN_DIR *scan)
{
	if (scan->current == NULL)
		return NULL;
	return ACL_SCAN_DIR_PATH(scan);
}
コード例 #8
0
ファイル: acl_scan_dir.c プロジェクト: kagajubo/acl
const char *acl_scan_dir_path(ACL_SCAN_DIR *scan)
{
	if (scan == NULL || scan->current == NULL)
		return (NULL);
	return (ACL_SCAN_DIR_PATH(scan));
}