Blob Blame History Raw
/**************************************************************/
/*  tpax: a topological pax implementation                    */
/*  Copyright (C) 2020--2024  SysDeer Technologies, LLC       */
/*  Released under GPLv2 and GPLv3; see COPYING.TPAX.         */
/**************************************************************/

#include <stdint.h>
#include <stdlib.h>
#include <sys/mman.h>

#include <tpax/tpax.h>
#include "tpax_driver_impl.h"

/**********************************************/
/* release and reset the following objects:   */
/*                                            */
/* - item queue                               */
/* - queue vector                             */
/* - cached prefixes                          */
/* - prefix vector                            */
/*                                            */
/**********************************************/

int tpax_archive_reset(const struct tpax_driver_ctx * dctx)
{
	struct tpax_driver_ctx_impl *   ictx;
	void *                          next;
	size_t                          size;
	char **                         ppref;

	ictx = tpax_get_driver_ictx(dctx);

	for (; ictx->dirents; ) {
		next = ictx->dirents->next;
		size = ictx->dirents->size;

		munmap(ictx->dirents,size);
		ictx->dirents = (struct tpax_dirent_buffer *)next;
	}

	for (ppref=ictx->prefixv; *ppref; ppref++)
		free(*ppref);

	for (ppref=ictx->prefptr; ppref<ictx->prefcap; ppref++)
		*ppref = 0;

	if (ictx->prefixv != ictx->prefptr)
		free(ictx->prefixv);

	if (ictx->direntv)
		free(ictx->direntv);

	ictx->nqueued = 0;
	ictx->dirents = 0;
	ictx->direntv = 0;
	ictx->prefixv = ictx->prefptr;

	return 0;
}