diff options
author | martin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2011-02-12 18:17:14 +0000 |
---|---|---|
committer | martin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2011-02-12 18:17:14 +0000 |
commit | e7071c026716872236784b06ec1d4058dec67956 (patch) | |
tree | cc51f1e41f1217ec2a76ec357ee26458d3657330 /navit/maptool | |
parent | 8bf234d5eec3f7ae7ceecde6bcb46a24ce69f77d (diff) | |
download | navit-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.c | 6 | ||||
-rw-r--r-- | navit/maptool/maptool.c | 82 | ||||
-rw-r--r-- | navit/maptool/maptool.h | 35 | ||||
-rw-r--r-- | navit/maptool/misc.c | 20 | ||||
-rw-r--r-- | navit/maptool/osm.c | 2 | ||||
-rw-r--r-- | navit/maptool/tile.c | 16 | ||||
-rw-r--r-- | navit/maptool/zip.c | 175 |
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); +} |