*BSD News Article 19856


Return to BSD News archive

Xref: sserve comp.os.386bsd.bugs:1255 comp.os.386bsd.misc:731 comp.os.386bsd.questions:4557
Path: sserve!newshost.anu.edu.au!munnari.oz.au!constellation!osuunx.ucc.okstate.edu!moe.ksu.ksu.edu!vixen.cso.uiuc.edu!howland.reston.ans.net!xlink.net!math.fu-berlin.de!irz401!uriah!not-for-mail
From: j@bonnie.tcd-dresden.de (J Wunsch)
Newsgroups: comp.os.386bsd.bugs,comp.os.386bsd.misc,comp.os.386bsd.questions
Subject: Re: Problem with CPIO?
Date: 22 Aug 1993 20:39:50 +0200
Organization: Textil Computer Design GmbH Dresden, Germany
Lines: 155
Message-ID: <258ehmINNl9j@bonnie.tcd-dresden.de>
References: <251oub$csf@manuel.anu.edu.au>
NNTP-Posting-Host: bonnie.tcd-dresden.de

In <251oub$csf@manuel.anu.edu.au> mbl900@anusf.anu.edu.au (Mathew BM LIM) writes:

>IS there a know bug in cpio an Archive Viper QIC 150 drives? I ALWAYS 
>get the following problem when using cpio on this drive.

>I can write to the drive without any apparent problems using
>	find / -print | cpio -ovBc > /dev/rst0
>All seems ok, the write finishes, but when I go to read the tape again, I get :
>	cpio -ivBct < /dev/rst0
[...]
>	100755 root   496498  Aug 15 18:07:33 1993  
>	cpio: Out of phase--get help

