From owner-freebsd-hackers@FreeBSD.ORG Wed Oct 6 11:07:41 2010 Return-Path: Delivered-To: hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id D3D53106564A for ; Wed, 6 Oct 2010 11:07:41 +0000 (UTC) (envelope-from erik@cederstrand.dk) Received: from csmtp3.one.com (csmtp3.one.com [91.198.169.23]) by mx1.freebsd.org (Postfix) with ESMTP id 43A978FC1F for ; Wed, 6 Oct 2010 11:07:41 +0000 (UTC) Received: from [192.168.0.22] (0x573fa596.cpe.ge-1-1-0-1109.ronqu1.customer.tele.dk [87.63.165.150]) by csmtp3.one.com (Postfix) with ESMTP id 1FEE9240B1C3; Wed, 6 Oct 2010 11:07:39 +0000 (UTC) Mime-Version: 1.0 (Apple Message framework v1081) Content-Type: multipart/signed; boundary=Apple-Mail-1552-965896787; protocol="application/pkcs7-signature"; micalg=sha1 From: Erik Cederstrand In-Reply-To: <140AD250-ECD1-4BCF-806B-F5901B3BFD87@kientzle.com> Date: Wed, 6 Oct 2010 13:07:38 +0200 Message-Id: References: <52C32EA5-A380-4237-A27C-9E2DF2D4E022@cederstrand.dk> <20101005135906.GA3430@owl.midgard.homeip.net> <140AD250-ECD1-4BCF-806B-F5901B3BFD87@kientzle.com> To: Tim Kientzle X-Mailer: Apple Mail (2.1081) X-Content-Filtered-By: Mailman/MimeDel 2.1.5 Cc: FreeBSD Hackers Subject: Re: Timestamps in static libraries X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 06 Oct 2010 11:07:41 -0000 --Apple-Mail-1552-965896787 Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii Den 06/10/2010 kl. 08.00 skrev Tim Kientzle: >>=20 >> % diff mod.strings orig.strings >> 2c2 >> < / 1286312209 0 0 0 958 ` >> --- >>> / 1269146263 0 0 0 958 ` >=20 > That's the timestamp on the pseudo-entry used to store the archive > symbol table. (GNU/SysV ar files use a pseudo-entry named "/" to > store the symbol table. Since '/' is added to end of names in this > format, this is essentially an entry with an empty name.) >=20 > The current ar code generates this entry and sets the timestamp > around line 624 of usr.bin/ar/write.c. >=20 > As far as I can tell, ar itself doesn't care about the timestamp here; > it's possible that ranlib or ld do care. If they don't, we could set > this timestamp to zero always. Is something like the following acceptable? Without risking changes to = buildworld/distribution just now, this would allow me to dump contents = of an archive and re-insert them with '0' for mtime, uid and gid before = checking checksums, without affecting normal ar behaviour. erik% svn diff Index: ar.1 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- ar.1 (revision 213478) +++ ar.1 (working copy) @@ -62,6 +62,7 @@ .Op Fl a Ar position-after .Op Fl b Ar position-before .Op Fl c +.Op Fl D .Op Fl i Ar position-before .Op Fl j .Op Fl s @@ -179,6 +180,14 @@ .Ar archive . The archive's symbol table, if present, is updated to reflect the new contents of the archive. +.It Fl D +When used in combination with the=20 +.Fl r +option, insterts 0's instead of the real mtime, uid and gid values +from the members named by arguments +.Ar files ... . +This ensures that checksums on the resulting archives are reproducible +when member contents are identical. .It Fl f Synonymous with option .Fl T . Index: ar.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- ar.c (revision 213478) +++ ar.c (working copy) @@ -154,7 +154,7 @@ } } =20 - while ((opt =3D getopt_long(argc, argv, = "abCcdfijlMmopqrSsTtuVvxz", + while ((opt =3D getopt_long(argc, argv, = "abCcdDfijlMmopqrSsTtuVvxz", longopts, NULL)) !=3D -1) { switch(opt) { case 'a': @@ -173,6 +173,9 @@ case 'd': set_mode(bsdar, opt); break; + case 'D': + bsdar->options |=3D AR_D; + break; case 'f': case 'T': bsdar->options |=3D AR_TR; @@ -357,8 +360,8 @@ (void)fprintf(stderr, "\tar -m [-Tabijsvz] position archive file = ...\n"); (void)fprintf(stderr, "\tar -p [-Tv] archive [file ...]\n"); (void)fprintf(stderr, "\tar -q [-Tcjsvz] archive file ...\n"); - (void)fprintf(stderr, "\tar -r [-Tcjsuvz] archive file ...\n"); - (void)fprintf(stderr, "\tar -r [-Tabcijsuvz] position archive = file ...\n"); + (void)fprintf(stderr, "\tar -r [-TcDjsuvz] archive file ...\n"); + (void)fprintf(stderr, "\tar -r [-TabcDijsuvz] position archive = file ...\n"); (void)fprintf(stderr, "\tar -s [-jz] archive\n"); (void)fprintf(stderr, "\tar -t [-Tv] archive [file ...]\n"); (void)fprintf(stderr, "\tar -x [-CTouv] archive [file ...]\n"); Index: ar.h =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- ar.h (revision 213478) +++ ar.h (working copy) @@ -43,6 +43,7 @@ #define AR_U 0x0200 /* only extract or update newer = members.*/ #define AR_V 0x0400 /* verbose mode */ #define AR_Z 0x0800 /* gzip compression */ +#define AR_D 0x1000 /* insert members with dummy mtime, uid = and gid */ =20 #define DEF_BLKSZ 10240 /* default block size */ =20 Index: write.c =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D --- write.c (revision 213478) +++ write.c (working copy) @@ -163,11 +163,22 @@ if (mtime !=3D 0 && bsdar->options & AR_U && sb.st_mtime <=3D = mtime) goto giveup; =20 - obj->uid =3D sb.st_uid; - obj->gid =3D sb.st_gid; + /* + * When modifier -D is specified, mtime and UID / GID from the = file + * will be replaced with 0. This ensures that checksums will = match=20 + * for two archives containing the exact same files. + */ + if (bsdar->options & AR_D) { + obj->uid =3D 0; + obj->gid =3D 0; + obj->mtime =3D 0; + } else { + obj->uid =3D sb.st_uid; + obj->gid =3D sb.st_gid; + obj->mtime =3D sb.st_mtime; + } obj->md =3D sb.st_mode; obj->size =3D sb.st_size; - obj->mtime =3D sb.st_mtime; obj->dev =3D sb.st_dev; obj->ino =3D sb.st_ino; =20 @@ -621,7 +632,10 @@ bsdar->options & AR_S) { entry =3D archive_entry_new(); archive_entry_copy_pathname(entry, "/"); - archive_entry_set_mtime(entry, time(NULL), 0); + if (bsdar->options & AR_O) + archive_entry_set_mtime(entry, 0, 0); + else + archive_entry_set_mtime(entry, time(NULL), 0); archive_entry_set_size(entry, (bsdar->s_cnt + 1) * sizeof(uint32_t) + bsdar->s_sn_sz); AC(archive_write_header(a, entry)); Thanks, Erik --Apple-Mail-1552-965896787--