aboutsummaryrefslogtreecommitdiffstats
path: root/src/archive/iso9660_archive_plugin.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/archive/iso9660_archive_plugin.c (renamed from src/archive/iso_plugin.c)107
1 files changed, 66 insertions, 41 deletions
diff --git a/src/archive/iso_plugin.c b/src/archive/iso9660_archive_plugin.c
index 9063af0fc..780268df8 100644
--- a/src/archive/iso_plugin.c
+++ b/src/archive/iso9660_archive_plugin.c
@@ -21,6 +21,8 @@
* iso archive handling (requires cdio, and iso9660)
*/
+#include "config.h"
+#include "archive/iso9660_archive_plugin.h"
#include "archive_api.h"
#include "input_plugin.h"
@@ -32,21 +34,29 @@
#define CEILING(x, y) ((x+(y-1))/y)
-typedef struct {
+struct iso9660_archive_file {
+ struct archive_file base;
+
iso9660_t *iso;
iso9660_stat_t *statbuf;
size_t cur_ofs;
size_t max_blocks;
GSList *list;
GSList *iter;
-} iso_context;
+};
+
+static const struct input_plugin iso9660_input_plugin;
-static const struct input_plugin iso_inputplugin;
+static inline GQuark
+iso9660_quark(void)
+{
+ return g_quark_from_static_string("iso9660");
+}
/* archive open && listing routine */
static void
-listdir_recur(const char *psz_path, iso_context *context)
+listdir_recur(const char *psz_path, struct iso9660_archive_file *context)
{
iso9660_t *iso = context->iso;
CdioList_t *entlist;
@@ -80,36 +90,44 @@ listdir_recur(const char *psz_path, iso_context *context)
}
static struct archive_file *
-iso_open(char * pathname)
+iso9660_archive_open(const char *pathname, GError **error_r)
{
- iso_context *context = g_malloc(sizeof(iso_context));
+ struct iso9660_archive_file *context =
+ g_new(struct iso9660_archive_file, 1);
+
+ archive_file_init(&context->base, &iso9660_archive_plugin);
context->list = NULL;
/* open archive */
context->iso = iso9660_open (pathname);
if (context->iso == NULL) {
- g_warning("iso %s open failed\n", pathname);
+ g_set_error(error_r, iso9660_quark(), 0,
+ "Failed to open ISO9660 file %s", pathname);
return NULL;
}
listdir_recur("/", context);
- return (struct archive_file *)context;
+ return &context->base;
}
static void
-iso_scan_reset(struct archive_file *file)
+iso9660_archive_scan_reset(struct archive_file *file)
{
- iso_context *context = (iso_context *) file;
+ struct iso9660_archive_file *context =
+ (struct iso9660_archive_file *)file;
+
//reset iterator
context->iter = context->list;
}
static char *
-iso_scan_next(struct archive_file *file)
+iso9660_archive_scan_next(struct archive_file *file)
{
- iso_context *context = (iso_context *) file;
+ struct iso9660_archive_file *context =
+ (struct iso9660_archive_file *)file;
+
char *data = NULL;
if (context->iter != NULL) {
///fetch data and goto next
@@ -120,9 +138,11 @@ iso_scan_next(struct archive_file *file)
}
static void
-iso_close(struct archive_file *file)
+iso9660_archive_close(struct archive_file *file)
{
- iso_context *context = (iso_context *) file;
+ struct iso9660_archive_file *context =
+ (struct iso9660_archive_file *)file;
+
GSList *tmp;
if (context->list) {
//free list
@@ -139,12 +159,14 @@ iso_close(struct archive_file *file)
/* single archive handling */
static bool
-iso_open_stream(struct archive_file *file, struct input_stream *is,
- const char *pathname)
+iso9660_archive_open_stream(struct archive_file *file, struct input_stream *is,
+ const char *pathname, GError **error_r)
{
- iso_context *context = (iso_context *) file;
+ struct iso9660_archive_file *context =
+ (struct iso9660_archive_file *)file;
+
//setup file ops
- is->plugin = &iso_inputplugin;
+ is->plugin = &iso9660_input_plugin;
//insert back reference
is->data = context;
//we are not seekable
@@ -153,7 +175,8 @@ iso_open_stream(struct archive_file *file, struct input_stream *is,
context->statbuf = iso9660_ifs_stat_translate (context->iso, pathname);
if (context->statbuf == NULL) {
- g_warning("file %s not found in iso\n", pathname);
+ g_set_error(error_r, iso9660_quark(), 0,
+ "not found in the ISO file: %s", pathname);
return false;
}
context->cur_ofs = 0;
@@ -162,19 +185,19 @@ iso_open_stream(struct archive_file *file, struct input_stream *is,
}
static void
-iso_is_close(struct input_stream *is)
+iso9660_input_close(struct input_stream *is)
{
- iso_context *context = (iso_context *) is->data;
+ struct iso9660_archive_file *context = is->data;
g_free(context->statbuf);
- iso_close((struct archive_file *)context);
+ iso9660_archive_close((struct archive_file *)context);
}
static size_t
-iso_is_read(struct input_stream *is, void *ptr, size_t size)
+iso9660_input_read(struct input_stream *is, void *ptr, size_t size, GError **error_r)
{
- iso_context *context = (iso_context *) is->data;
+ struct iso9660_archive_file *context = (struct iso9660_archive_file *) is->data;
int toread, readed = 0;
int no_blocks, cur_block;
size_t left_bytes = context->statbuf->size - context->cur_ofs;
@@ -196,9 +219,10 @@ iso_is_read(struct input_stream *is, void *ptr, size_t size)
context->statbuf->lsn + cur_block, no_blocks);
if (readed != no_blocks * ISO_BLOCKSIZE) {
- g_warning("error reading ISO file at lsn %lu\n",
- (long unsigned int) cur_block );
- return -1;
+ g_set_error(error_r, iso9660_quark(), 0,
+ "error reading ISO file at lsn %lu",
+ (long unsigned int) cur_block);
+ return 0;
}
if (left_bytes < size) {
readed = left_bytes;
@@ -209,31 +233,32 @@ iso_is_read(struct input_stream *is, void *ptr, size_t size)
}
static bool
-iso_is_eof(struct input_stream *is)
+iso9660_input_eof(struct input_stream *is)
{
- iso_context *context = (iso_context *) is->data;
+ struct iso9660_archive_file *context = is->data;
+
return (context->cur_ofs == context->statbuf->size);
}
/* exported structures */
-static const char *const iso_extensions[] = {
+static const char *const iso9660_archive_extensions[] = {
"iso",
NULL
};
-static const struct input_plugin iso_inputplugin = {
- .close = iso_is_close,
- .read = iso_is_read,
- .eof = iso_is_eof,
+static const struct input_plugin iso9660_input_plugin = {
+ .close = iso9660_input_close,
+ .read = iso9660_input_read,
+ .eof = iso9660_input_eof,
};
-const struct archive_plugin iso_plugin = {
+const struct archive_plugin iso9660_archive_plugin = {
.name = "iso",
- .open = iso_open,
- .scan_reset = iso_scan_reset,
- .scan_next = iso_scan_next,
- .open_stream = iso_open_stream,
- .close = iso_close,
- .suffixes = iso_extensions
+ .open = iso9660_archive_open,
+ .scan_reset = iso9660_archive_scan_reset,
+ .scan_next = iso9660_archive_scan_next,
+ .open_stream = iso9660_archive_open_stream,
+ .close = iso9660_archive_close,
+ .suffixes = iso9660_archive_extensions
};