summaryrefslogtreecommitdiff
path: root/navit/maptool
diff options
context:
space:
mode:
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>2011-02-12 18:17:14 +0000
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>2011-02-12 18:17:14 +0000
commite7071c026716872236784b06ec1d4058dec67956 (patch)
treecc51f1e41f1217ec2a76ec357ee26458d3657330 /navit/maptool
parent8bf234d5eec3f7ae7ceecde6bcb46a24ce69f77d (diff)
downloadnavit-e7071c026716872236784b06ec1d4058dec67956.tar.gz
Add:maptool:Optionally create md5 sum of resulting map
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@4149 ffa7fe5e-494d-0410-b361-a75ebd5db220
Diffstat (limited to 'navit/maptool')
-rw-r--r--navit/maptool/ch.c6
-rw-r--r--navit/maptool/maptool.c82
-rw-r--r--navit/maptool/maptool.h35
-rw-r--r--navit/maptool/misc.c20
-rw-r--r--navit/maptool/osm.c2
-rw-r--r--navit/maptool/tile.c16
-rw-r--r--navit/maptool/zip.c175
7 files changed, 248 insertions, 88 deletions
diff --git a/navit/maptool/ch.c b/navit/maptool/ch.c
index 42a001032..8696cc2cd 100644
--- a/navit/maptool/ch.c
+++ b/navit/maptool/ch.c
@@ -468,7 +468,7 @@ ch_assemble_map(char *map_suffix, char *suffix, struct zip_info *zip_info)
int nodeid=0;
info.write=1;
- info.maxlen=zip_info->maxnamelen;
+ info.maxlen=zip_get_maxnamelen(zip_info);
info.suffix=suffix;
info.tiles_list=NULL;
info.tilesdir_out=NULL;
@@ -521,9 +521,9 @@ ch_assemble_map(char *map_suffix, char *suffix, struct zip_info *zip_info)
fprintf(stderr,"Size error '%s': %d vs %d\n", th->name, th->total_size, th->total_size_used);
exit(1);
}
- write_zipmember(zip_info, th->name, zip_info->maxnamelen, th->zip_data, th->total_size);
+ write_zipmember(zip_info, th->name, zip_get_maxnamelen(zip_info), th->zip_data, th->total_size);
} else {
- fwrite(th->zip_data, th->total_size, 1, zip_info->index);
+ fwrite(th->zip_data, th->total_size, 1, zip_get_index(zip_info));
}
g_free(th->zip_data);
th=th->next;
diff --git a/navit/maptool/maptool.c b/navit/maptool/maptool.c
index 7e0a06eb3..1a3e9c7e5 100644
--- a/navit/maptool/maptool.c
+++ b/navit/maptool/maptool.c
@@ -110,6 +110,7 @@ usage(FILE *f)
fprintf(f,"bzcat planet.osm.bz2 | maptool mymap.bin\n");
fprintf(f,"Available switches:\n");
fprintf(f,"-h (--help) : this screen\n");
+ fprintf(f,"-5 (--md5) : set file where to write md5 sum\n");
fprintf(f,"-6 (--64bit) : set zip 64 bit compression\n");
fprintf(f,"-a (--attr-debug-level) : control which data is included in the debug attribute\n");
fprintf(f,"-c (--dump-coordinates) : dump coordinates after phase 1\n");
@@ -155,7 +156,7 @@ int main(int argc, char **argv)
int protobuf=0;
int f,pos;
char *result,*optarg_cp,*attr_name,*attr_value;
- char *protobufdb=NULL,*protobufdb_operation=NULL;
+ char *protobufdb=NULL,*protobufdb_operation=NULL,*md5file=NULL;
#ifdef HAVE_POSTGRESQL
char *dbstr=NULL;
#endif
@@ -178,7 +179,7 @@ int main(int argc, char **argv)
int suffix_count=sizeof(suffixes)/sizeof(char *);
int i;
main_init(argv[0]);
- struct zip_info zip_info;
+ struct zip_info *zip_info=NULL;
int suffix_start=0;
char *timestamp=current_to_iso8601();
#ifndef HAVE_GLIB
@@ -191,6 +192,7 @@ int main(int argc, char **argv)
#endif
int option_index = 0;
static struct option long_options[] = {
+ {"md5", 1, 0, '5'},
{"64bit", 0, 0, '6'},
{"attr-debug-level", 1, 0, 'a'},
{"binfile", 0, 0, 'b'},
@@ -216,7 +218,7 @@ int main(int argc, char **argv)
{"slice-size", 1, 0, 'S'},
{0, 0, 0, 0}
};
- c = getopt_long (argc, argv, "6B:DNO:PWS:a:bc"
+ c = getopt_long (argc, argv, "5:6B:DNO:PWS:a:bc"
#ifdef HAVE_POSTGRESQL
"d:"
#endif
@@ -224,6 +226,9 @@ int main(int argc, char **argv)
if (c == -1)
break;
switch (c) {
+ case '5':
+ md5file=optarg;
+ break;
case '6':
zip64=1;
break;
@@ -534,19 +539,15 @@ int main(int argc, char **argv)
if (start <= 4) {
phase=3;
if (i == suffix_start) {
- int year,month,day,hour,min,sec;
- memset(&zip_info, 0, sizeof(zip_info));
- zip_info.zip64=zip64;
- if (sscanf(timestamp,"%d-%d-%dT%d:%d:%d",&year,&month,&day,&hour,&min,&sec) == 6) {
- zip_info.date=day | (month << 5) | ((year-1980) << 9);
- zip_info.time=(sec >> 1) | (min << 5) | (hour << 11);
- }
+ zip_info=zip_new();
+ zip_set_zip64(zip_info, zip64);
+ zip_set_timestamp(zip_info, timestamp);
}
- zipnum=zip_info.zipnum;
+ zipnum=zip_get_zipnum(zip_info);
fprintf(stderr,"PROGRESS: Phase 4: generating tiles %s\n",suffix);
tilesdir=tempfile(suffix,"tilesdir",1);
if (!strcmp(suffix,"r")) {
- ch_generate_tiles(suffixes[0],suffix,tilesdir,&zip_info);
+ ch_generate_tiles(suffixes[0],suffix,tilesdir,zip_info);
} else {
for (f = 0 ; f < 3 ; f++)
files[f]=NULL;
@@ -556,33 +557,37 @@ int main(int argc, char **argv)
files[1]=tempfile(suffix,"ways_split",0);
if (process_nodes)
files[2]=tempfile(suffix,"nodes",0);
- phase4(files,3,0,suffix,tilesdir,&zip_info);
+ phase4(files,3,0,suffix,tilesdir,zip_info);
for (f = 0 ; f < 3 ; f++) {
if (files[f])
fclose(files[f]);
}
}
fclose(tilesdir);
- zip_info.zipnum=zipnum;
+ zip_set_zipnum(zip_info,zipnum);
}
if (end == 4)
exit(0);
+ if (zip_info) {
+ zip_destroy(zip_info);
+ zip_info=NULL;
+ }
if (start <= 5) {
phase=4;
fprintf(stderr,"PROGRESS: Phase 5: assembling map %s\n",suffix);
if (i == suffix_start) {
- zip_info.dir_size=0;
- zip_info.offset=0;
- zip_info.maxnamelen=14+strlen(suffixes[0]);
- zip_info.compression_level=compression_level;
- zip_info.zipnum=0;
- zip_info.dir=tempfile("zipdir","",1);
- zip_info.index=tempfile("index","",1);
- zip_info.res=fopen(result,"wb+");
- index_init(&zip_info, 1);
+ char *zipdir=tempfile_name("zipdir","");
+ char *zipindex=tempfile_name("index","");
+ zip_info=zip_new();
+ zip_set_maxnamelen(zip_info, 14+strlen(suffixes[0]));
+ zip_set_compression_level(zip_info, compression_level);
+ if (md5file)
+ zip_set_md5(zip_info, 1);
+ zip_open(zip_info, result, zipdir, zipindex);
+ index_init(zip_info, 1);
}
if (!strcmp(suffix,"r")) {
- ch_assemble_map(suffixes[0],suffix,&zip_info);
+ ch_assemble_map(suffixes[0],suffix,zip_info);
} else {
for (f = 0 ; f < 3 ; f++) {
files[f]=NULL;
@@ -598,7 +603,7 @@ int main(int argc, char **argv)
files[2]=tempfile(suffix,"nodes",0);
fprintf(stderr,"Slice %d\n",i);
- phase5(files,references,3,0,suffix,&zip_info);
+ phase5(files,references,3,0,suffix,zip_info);
for (f = 0 ; f < 3 ; f++) {
if (files[f])
fclose(files[f]);
@@ -619,16 +624,23 @@ int main(int argc, char **argv)
unlink("coords.tmp");
}
if (i == suffix_count-1) {
- zipnum=zip_info.zipnum;
- add_aux_tiles("auxtiles.txt", &zip_info);
- write_countrydir(&zip_info);
- zip_info.zipnum=zipnum;
- write_aux_tiles(&zip_info);
- zip_write_index(&zip_info);
- zip_write_directory(&zip_info);
- fclose(zip_info.index);
- fclose(zip_info.dir);
- fclose(zip_info.res);
+ unsigned char md5_data[16];
+ zipnum=zip_get_zipnum(zip_info);
+ add_aux_tiles("auxtiles.txt", zip_info);
+ write_countrydir(zip_info);
+ zip_set_zipnum(zip_info, zipnum);
+ write_aux_tiles(zip_info);
+ zip_write_index(zip_info);
+ zip_write_directory(zip_info);
+ zip_close(zip_info);
+ if (md5file && zip_get_md5(zip_info, md5_data)) {
+ FILE *md5=fopen(md5file,"w");
+ int i;
+ for (i = 0 ; i < 16 ; i++)
+ fprintf(md5,"%02x",md5_data[i]);
+ fprintf(md5,"\n");
+ fclose(md5);
+ }
if (!keep_tmpfiles) {
remove_countryfiles();
tempfile_unlink("index","");
diff --git a/navit/maptool/maptool.h b/navit/maptool/maptool.h
index eaa731ebd..d30abc19a 100644
--- a/navit/maptool/maptool.h
+++ b/navit/maptool/maptool.h
@@ -3,6 +3,10 @@
#include "coord.h"
#include "item.h"
#include "attr.h"
+#ifdef HAVE_LIBCRYPTO
+#include <openssl/md5.h>
+#endif
+
#ifdef HAVE_API_WIN32_BASE
#define LONGLONG_FMT "%I64d"
@@ -76,20 +80,7 @@ struct item_bin_sink {
GList *sink_funcs;
};
-struct zip_info {
- int zipnum;
- int dir_size;
- long long offset;
- int compression_level;
- int maxnamelen;
- int zip64;
- short date;
- short time;
- char *passwd;
- FILE *res;
- FILE *index;
- FILE *dir;
-};
+struct zip_info;
/* boundaries.c */
@@ -300,7 +291,21 @@ void index_init(struct zip_info *info, int version);
void index_submap_add(struct tile_info *info, struct tile_head *th);
/* zip.c */
-
void write_zipmember(struct zip_info *zip_info, char *name, int filelen, char *data, int data_size);
void zip_write_index(struct zip_info *info);
int zip_write_directory(struct zip_info *info);
+struct zip_info *zip_new(void);
+void zip_set_md5(struct zip_info *info, int on);
+int zip_get_md5(struct zip_info *info, unsigned char *out);
+void zip_set_zip64(struct zip_info *info, int on);
+void zip_set_compression_level(struct zip_info *info, int level);
+void zip_set_maxnamelen(struct zip_info *info, int max);
+int zip_get_maxnamelen(struct zip_info *info);
+int zip_add_member(struct zip_info *info);
+int zip_set_timestamp(struct zip_info *info, char *timestamp);
+void zip_open(struct zip_info *info, char *out, char *dir, char *index);
+FILE *zip_get_index(struct zip_info *info);
+int zip_get_zipnum(struct zip_info *info);
+void zip_set_zipnum(struct zip_info *info, int num);
+void zip_close(struct zip_info *info);
+void zip_destroy(struct zip_info *info);
diff --git a/navit/maptool/misc.c b/navit/maptool/misc.c
index bdf8ec070..edfa92faa 100644
--- a/navit/maptool/misc.c
+++ b/navit/maptool/misc.c
@@ -317,7 +317,7 @@ process_slice(FILE **in, FILE **reference, int in_count, int with_range, long lo
}
}
info.write=1;
- info.maxlen=zip_info->maxnamelen;
+ info.maxlen=zip_get_maxnamelen(zip_info);
info.suffix=suffix;
info.tiles_list=NULL;
info.tilesdir_out=NULL;
@@ -331,10 +331,10 @@ process_slice(FILE **in, FILE **reference, int in_count, int with_range, long lo
fprintf(stderr,"Size error '%s': %d vs %d\n", th->name, th->total_size, th->total_size_used);
exit(1);
}
- write_zipmember(zip_info, th->name, zip_info->maxnamelen, th->zip_data, th->total_size);
+ write_zipmember(zip_info, th->name, zip_get_maxnamelen(zip_info), th->zip_data, th->total_size);
zipfiles++;
} else
- fwrite(th->zip_data, th->total_size, 1, zip_info->index);
+ fwrite(th->zip_data, th->total_size, 1, zip_get_index(zip_info));
}
th=th->next;
}
@@ -383,9 +383,9 @@ phase5(FILE **in, FILE **references, int in_count, int with_range, char *suffix,
th=th->next;
}
/* process_slice() modifies zip_info, but need to retain old info */
- zipnum=zip_info->zipnum;
+ zipnum=zip_get_zipnum(zip_info);
written_tiles=process_slice(in, references, in_count, with_range, size, suffix, zip_info);
- zip_info->zipnum=zipnum+written_tiles;
+ zip_set_zipnum(zip_info, zipnum+written_tiles);
slices++;
}
return 0;
@@ -425,13 +425,3 @@ add_aux_tiles(char *name, struct zip_info *info)
}
fclose(in);
}
-
-void
-cat(FILE *in, FILE *out)
-{
- size_t size;
- char buffer[4096];
- while ((size=fread(buffer, 1, 4096, in)))
- fwrite(buffer, 1, size, out);
-}
-
diff --git a/navit/maptool/osm.c b/navit/maptool/osm.c
index 7cfa94c9c..a960d9128 100644
--- a/navit/maptool/osm.c
+++ b/navit/maptool/osm.c
@@ -2089,7 +2089,7 @@ index_country_add(struct zip_info *info, int country_id, int zipnum)
struct item_bin *item_bin=init_item(type_countryindex);
item_bin_add_attr_int(item_bin, attr_country_id, country_id);
item_bin_add_attr_int(item_bin, attr_zipfile_ref, zipnum);
- item_bin_write(item_bin, info->index);
+ item_bin_write(item_bin, zip_get_index(info));
}
void
diff --git a/navit/maptool/tile.c b/navit/maptool/tile.c
index d33d1c67e..3eeff5259 100644
--- a/navit/maptool/tile.c
+++ b/navit/maptool/tile.c
@@ -359,7 +359,7 @@ add_aux_tile(struct zip_info *zip_info, char *name, char *filename, int size)
at->filename=g_strdup(filename);
at->size=size;
aux_tile_list=g_list_append(aux_tile_list, at);
- return zip_info->zipnum++;
+ return zip_add_member(zip_info);
}
int
@@ -379,11 +379,11 @@ write_aux_tiles(struct zip_info *zip_info)
assert(f != NULL);
fread(buffer, at->size, 1, f);
fclose(f);
- write_zipmember(zip_info, at->name, zip_info->maxnamelen, buffer, at->size);
+ write_zipmember(zip_info, at->name, zip_get_maxnamelen(zip_info), buffer, at->size);
free(buffer);
count++;
l=g_list_next(l);
- zip_info->zipnum++;
+ zip_add_member(zip_info);
}
return count;
}
@@ -488,7 +488,7 @@ write_tilesdir(struct tile_info *info, struct zip_info *zip_info, FILE *out)
*last=th;
last=&th->next;
th->next=NULL;
- th->zipnum=zip_info->zipnum;
+ th->zipnum=zip_get_zipnum(zip_info);
fprintf(out,"%s:%d",(char *)next->data,th->total_size);
for ( idx = 0; idx< th->num_subtiles; idx++ ){
@@ -500,7 +500,7 @@ write_tilesdir(struct tile_info *info, struct zip_info *zip_info, FILE *out)
}
if (th->name[strlen(info->suffix)])
index_submap_add(info, th);
- zip_info->zipnum++;
+ zip_add_member(zip_info);
processed_tiles++;
}
next=g_list_next(next);
@@ -511,8 +511,8 @@ write_tilesdir(struct tile_info *info, struct zip_info *zip_info, FILE *out)
struct item_bin *item_bin=init_item(type_submap);
item_bin_add_coord_rect(item_bin, &world_bbox);
item_bin_add_attr_range(item_bin, attr_order, 0, 255);
- item_bin_add_attr_int(item_bin, attr_zipfile_ref, zip_info->zipnum-1);
- item_bin_write(item_bin, zip_info->index);
+ item_bin_add_attr_int(item_bin, attr_zipfile_ref, zip_get_zipnum(zip_info)-1);
+ item_bin_write(item_bin, zip_get_index(zip_info));
}
}
@@ -602,7 +602,7 @@ index_init(struct zip_info *info, int version)
break;
item_bin_add_attr(item_bin, &map_information_attrs[i]);
}
- item_bin_write(item_bin, info->index);
+ item_bin_write(item_bin, zip_get_index(info));
}
void
diff --git a/navit/maptool/zip.c b/navit/maptool/zip.c
index c6fa52853..6f6f7a8da 100644
--- a/navit/maptool/zip.c
+++ b/navit/maptool/zip.c
@@ -29,8 +29,40 @@
#include <openssl/aes.h>
#include <openssl/evp.h>
#include <openssl/rand.h>
+#include <openssl/md5.h>
#endif
+struct zip_info {
+ int zipnum;
+ int dir_size;
+ long long offset;
+ int compression_level;
+ int maxnamelen;
+ int zip64;
+ short date;
+ short time;
+ char *passwd;
+ FILE *res2;
+ FILE *index;
+ FILE *dir;
+#ifdef HAVE_LIBCRYPTO
+ MD5_CTX md5_ctx;
+#endif
+ int md5;
+};
+
+static int
+zip_write(struct zip_info *info, void *data, int len)
+{
+ if (fwrite(data, len, 1, info->res2) != 1)
+ return 0;
+#ifdef HAVE_LIBCRYPTO
+ if (info->md5)
+ MD5_Update(&info->md5_ctx, data, len);
+#endif
+ return 1;
+}
+
#ifdef HAVE_ZLIB
static int
compress2_int(Byte *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level)
@@ -187,17 +219,17 @@ write_zipmember(struct zip_info *zip_info, char *name, int filelen, char *data,
filename[len++]='_';
}
filename[filelen]='\0';
- fwrite(&lfh, sizeof(lfh), 1, zip_info->res);
- fwrite(filename, filelen, 1, zip_info->res);
+ zip_write(zip_info, &lfh, sizeof(lfh));
+ zip_write(zip_info, filename, filelen);
zip_info->offset+=sizeof(lfh)+filelen;
#ifdef HAVE_LIBCRYPTO
if (zip_info->passwd) {
unsigned char counter[16], xor[16], *datap=(unsigned char *)data;
int size=comp_size;
AES_KEY aeskey;
- fwrite(&enc, sizeof(enc), 1, zip_info->res);
- fwrite(salt, sizeof(salt), 1, zip_info->res);
- fwrite(verify, sizeof(verify), 1, zip_info->res);
+ zip_write(zip_info, &enc, sizeof(enc));
+ zip_write(zip_info, salt, sizeof(salt));
+ zip_write(zip_info, verify, sizeof(verify));
zip_info->offset+=sizeof(enc)+sizeof(salt)+sizeof(verify);
AES_set_encrypt_key(key, 128, &aeskey);
memset(counter, 0, sizeof(counter));
@@ -216,14 +248,14 @@ write_zipmember(struct zip_info *zip_info, char *name, int filelen, char *data,
}
}
#endif
- fwrite(data, comp_size, 1, zip_info->res);
+ zip_write(zip_info, data, comp_size);
zip_info->offset+=comp_size;
#ifdef HAVE_LIBCRYPTO
if (zip_info->passwd) {
unsigned int maclen=sizeof(mac);
unsigned char mactmp[maclen*2];
HMAC(EVP_sha1(), key+16, 16, (unsigned char *)data, comp_size, mactmp, &maclen);
- fwrite(mactmp, sizeof(mac), 1, zip_info->res);
+ zip_write(zip_info, mactmp, sizeof(mac));
zip_info->offset+=sizeof(mac);
}
#endif
@@ -256,6 +288,15 @@ zip_write_index(struct zip_info *info)
info->zipnum++;
}
+static void
+zip_write_file_data(struct zip_info *info, FILE *in)
+{
+ size_t size;
+ char buffer[4096];
+ while ((size=fread(buffer, 1, 4096, in)))
+ zip_write(info, buffer, size);
+}
+
int
zip_write_directory(struct zip_info *info)
{
@@ -289,25 +330,137 @@ zip_write_directory(struct zip_info *info)
};
fseek(info->dir, 0, SEEK_SET);
- cat(info->dir, info->res);
+ zip_write_file_data(info, info->dir);
if (info->zip64) {
eoc64.zip64esize=sizeof(eoc64)-12;
eoc64.zip64enum=info->zipnum;
eoc64.zip64ecenn=info->zipnum;
eoc64.zip64ecsz=info->dir_size;
eoc64.zip64eofst=info->offset;
- fwrite(&eoc64, sizeof(eoc64), 1, info->res);
+ zip_write(info, &eoc64, sizeof(eoc64));
eocl.zip64lofst=info->offset+info->dir_size;
- fwrite(&eocl, sizeof(eocl), 1, info->res);
+ zip_write(info, &eocl, sizeof(eocl));
}
eoc.zipenum=info->zipnum;
eoc.zipecenn=info->zipnum;
eoc.zipecsz=info->dir_size;
eoc.zipeofst=info->offset;
- fwrite(&eoc, sizeof(eoc), 1, info->res);
+ zip_write(info, &eoc, sizeof(eoc));
sig_alrm(0);
#ifndef _WIN32
alarm(0);
#endif
return 0;
}
+
+struct zip_info *
+zip_new(void)
+{
+ return g_new0(struct zip_info, 1);
+}
+
+void
+zip_set_md5(struct zip_info *info, int on)
+{
+#ifdef HAVE_LIBCRYPTO
+ info->md5=on;
+ if (on)
+ MD5_Init(&info->md5_ctx);
+#endif
+}
+
+int
+zip_get_md5(struct zip_info *info, unsigned char *out)
+{
+ if (!info->md5)
+ return 0;
+#ifdef HAVE_LIBCRYPTO
+ MD5_Final(out, &info->md5_ctx);
+ return 1;
+#endif
+ return 0;
+}
+
+void
+zip_set_zip64(struct zip_info *info, int on)
+{
+ info->zip64=on;
+}
+
+void
+zip_set_compression_level(struct zip_info *info, int level)
+{
+ info->compression_level=level;
+}
+
+void
+zip_set_maxnamelen(struct zip_info *info, int max)
+{
+ info->maxnamelen=max;
+}
+
+int
+zip_get_maxnamelen(struct zip_info *info)
+{
+ return info->maxnamelen;
+}
+
+int
+zip_add_member(struct zip_info *info)
+{
+ return info->zipnum++;
+}
+
+
+int
+zip_set_timestamp(struct zip_info *info, char *timestamp)
+{
+ int year,month,day,hour,min,sec;
+
+ if (sscanf(timestamp,"%d-%d-%dT%d:%d:%d",&year,&month,&day,&hour,&min,&sec) == 6) {
+ info->date=day | (month << 5) | ((year-1980) << 9);
+ info->time=(sec >> 1) | (min << 5) | (hour << 11);
+ return 1;
+ }
+ return 0;
+}
+
+void
+zip_open(struct zip_info *info, char *out, char *dir, char *index)
+{
+ info->res2=fopen(out,"wb+");
+ info->dir=fopen(dir,"wb+");
+ info->index=fopen(index,"wb+");
+}
+
+FILE *
+zip_get_index(struct zip_info *info)
+{
+ return info->index;
+}
+
+int
+zip_get_zipnum(struct zip_info *info)
+{
+ return info->zipnum;
+}
+
+void
+zip_set_zipnum(struct zip_info *info, int num)
+{
+ info->zipnum=num;
+}
+
+void
+zip_close(struct zip_info *info)
+{
+ fclose(info->index);
+ fclose(info->dir);
+ fclose(info->res2);
+}
+
+void
+zip_destroy(struct zip_info *info)
+{
+ g_free(info);
+}