[unix-pc.sources] Program to access raw floppies

jbm@uncle.UUCP (John B. Milton) (02/19/89)

This program gets at the disk the same way mtools does. I whipped this up in
about an hour (including research into mtools) to copy some raw tar stuff off
of some XENIX floppies. It's all extreamly clear-cut. The switch after the
getopt() and gd(7) should be the only other docs you'll need :)

This program was needed because the XENIX disk are VERY raw, in that they do
not have a VHB on them, just data. When we do the typical "</dev/rfp021", we
must use UNIXpc formatted floppies.

I leave it to someone else to refine this to write "very raw" disk. While
you're doing that, I'll be writing a util to format nine (9) sector disks and
other fun things...

John
--
John Bly Milton IV, jbm@uncle.UUCP, n8emr!uncle!jbm@osu-cis.cis.ohio-state.edu
(614) h:294-4823, w:764-2933;  Got any good 74LS503 circuits?
---
#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of shell archive."
# Contents:  rflp.c
# Wrapped by jbm@uncle on Sun Feb 19 01:28:25 1989
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'rflp.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'rflp.c'\"
else
echo shar: Extracting \"'rflp.c'\" \(2199 characters\)
sed "s/^X//" >'rflp.c' <<'END_OF_FILE'
X/* vi:set ts=2 sw=2: */
X
X#include <fcntl.h>
X#include <stdio.h>
X#include <string.h>
X#include <sys/gdioctl.h> /* includes sys/gdisk.h */
X
Xextern int errno;
Xextern int optind;
Xextern char *optarg;
X
X#define LINESIZE 200
X
Xchar *me;
Xint Cyls=40,Debug=0,Intrl=1,Sects=9,Size=512,Tracks=2;
X
Xstatic void shgdctl(gdctl)
Xstruct gdctl *gdctl;
X{
X	fprintf(stderr,"stat:%x, dsktyp:%d\n",(unsigned int)gdctl->status,gdctl->dsktyp);
X	fprintf(stderr,"name:%6.6s, cyls:%d, heads:%d, psectrk:%d, pseccyl:%d, flags:%x, step:%d, sectorsz:%d\n",gdctl->params.name,gdctl->params.cyls,gdctl->params.heads,gdctl->params.psectrk,gdctl->params.pseccyl,gdctl->params.flags,gdctl->params.step,gdctl->params.sectorsz);
X}
X
Xstatic void proc()
X{
X	int f,len;
X	struct gdctl gdctl;
X	char buf[10240];
X
X	if (Debug)
X		fprintf(stderr,"opening...\n");
X	if ((f=open("/dev/rfp020",O_RDONLY))==-1)
X		qperrorf("%s: open /dev/rfp020",me);
X	if (Debug)
X		fprintf(stderr,"open, doing GDGETA...\n");
X	if (ioctl(f,GDGETA,&gdctl)==-1)
X		qperrorf("%s: ioctl GDGETA",me);
X	if (Debug)
X		fprintf(stderr,"done.\n");
X	if (Debug)
X		shgdctl(&gdctl);
X	/* gdctl.params.name */
X	gdctl.params.cyls=Cyls;
X	gdctl.params.heads=Tracks;
X	gdctl.params.psectrk=Sects;
X	gdctl.params.pseccyl=Sects*Tracks;
X	gdctl.params.flags=1;
X	gdctl.params.step=0;
X	gdctl.params.sectorsz=Size;
X	if (ioctl(f,GDSETA,&gdctl)==-1)
X		qperrorf("%s: ioctl GDGETA",me);
X	if (Debug)
X		shgdctl(&gdctl);
X	while ((len=read(f,buf,Size))==Size)
X		write(1,buf,Size);
X	if (len==-1)
X		perrorf("%s: read error",me);
X	close(f);
X}
X
Xstatic char *usage="Usage: %s [-{c}ylinders n] [-{i}nterleave n] [-{s}ectors n] [-{t}racks n] [-sector_si{z}e n]\n";
X
Xint main(argc,argv)
Xint argc;
Xchar *argv[];
X{
X	int opt;
X
X	(me=strrchr(argv[0],'/'))==NULL?me=argv[0]:me++;
X	while ((opt=getopt(argc,argv,"c:di:s:t:z:?"))!=EOF)
X		switch (opt) { /* optarg, optind */
X			case 'c':
X				Cyls=atoi(optarg);
X				break;
X			case 'd':
X				Debug=1;
X				break;
X			case 'i':
X				Intrl=atoi(optarg);
X				break;
X			case 's':
X				Sects=atoi(optarg);
X				break;
X			case 't':
X				Tracks=atoi(optarg);
X				break;
X			case 'z':
X				Size=atoi(optarg);
X				break;
X			case '?':
X			default:
X				fprintf(stderr,usage,me);
X				exit(1);
X		}
X	proc();
X}
END_OF_FILE
if test 2199 -ne `wc -c <'rflp.c'`; then
    echo shar: \"'rflp.c'\" unpacked with wrong size!
fi
# end of 'rflp.c'
fi
echo shar: End of shell archive.
exit 0