aboutsummaryrefslogtreecommitdiffstats
path: root/src/archive/zzip_archive_plugin.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/archive/zzip_archive_plugin.c')
-rw-r--r--src/archive/zzip_archive_plugin.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/src/archive/zzip_archive_plugin.c b/src/archive/zzip_archive_plugin.c
index fb7af74ed..755baff74 100644
--- a/src/archive/zzip_archive_plugin.c
+++ b/src/archive/zzip_archive_plugin.c
@@ -26,6 +26,7 @@
#include "archive_api.h"
#include "archive_api.h"
#include "input_plugin.h"
+#include "refcount.h"
#include <zzip/zzip.h>
#include <glib.h>
@@ -34,6 +35,8 @@
struct zzip_archive {
struct archive_file base;
+ struct refcount ref;
+
ZZIP_DIR *dir;
GSList *list;
GSList *iter;
@@ -56,6 +59,7 @@ zzip_archive_open(const char *pathname, GError **error_r)
ZZIP_DIRENT dirent;
archive_file_init(&context->base, &zzip_archive_plugin);
+ refcount_init(&context->ref);
// open archive
context->list = NULL;
@@ -102,6 +106,10 @@ static void
zzip_archive_close(struct archive_file *file)
{
struct zzip_archive *context = (struct zzip_archive *) file;
+
+ if (!refcount_dec(&context->ref))
+ return;
+
if (context->list) {
//free list
for (GSList *tmp = context->list; tmp != NULL; tmp = g_slist_next(tmp))
@@ -151,6 +159,9 @@ zzip_archive_open_stream(struct archive_file *file, struct input_stream *is,
zzip_file_stat(zis->file, &z_stat);
is->size = z_stat.st_size;
+
+ refcount_inc(&context->ref);
+
return true;
}