diff options
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 }; |