Add:maptool:Optionally create md5 sum of resulting map
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Sat, 12 Feb 2011 18:17:14 +0000 (18:17 +0000)
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Sat, 12 Feb 2011 18:17:14 +0000 (18:17 +0000)
git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@4149 ffa7fe5e-494d-0410-b361-a75ebd5db220

navit/navit/maptool/ch.c
navit/navit/maptool/maptool.c
navit/navit/maptool/maptool.h
navit/navit/maptool/misc.c
navit/navit/maptool/osm.c
navit/navit/maptool/tile.c
navit/navit/maptool/zip.c

index 42a0010..8696cc2 100644 (file)
@@ -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;
index 7e0a06e..1a3e9c7 100644 (file)
@@ -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","");
index eaa731e..d30abc1 100644 (file)
@@ -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);
index bdf8ec0..edfa92f 100644 (file)
@@ -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);
-}
-
index 7cfa94c..a960d91 100644 (file)
@@ -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
index d33d1c6..3eeff52 100644 (file)
@@ -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
index c6fa528..6f6f7a8 100644 (file)
 #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);
+}