Date: Thu, 30 Dec 2004 16:55:43 +0200 From: Peter Pentchev <roam@ringlet.net> To: Maxim Sobolev <sobomax@portaone.com> Cc: Matteo Riondato <rionda@gufi.org> Subject: Re: Creating Compressed Loop FS from stdin Message-ID: <20041230145543.GJ830@straylight.m.ringlet.net> In-Reply-To: <41D40EA0.2060009@portaone.com> References: <1104358540.2895.10.camel@kaiser.sig11.org> <20041230103433.GB830@straylight.m.ringlet.net> <1104409708.6657.1.camel@kaiser.sig11.org> <20041230123116.GE830@straylight.m.ringlet.net> <41D4036B.1060600@portaone.com> <20041230140007.GH830@straylight.m.ringlet.net> <41D40EA0.2060009@portaone.com>
next in thread | previous in thread | raw e-mail | index | archive | help
--x+RZeZVNR8VILNfK Content-Type: multipart/mixed; boundary="BEa57a89OpeoUzGD" Content-Disposition: inline --BEa57a89OpeoUzGD Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable On Thu, Dec 30, 2004 at 04:20:16PM +0200, Maxim Sobolev wrote: > You don't check return code of the second lseek - I bet it fails. This=20 > probably leads to creation of seemingly valid loop fs (i.e. with valid=20 > header), but filled with zeroes or some random junk. I said I'd tested it before posting it the first time. It works. It creates a valid loop fs, containing exactly the files that are in the input ISO image. However, your point is valid; here's another patch which returns to the start only if the original lseek() did not move away (or failed), and checks the return value, too. This version of mkuzip works on today's RELENG_5, as can be seen from the attached mkuzip.script sequence of commands. G'luck, Peter --=20 Peter Pentchev roam@ringlet.net roam@cnsys.bg roam@FreeBSD.org PGP key: http://people.FreeBSD.org/~roam/roam.key.asc Key fingerprint FDBA FD79 C26F 3C51 C95E DF9E ED18 B68D 1619 4553 Nostalgia ain't what it used to be. --BEa57a89OpeoUzGD Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="mkuzip.script" Content-Transfer-Encoding: quoted-printable Script started on Thu Dec 30 16:50:57 2004 Starting interactive C shell [roam@straylight ~/fbsd/r/src/usr.bin/mkuzip]> `make -V .OBJDIR`/`make -V P= ROG` -v -s 65536 -o dns-stdin.uz /dev/stdin < ~/dns.iso data size 5505024 bytes, number of clusters 84, index lengh 680 bytes cluster #0, in 65536 bytes, out 2263 bytes cluster #1, in 65536 bytes, out 11581 bytes [snip more of the same] cluster #82, in 65536 bytes, out 11684 bytes cluster #83, in 65536 bytes, out 752 bytes padding data with 161 bytes so that file size is multiple of 512 compressed data to 1361920 bytes, saved 4143104 bytes, 75.26% decrease. [roam@straylight ~/fbsd/r/src/usr.bin/mkuzip]> sudo mdconfig -a -f dns-stdi= n.uz otp-md5 455 st1434 ext Password:=20 md0 [roam@straylight ~/fbsd/r/src/usr.bin/mkuzip]> sudo mount_cd9660 /dev/md0.u= zip /mnt [roam@straylight ~/fbsd/r/src/usr.bin/mkuzip]> sudo find /mnt | wc -l 604 [roam@straylight ~/fbsd/r/src/usr.bin/mkuzip]> sudo md5 /mnt/djbdns-1.05/ti= nydns MD5 (/mnt/djbdns-1.05/tinydns) =3D d16c2fe610c19148ff005fb35242561c [roam@straylight ~/fbsd/r/src/usr.bin/mkuzip]> sudo md5 /home/roam/fbsd/r/p= orts/dns/djbdns/work/djbdns-1.05/tinydns MD5 (/home/roam/fbsd/r/ports/dns/djbdns/work/djbdns-1.05/tinydns) =3D d16c2= fe610c19148ff005fb35242561c [roam@straylight ~/fbsd/r/src/usr.bin/mkuzip]> sudo umount /mnt [roam@straylight ~/fbsd/r/src/usr.bin/mkuzip]> sudo mdconfig -d -u 0 [roam@straylight ~/fbsd/r/src/usr.bin/mkuzip]> exit exit Script done on Thu Dec 30 16:52:53 2004 --BEa57a89OpeoUzGD Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="mkuzip-size.patch" Content-Transfer-Encoding: quoted-printable Index: src/usr.bin/mkuzip/mkuzip.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 RCS file: /home/ncvs/src/usr.bin/mkuzip/mkuzip.c,v retrieving revision 1.2 diff -u -r1.2 mkuzip.c --- src/usr.bin/mkuzip/mkuzip.c 10 Sep 2004 23:16:05 -0000 1.2 +++ src/usr.bin/mkuzip/mkuzip.c 30 Dec 2004 14:47:35 -0000 @@ -122,10 +122,28 @@ signal(SIGXFSZ, exit); atexit(cleanup); =20 - if (stat(iname, &sb) !=3D 0) { + fdr =3D open(iname, O_RDONLY); + if (fdr < 0) { + err(1, "%s", iname); + /* Not reached */ + } + + /* Try seeking to the end; if that fails, fall back to fstat() */ + memset(&sb, 0, sizeof(sb)); + sb.st_size =3D lseek(fdr, 0, SEEK_END); + if (sb.st_size < 1) { + if (fstat(fdr, &sb) !=3D 0) { + err(1, "%s", iname); + /* Not reached */ + } + } else if (lseek(fdr, 0, SEEK_SET) !=3D 0) { err(1, "%s", iname); /* Not reached */ } + if (sb.st_size < 1) { + errx(1, "Could not determine the size of %s", iname); + /* Not reached */ + } hdr.nblocks =3D sb.st_size / hdr.blksz; if ((sb.st_size % hdr.blksz) !=3D 0) { if (verbose !=3D 0) @@ -135,11 +153,6 @@ } toc =3D safe_malloc((hdr.nblocks + 1) * sizeof(*toc)); =20 - fdr =3D open(iname, O_RDONLY); - if (fdr < 0) { - err(1, "%s", iname); - /* Not reached */ - } fdw =3D open(oname, O_WRONLY | O_TRUNC | O_CREAT, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH); if (fdw < 0) { --BEa57a89OpeoUzGD-- --x+RZeZVNR8VILNfK Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.6 (FreeBSD) iD8DBQFB1Bbv7Ri2jRYZRVMRAlo2AKCZZwJH/yWQOk4jZqXUsuQwAsKPIQCfRQ0p T+mowuggWUd5tIox/i//QZc= =eg9L -----END PGP SIGNATURE----- --x+RZeZVNR8VILNfK--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20041230145543.GJ830>