Dennis Martens <MARTENSD@health.qld.gov.au>
Baranyai Pal <bp@hszk.bme.hu>
JOSEPH AAJ Chackompally <AAJ@necsin.nec.com.sg>
Rich Kulawiec <rsk@gsp.org>
Brian Sherwood <sherwood@alux4.micro.lucent.com>
Dennis and Baranyai suggested variants on the actual (and simplest)
solution (which also occurred to me as I was driving home last night):
rsh other.host "dd if=/dev/rmt0 bs=5120" | cpio -iB
They suggested that "conv=swap" or "conv=notrunc,noerror" might need to
be applied to the dd command. The above worked without those options.
Baranyai and Brian also suggested obtaining GNU cpio. A fine idea, but
the above solution was simpler.
Rich sent along a little C program to read a tape; I include it here with
his comments for those interested in exploring this problem further at a
lower level ...
All done. Thanks (once again) for helping me to be a hero, folks!
> I hesitate to send this because (a) it may not solve your problem
> and (b) it's exceedingly ugly code from a long, long time ago. My excuse
> is that it was a very quick hack to read cpio tapes from BTL which were
> written with -c turned on -- it was never intended to be run more than
> once or twice. However, this little program (rcpioV.c) may solve your
> problem...once you stop laughing at the code. It reads stdin and takes
> *no* arguments: it just extracts what it finds.
>
> I figure that it's probably worth the 60 seconds that it'll take to compile
> it and try it. (It *does* compile under SunOS 4.1.4, at least.)
>
> #include <stdio.h>
> #include <sys/file.h>
>
> /* Attempt to read Btl Cpio (Sys V) format with -c turned on */
> /* rsk 12/14/83 */
>
> struct bozo {
> int h_magic; /* 070707 */
> int h_dev;
> int h_ino;
> int h_mode;
> int h_uid;
> int h_gid;
> int h_nlink;
> int h_rdev;
> long h_Longtime; /* Same as h_mtime */
> int h_namesize; /* length of h_name inc. null byte */
> long h_Longfile; /* Same as h_filesize; 0 -> dir */
> char h_name[255]; /* Null terminated */
> } Hdr;
>
> char header[500];
>
> main() /* Use stdin 'cause I'm lazy */
> {
> int c,i;
> FILE *fd;
> long bytes;
> for(;;) {
> for(i=0;i<500;i++)
> header[i] = '\0';
> i = 0;
> while( (c=getchar()) != '\0' && c != EOF) {
> header[i++] = c;
> }
> if(sscanf(header,"%6o%6o%6o%6o%6o%6o%6o%6o%11lo%6o%11lo%s",
> &Hdr.h_magic, &Hdr.h_dev, &Hdr.h_ino, &Hdr.h_mode,
> &Hdr.h_uid, &Hdr.h_gid, &Hdr.h_nlink, &Hdr.h_rdev,
> &Hdr.h_Longtime, &Hdr.h_namesize,&Hdr.h_Longfile,Hdr.h_name) == -1) {
> printf("Scanf failed\n");
> exit(1);
> }
> printf("Mode: %6o Nmsize: %8d Length: %11ld Name: %s\n",
> &Hdr.h_mode, Hdr.h_namesize, Hdr.h_Longfile,Hdr.h_name);
>
> if(Hdr.h_magic != 070707) {
> printf("Bad magic number = %o\n",Hdr.h_magic);
> exit(1);
> }
> if(Hdr.h_Longfile == 0l) {
> mkdir(Hdr.h_name,Hdr.h_mode);
> }
> else {
> if( (fd=fopen(Hdr.h_name,"w")) == NULL) {
> printf("Open failed on %s\n",Hdr.h_name);
> exit(1);
> }
> bytes = Hdr.h_Longfile;
> while( (bytes--) != 0l) {
> c=getchar();
> putc(c,fd);
> }
> if(fclose(fd) == -1) {
> printf("Close failed on %s\n",Hdr.h_name);
> exit(1);
> }
> }
> }
> }
Original message ..
>
> Searched about half of the archives at latech.edu, no hits.
>
> One of our customers has shown up with a DDS-1 tape created on a Sun box
> with 'cpio -ovBcdum "*.stuff"' >/whatever. We haven't been able extract the
> archives (though 'dd' confirms that the data is on the tapes).
>
> None of our Suns has a DDS drive installed. The DDS drives on our other
> Unix systems (HP-UX 9 & 10, AIX 3 & 4, Digital Unix 3 & 4, Data General,
> SCO) report read errors or 'out of sync'. -R did not re-sync
> successfully on HP-UX, and the usual block_sizes failed on AIX.
>
> I think I've seen this problem before .. I believe the issue is that the
> header produced with -c on Solaris has portability issues, and that the
> better method is to use '-H odc' when generating the tape. I'd prefer to
> avoid asking the customer to re-gen his tape however, and would like to
> avoid swapping drives around, if possible.
>
> Does anyone have a method that works on any of the above referenced
> *nixes to work around this problem?
>
> Will summarize.
>