It's a known bug, with a known fix (by me:-).
cpio is from AT&T, and AT&T didn't have symlinks. So the cpio support
for symlinks is buggy. The original cpio, as delivered with 386BSD
is able to dump symlinks only in binary mode, i.e. without the -c
option. If you use compatibility mode (-c), the archive header for
the symlink will still be written binary:-((, so the cpio -i cannot
restore it.

Similiar considerations apply to archives containing unix domain sockets.
(Though it's never usefull to restore them, cpio should at least conti-
nue instead of aborting.)

Here's my patch, in patchkit style:

#! /bin/sh
# This is a shell archive.  Remove anything before this line, then feed it
# into a shell via "sh file" or similar.  To overwrite existing files,
# type "sh file -c".
# The tool that generated this appeared in the comp.sources.unix newsgroup;
# send mail to comp-sources-unix@uunet.uu.net if you want that tool.
# If this archive is complete, you will see the following message at the end:
#		"End of shell archive."
# Contents:  patchjw004 patchjw004/PATCH patchjw004/part.1
# Wrapped by j@bonnie on Sun Aug 22 20:37:23 1993
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test ! -d 'patchjw004' ; then
    echo shar: Creating directory \"'patchjw004'\"
    mkdir 'patchjw004'
fi
if test -f 'patchjw004/PATCH' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'patchjw004/PATCH'\"
else
echo shar: Extracting \"'patchjw004/PATCH'\" \(888 characters\)
sed "s/^X//" >'patchjw004/PATCH' <<'END_OF_FILE'
X%%DESC Help information per file for Patches program
XPATCH:		FIX SYMLINK AND SOCKET NODE BUG IN CPIO
XAUTHOR:		J"org Wunsch <joerg_wunsch@uriah.sax.de>
XDESCRIPTION:
XWhen creating ``portable'' archives with cpio (option -oc), symbolic links
Xcause cpio to create the wrong (binary) headers, so the cpio -i fails to
Xread them (out of phase). The fix corrects this.
XAnother problem is that, if there's a socket node in the archive, it's
Xgetting displayed correctly with cpio -ivt, but an empty directory will
Xbe created when extracting the archive. This is fixed, so a complaint
Xfrom mknod(2) is printed (there's no sense creating sockets this way).
X%%REQ Patches for files to be correct patch level for this patch
XPATCHTO 1 00048 /usr/src/usr.bin/cpio/cpio.c.pl1
X%%FILES New and Patch files for this patch
XPATCH 2 part.1 /usr/src/usr.bin/cpio/cpio.c
X%%EOF -- This file has not been truncated

END_OF_FILE
echo shar: NEWLINE appended to \"'patchjw004/PATCH'\"
if test 889 -ne `wc -c <'patchjw004/PATCH'`; then
    echo shar: \"'patchjw004/PATCH'\" unpacked with wrong size!
fi
# end of 'patchjw004/PATCH'
fi
if test -f 'patchjw004/part.1' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'patchjw004/part.1'\"
else
echo shar: Extracting \"'patchjw004/part.1'\" \(2012 characters\)
sed "s/^X//" >'patchjw004/part.1' <<'END_OF_FILE'
X*** /usr/src/usr.bin/cpio/cpio.c.pl2	Tue Oct 13 12:10:18 1992
X--- /usr/src/usr.bin/cpio/cpio.c	Wed Jan 27 05:29:27 1993
X***************
X*** 14,23 ****
X   *
X   * PATCHES MAGIC                LEVEL   PATCH THAT GOT US HERE
X   * --------------------         -----   ----------------------
X!  * CURRENT PATCH LEVEL:         1       00048
X   * --------------------         -----   ----------------------
X   *
X   * 16 Aug 92	Guy Harris		Symbolic link fix
X  */
X  
X  /*	cpio	COMPILE:	cc -O cpio.c -s -i -o cpio -lgen -lerr
X--- 14,26 ----
X   *
X   * PATCHES MAGIC                LEVEL   PATCH THAT GOT US HERE
X   * --------------------         -----   ----------------------
X!  * CURRENT PATCH LEVEL:         2       jw004
X   * --------------------         -----   ----------------------
X   *
X   * 16 Aug 92	Guy Harris		Symbolic link fix
X+  *
X+  * 27 Jan 93    J"org Wunsch		Another symlink fix,
X+  *					fixed socket handling on cpio -i
X  */
X  
X  /*	cpio	COMPILE:	cc -O cpio.c -s -i -o cpio -lgen -lerr
X***************
X*** 363,369 ****
X  					continue;
X  				}
X  				Symlbuf[symlsz] = '\0';
X! 				bwrite(&Hdr, HDRSIZE+Hdr.h_namesize);
X  				bwrite(Symlbuf, symlsz);
X  				if(Verbose)
X  					(void) fprintf(stderr, "%s\n",
X--- 366,376 ----
X  					continue;
X  				}
X  				Symlbuf[symlsz] = '\0';
X! /* 27 Jan 93 -- symlinks should get ascii headers, too, if requested so */
X! 				if( Cflag )
X! 					bwrite(Chdr,CHARS+Hdr.h_namesize);
X! 				else
X! 					bwrite(&Hdr, HDRSIZE+Hdr.h_namesize);
X  				bwrite(Symlbuf, symlsz);
X  				if(Verbose)
X  					(void) fprintf(stderr, "%s\n",
X***************
X*** 748,753 ****
X--- 755,766 ----
X  	A_directory = (ftype == S_IFDIR);
X  	A_special = (ftype == S_IFBLK)
X  		||  (ftype == S_IFCHR)
X+ /* 27 Jan 93 */
X+ #ifdef S_IFSOCK
X+ /* handle socket nodes; though we cannot mknod them (no sense), we thus
X+    avoid empty dir's from being created                                */
X+ 		||  (ftype == S_IFSOCK)
X+ #endif
X  		||  (ftype == S_IFIFO);
X  	A_symlink = (ftype == S_IFLNK);
X  	return 1;

END_OF_FILE
echo shar: NEWLINE appended to \"'patchjw004/part.1'\"
if test 2013 -ne `wc -c <'patchjw004/part.1'`; then
    echo shar: \"'patchjw004/part.1'\" unpacked with wrong size!
fi
# end of 'patchjw004/part.1'
fi
echo shar: End of shell archive.
exit 0
-- 
in real life: J"org Wunsch |   )  o o  | primary: joerg_wunsch@tcd-dresden.de
above 1.8 MHz:   DL 8 DTL  |    )  |   | private: joerg_wunsch@uriah.sax.de
                           | . * ) ==  |
          ``An elephant is a mouse with an operating system.''