示例#1
0
int drive_file_free(DRIVE_FILE* file, BOOL recursive)
{
	int retval;

	retval = 0;

	if (file->fd != -1)
		close(file->fd);

	if (file->dir != NULL)
		closedir(file->dir);

	if (file->delete_pending)
	{
		if (file->is_dir)
		{
			if (recursive)
			{
				if (!drive_file_remove_dir(file->fullpath))
				{
					retval = EPERM;
				}
			}
			else
			{
				if (rmdir(file->fullpath) != 0)
				{
					retval = errno;
				}
			}
		}
		else
		{
			if (unlink(file->fullpath) != 0)
			{
				retval = errno;
			}
		}
	}

	free(file->pattern);
	free(file->fullpath);
	free(file);

	return retval;
}
示例#2
0
void drive_file_free(DRIVE_FILE* file)
{
	if (file->fd != -1)
		close(file->fd);

	if (file->dir != NULL)
		closedir(file->dir);

	if (file->delete_pending)
	{
		if (file->is_dir)
			drive_file_remove_dir(file->fullpath);
		else
			unlink(file->fullpath);
	}

	free(file->pattern);
	free(file->fullpath);
	free(file);
}
示例#3
0
static BOOL drive_file_remove_dir(const char* path)
{
	DIR* dir;
	char* p;
	struct STAT st;
	struct dirent* pdirent;
	BOOL ret = TRUE;

	dir = opendir(path);

	if (dir == NULL)
		return FALSE;

	pdirent = readdir(dir);

	while (pdirent)
	{
		if (strcmp(pdirent->d_name, ".") == 0 || strcmp(pdirent->d_name, "..") == 0)
		{
			pdirent = readdir(dir);
			continue;
		}

		p = (char*) malloc(strlen(path) + strlen(pdirent->d_name) + 2);
		sprintf(p, "%s/%s", path, pdirent->d_name);

		if (STAT(p, &st) != 0)
		{
			DEBUG_WARN("stat %s failed.", p);
			ret = FALSE;
		}
		else if (S_ISDIR(st.st_mode))
		{
			ret = drive_file_remove_dir(p);
		}
		else if (unlink(p) < 0)
		{
			DEBUG_WARN("unlink %s failed.", p);
			ret = FALSE;
		}
		else
		{
			ret = TRUE;
		}
		
		free(p);

		if (!ret)
			break;

		pdirent = readdir(dir);
	}

	closedir(dir);

	if (ret)
	{
		if (rmdir(path) < 0)
		{
			DEBUG_WARN("rmdir %s failed.", path);
			ret = FALSE;
		}
	}

	return ret;
}