Source: dictd Version: 1.12.1+dfsg-3 Severity: wishlist Tags: patch User: reproducible-bui...@lists.alioth.debian.org Usertags: toolchain X-Debbugs-Cc: reproducible-bui...@lists.alioth.debian.org
Hi, While working on the "reproducible builds" effort [1], we have noticed that dictzip adds the filename and timestamp to the generated .dz files. The attached patch adds a --no-name flag (like gzip) that disables this. This will make it easier and cleaner for maintainers to make their builds reproducible. [1]: https://wiki.debian.org/ReproducibleBuilds Regards, -- ,''`. : :' : Chris Lamb `. `'` la...@debian.org / chris-lamb.co.uk `-
diff --git a/data.h b/data.h index 2fa54f2..ca0f564 100644 --- a/data.h +++ b/data.h @@ -33,7 +33,8 @@ extern void dict_data_close ( extern void dict_data_print_header( FILE *str, dictData *data ); extern int dict_data_zip( const char *inFilename, const char *outFilename, - const char *preFilter, const char *postFilter ); + const char *preFilter, const char *postFilter, + int nonameFlag ); extern char *dict_data_obtain ( const dictDatabase *db, diff --git a/dictzip.1.in b/dictzip.1.in index 7b2c6e2..5b51173 100644 --- a/dictzip.1.in +++ b/dictzip.1.in @@ -172,6 +172,9 @@ license and quit. Check the compressed file integrity. This option is not implemented. Instead, it will list the header information. .TP +.BR \-n " or " \-\-no-name +Don't save the original filename and timestamp. +.TP .BR \-v " or " \-\-verbose Verbose. Display extra information during compression. .TP diff --git a/dictzip.c b/dictzip.c index 3e8000d..f917407 100644 --- a/dictzip.c +++ b/dictzip.c @@ -127,7 +127,8 @@ void dict_data_print_header( FILE *str, dictData *header ) } int dict_data_zip( const char *inFilename, const char *outFilename, - const char *preFilter, const char *postFilter ) + const char *preFilter, const char *postFilter, + int nonameFlag ) { char inBuffer[IN_BUFFER_SIZE]; char outBuffer[OUT_BUFFER_SIZE]; @@ -162,11 +163,16 @@ int dict_data_zip( const char *inFilename, const char *outFilename, err_fatal_errno( __func__, "Cannot open \"%s\"for write\n", outFilename ); - origFilename = xmalloc( strlen( inFilename ) + 1 ); - if ((pt = strrchr( inFilename, '/' ))) - strcpy( origFilename, pt + 1 ); - else - strcpy( origFilename, inFilename ); + if (nonameFlag) { + origFilename = xmalloc( 1 ); + origFilename[0] = '\0'; + } else { + origFilename = xmalloc( strlen( inFilename ) + 1 ); + if ((pt = strrchr( inFilename, '/' ))) + strcpy( origFilename, pt + 1 ); + else + strcpy( origFilename, inFilename ); + } /* Initialize compression engine */ zStream.zalloc = NULL; @@ -210,10 +216,12 @@ int dict_data_zip( const char *inFilename, const char *outFilename, #if HEADER_CRC header[GZ_FLG] |= GZ_FHCRC; #endif - header[GZ_MTIME+3] = (st.st_mtime & 0xff000000) >> 24; - header[GZ_MTIME+2] = (st.st_mtime & 0x00ff0000) >> 16; - header[GZ_MTIME+1] = (st.st_mtime & 0x0000ff00) >> 8; - header[GZ_MTIME+0] = (st.st_mtime & 0x000000ff) >> 0; + if (!nonameFlag) { + header[GZ_MTIME+3] = (st.st_mtime & 0xff000000) >> 24; + header[GZ_MTIME+2] = (st.st_mtime & 0x00ff0000) >> 16; + header[GZ_MTIME+1] = (st.st_mtime & 0x0000ff00) >> 8; + header[GZ_MTIME+0] = (st.st_mtime & 0x000000ff) >> 0; + } header[GZ_XFL] = GZ_MAX; header[GZ_OS] = GZ_OS_UNIX; header[GZ_XLEN+1] = (extraLength & 0xff00) >> 8; @@ -376,6 +384,7 @@ static void help( void ) "", "-d --decompress decompress", "-f --force force overwrite of output file", + "-n --no-name don't save the original filename and timestamp", "-h --help give this help", "-k --keep do not delete original file", "-l --list list compressed file contents", @@ -409,6 +418,7 @@ int main( int argc, char **argv ) int listFlag = 0; int stdoutFlag = 0; int testFlag = 0; + int nonameFlag = 0; char buffer[BUFFERSIZE]; char *buf; char *pre = NULL; @@ -426,6 +436,7 @@ int main( int argc, char **argv ) { "stdout", 0, 0, 'c' }, { "decompress", 0, 0, 'd' }, { "force", 0, 0, 'f' }, + { "no-name", 0, 0, 'n' }, { "help", 0, 0, 'h' }, { "keep", 0, 0, 'k' }, { "list", 0, 0, 'l' }, @@ -463,11 +474,12 @@ int main( int argc, char **argv ) #endif while ((c = getopt_long( argc, argv, - "cdfhklLe:E:s:S:tvVD:p:P:", + "cdfnhklLe:E:s:S:tvVD:p:P:", longopts, NULL )) != EOF) switch (c) { case 'd': ++decompressFlag; break; case 'f': ++forceFlag; break; + case 'n': ++nonameFlag; break; case 'k': ++keepFlag; break; case 'l': ++listFlag; break; case 'L': license(); exit( 1 ); break; @@ -542,7 +554,7 @@ int main( int argc, char **argv ) } } else { snprintf( buffer,BUFFERSIZE-1, "%s.dz", argv[i] ); - if (!dict_data_zip( argv[i], buffer, pre, post )) { + if (!dict_data_zip( argv[i], buffer, pre, post, nonameFlag )) { if (!keepFlag && unlink( argv[i] )) err_fatal_errno( __func__, "Cannot unlink %s\n", argv[i] ); } else {