Return to BSD News archive
Path: sserve!manuel!munnari.oz.au!mips!mips!swrinde!cs.utexas.edu!zaphod.mps.ohio-state.edu!sample.eng.ohio-state.edu!purdue!mentor.cc.purdue.edu!noose.ecn.purdue.edu!neon.ecn.purdue.edu!tgt From: tgt@neon.ecn.purdue.edu (Conan the Librarian) Newsgroups: comp.unix.bsd Subject: Reading 386bsd dist files (bin,src,etc) Keywords: byte swapping problem Message-ID: <1992Aug6.224348.16769@noose.ecn.purdue.edu> Date: 6 Aug 92 22:43:48 GMT Sender: news@noose.ecn.purdue.edu (USENET news) Distribution: usa Organization: Purdue University Engineering Computer Network Lines: 94 Attempting to use cpio to extract the files in the various 386bsd dists, I ran into a byte swapping problem (running on both a Gould and a SUN3). CPIO generates the wonderfully-descript error message "Out of phase -- get help" and then exits. (Someday, I aspire to write code with lots of abstruse error messages like this... :-) Since I really want to look at the srcdist stuff off-line from my PC (not enough memory yet!) but couldn't find any flag to massage cpio into appropriate behavior on the Gould or the SUN (so much for archive portability) I wrote the following program to do the necessary header "fix" (26 shorts in each cpio header need to be byte-swapped). I've tested it on srcdist on my SUN3, and it appears to work properly (I am extracting the src files as I write this). -tom ================= snip snip ================================================= /****** ** CPIOFIX - Program to do byte swapping on the shorts in a cpio header, ** converting from 386bsd (PC) format to SUN/Gould format and thus ** enabling cpio to unarchive 386bsd dist files on these alternate ** architectures. ** ** Copyright 1992 Tom Tobin, no rights reserved. ******/ #include <stdio.h> #include <sys/file.h> #define HSIZE 26 /* cpio header size (not including filename at the end of the header) */ #define BBUFSIZE 256 /* file i/o buffer size */ main(argc, argv) int argc; char *argv[]; { int fdin, fdout, bcount, i, j, skip; char bytes[257], *bptr, btmp; if (argc == 3) { fdin = open(argv[1], O_RDONLY, 0755); fdout = open(argv[2], O_WRONLY|O_CREAT, 0744); } else { /* run as a filter */ fdin = 0; fdout = 1; } read(fdin, bytes, 1); j=0; skip=0; while ((bcount=read(fdin, &bytes[1], BBUFSIZE)) != 0) { for (i=skip, bptr=bytes+skip; i<bcount; i++, bptr++) { if (j != 0) { if (j < (HSIZE)/2) { /* swap bytes on all shorts in header */ btmp = *bptr; *bptr = *(bptr+1); *(bptr+1) = btmp; i++; j++; bptr++; } if (j == (HSIZE)/2) /* clear header counter */ j=0; } else if ((unsigned char) *bptr == 0xC7 && *(bptr+1) == 0x71) { /* fprintf(stdout, "found a header\n"); /* header magic # */ btmp = *bptr; /* swap bytes */ *bptr = *(bptr+1); *(bptr+1) = btmp; i++; j++; bptr++; } } skip = (i==257? 1: 0); write(fdout, bytes, bcount==BBUFSIZE? bcount: bcount+1); bytes[0] = bytes[BBUFSIZE]; } close(fdin); close(fdout); } -- Tom Tobin UUCP: pur-ee!tgt Dept. of ChE INTERNET: tgt@ecn.purdue.edu Purdue University Ma Bell: home (317) 463-0189 W. Lafayette, IN 47907 office " 494-4052