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 } |