packio

annotate src/archive.c @ 1:a5728bc6a02f

moving along
author John Tsiombikas <nuclear@member.fsf.org>
date Fri, 09 Jan 2015 02:31:29 +0200
parents
children
rev   line source
nuclear@1 1 #include <stdio.h>
nuclear@1 2 #include <string.h>
nuclear@1 3 #include <errno.h>
nuclear@1 4 #include "archive.h"
nuclear@1 5 #include "logger.h"
nuclear@1 6
nuclear@1 7 static struct archive_module *modlist;
nuclear@1 8
nuclear@1 9 int pkio_reg_archive_module(struct archive_module *m)
nuclear@1 10 {
nuclear@1 11 m->next = modlist;
nuclear@1 12 modlist = m;
nuclear@1 13 return 0;
nuclear@1 14 }
nuclear@1 15
nuclear@1 16 struct archive *pkio_load_archive(const char *fname)
nuclear@1 17 {
nuclear@1 18 FILE *fp;
nuclear@1 19 struct archive *ar;
nuclear@1 20
nuclear@1 21 if(!modlist) {
nuclear@1 22 pkio_logmsg("failed to load archive, no archive modules found\n");
nuclear@1 23 return 0;
nuclear@1 24 }
nuclear@1 25
nuclear@1 26 if(!(fp = fopen(fname, "rb"))) {
nuclear@1 27 pkio_logmsg("failed to load archive: %s: %s\n", fname, strerror(errno));
nuclear@1 28 return 0;
nuclear@1 29 }
nuclear@1 30
nuclear@1 31 if(!(ar = pkio_load_archive_file(fp))) {
nuclear@1 32 pkio_logmsg("failed to load archive: %s\n", fname);
nuclear@1 33 fclose(fp);
nuclear@1 34 return 0;
nuclear@1 35 }
nuclear@1 36 return ar;
nuclear@1 37 }
nuclear@1 38
nuclear@1 39 struct archive *pkio_load_archive_file(FILE *fp)
nuclear@1 40 {
nuclear@1 41 struct archive *ar;
nuclear@1 42 struct archive_module *mod;
nuclear@1 43
nuclear@1 44 if(!modlist) {
nuclear@1 45 pkio_logmsg("failed to load archive, no archive modules found\n");
nuclear@1 46 return 0;
nuclear@1 47 }
nuclear@1 48
nuclear@1 49 /* try all the archive modules in turn */
nuclear@1 50 mod = modlist;
nuclear@1 51 while(mod) {
nuclear@1 52 if((ar = mod->load_archive(fp, mod->data))) {
nuclear@1 53 ar->module = mod;
nuclear@1 54 return ar;
nuclear@1 55 }
nuclear@1 56 mod = mod->next;
nuclear@1 57 }
nuclear@1 58
nuclear@1 59 return 0;
nuclear@1 60 }