File:  [Research Unix] / researchv10no / cmd / worm / oscsi / scsi.cpio
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Tue Apr 24 17:21:34 2018 UTC (8 years, 1 month ago) by root
Branches: belllabs, MAIN
CVS tags: researchv10, HEAD
researchv10 Norman

0707070035050422111006660011710000040000010273220464714144700000700000003143README	This is a simple extensible shell (scsish) for poking at scsi
devices, particularly the simpler kinds commonly called toasters.
it is supposed to be self-documenting in use; try the help command.
my use of the moran-dronek /dev/scsi library is still imperfect;
there is still some some debugging showing.

	To compile, you first need mk. you then have to pick a system type
to set some flags; currently we support research and sgi.
yours may differ, particularly as no one else has our ansi C compiler for the sgi.
the only problem i would expect is the normal header file crap you get
mixing ansi and non-ansi files. i recommend setting NPROC=1 while debugging hdr files.
if you change (header) files, try putting them in the directory inc
(then others may benefit). To support a new system (say sgi-gcc), just create
a new file sgi-gcc.mk and so on. you may be missing some devices in
your /dev/scsi; the script scsi/gendev may help (but check the major/minor
numbers and permissions).

	As for modifying/extending scsish, it has been designed to be not too hard.
Adding a new device means adding a new set of rules (like the other rules)
to mkfile and creating a new directory (say exabyte) and at least two files in it
(dev.c and fns.h). The wren directory is a small example you can clone.
Adding new functions to any device means updating a file list in mkfile,
updating dev.c and fns.h in the device directory. The argument syntax
scheme is arguably pokey, but liveable. at some future point we should probably
switch over to osterhout's tcl.

	as always, i invite you send extensions/fixes etc back to
[email protected]
0707070035050453661006660011710000040000010451330457563432000000500000000565TODO	|	COPY drive NUMBER NUMBER drive NUMBER {/*:COPY sdrive sstart nblocks ddrive dstart:: */
			s_copy($2, $3, $4, $5, $6);
		}
	|	READ drive NUMBER  {
			struct scsi_ret output;
			s_read($2, $3, 1, &output);
			scsiodump(output.data, 1024);
		}
	|	WRITE drive NUMBER { s_write($2, $3, 1); }
	|	WRITE drive NUMBER NUMBER { s_write($2, $3, $4); } /*:WRITE drive start n:: */
0707070035050450521006660011710000040000010447750457563431100001300000002057allocate.c#include	<stddef.h>
#include	<stdio.h>
#include	<string.h>
#include	"scsi.h"
#include	"juke.h"

allocate(char *vol_id, char *buf)
{
	int drive, sh;
	char nbuf[512];
	
	if(j_rdshelves(buf))	/* read in shelf names */
		return(-1);
	if(j_getstatus(buf))	/* get the jukebox status */
		return(-1);
	sh = j_shelfof(vol_id);
	if(sh >= 0){
		sprintf(buf, "there is an existing '%s' on shelf %d", vol_id, sh);
		return(-1);
	}
	sh = j_shelfof(UNALLOCATED);
	if(sh < 0){
		sprintf(buf, "no unallocated disks");
		return(-1);
	}
	printf("using unallocated disk from shelf %d\n", sh);
	drive = min(nlun+1, NLUN-1);
	if(j_shelf_to_drive(sh, SIDEB, drive, buf) < 0)
		return(-1);
	sprintf(nbuf, "%sb", vol_id);
	if(j_wvolid(drive, nbuf, buf))
		return(-1);
	j_wrshelf = 1;
	j_shelf[sh] = strdup(vol_id);
	if(j_drive_to_shelf(drive, sh, SIDEB, buf) < 0)
		return(-1);
	if(j_shelf_to_drive(sh, SIDEA, drive, buf) < 0)
		return(-1);
	sprintf(nbuf, "%sa", vol_id);
	if(j_wvolid(drive, nbuf, buf))
		return(-1);
	if(j_drive_to_shelf(drive, sh, SIDEA, buf) < 0)
		return(-1);
	return(0);
}
0707070035050452321006660011710000040000010576150463130011500000700000007736cold.c#include	<stddef.h>
#include	<stdio.h>
#include	<string.h>
#include	"scsi.h"
#include	"juke.h"

static sort(char *buf);

cold_inv(char type, char *buf)
{
	Side side;
	int drive, sh, nsh;
	int n;
	char vol_id[512];
	int didit[NSHELF];

	if(j_getstatus(buf))	/* get the jukebox status */
		return(-1);
printf("getstatus done\n");
	/* first clear out nonexistent labels */
	n = 0;
	for(sh = 0; sh < NSHELF; sh++){
		if((j_status.shelf[sh]&0xC0) == 0xC0){
			n++;
			j_shelf[sh] = "there";
		} else
			j_shelf[sh] = 0;
		didit[sh] = 0;
	}
	printf("%d disks in shelves.\n", n);
	/* second, clear the drives */
	for(sh = 0; sh < NSHELF; sh++)
		if(j_shelf[sh] == 0)
			break;
	for(drive = 0; drive < 8; drive++){
		if(!j_status.lun[drive].diskin)
			continue;		/* no disk in drive */
printf("clearing drive %d:\n", drive);
		if(j_status.lun[drive].diskindrive && !j_status.lun[drive].shelfvalid){
			if(j_drive_to_shelf(drive, sh, SIDEA, buf))
				return(-1);
			for(sh++; sh < NSHELF; sh++)
				if(j_shelf[sh] == 0)
					break;
			n++;
		} else
			if(j_drive_to_shelf(drive, -1, SIDEA, buf))
				return(-1);
		printf("\n");
	}
	printf("reloading %d disks.\n", n);
	side = SIDEA;
	drive = min(nlun+1, NLUN-1);
	j_wrshelf = 1;
	for(sh = 0; sh < NSHELF; sh++){
		if(didit[sh])
			continue;
		j_shelf[sh] = 0;
		/* the C0 means disk properly present (not temp) */
		if((j_status.shelf[sh]&0xC0) == 0xC0){
			if(getvol(sh, drive, vol_id, &side))
				errexit(vol_id);
			switch(type)
			{
			case 'c':
				for(nsh = 0; j_shelf[nsh]; nsh++)
					;
				break;
			case 's':
			case 'r':
				while(j_shelf[nsh = nrand(NSHELF)])
					;
				break;
			case 'u':
			default:
				nsh = sh;
				break;
			}
			printf("%s@%d -> %d\n", vol_id, sh, nsh);
			if(j_drive_to_shelf(drive, nsh, side, buf) < 0)
				return(-1);
			j_shelf[nsh] = strdup(vol_id);
			didit[nsh] = 1;
			sleep(2);
		}
	}
	printf("process any new disks.\n");
	if(warm_inv(buf))
		return(-1);
	if(type == 's')
		return(sort(buf));
	return(0);
} 

getvol(int sh, int drive, char *vol_id, int *side)
{
	int i;
	char buf[512];

	if(j_shelf_to_drive(sh, SIDEA, drive, vol_id) < 0)
		return(-1);
	if((i = j_rvolid(drive, buf)) < 0)
		goto softerr;
	if(i == 0)
		*side = SIDEA;
	else {
		*side = SIDEB;
		if(j_drive_to_shelf(drive, sh, SIDEA, vol_id) < 0)
			return(-1);
		if(j_shelf_to_drive(sh, SIDEB, drive, vol_id) < 0)
			return(-1);
		if((i = j_rvolid(drive, buf)) < 0)
			goto softerr;
	}
	if(i > 0)
		strcpy(vol_id, UNALLOCATED);
	else {
		strcpy(vol_id, buf);
		i = strlen(vol_id)-1;
		if(i < 0){
			sprintf(buf, "apparently good superblock but null vol_id");
			goto softerr;
		} else if(vol_id[i] == 'a')
			vol_id[i] = 0;
		else if(vol_id[i] == 'b'){
			vol_id[i] = 0;
			*side = !*side;
		} else {
			sprintf(buf, "vol_id '%s' must end in a or b", vol_id);
			strcpy(vol_id, buf);
			return(-1);
		}
	}
	return(0);
softerr:
	*side = SIDEA;
	fprintf(stderr, "error in reading shelf %d: %s; proceeding\n", sh, buf);
	sprintf(vol_id, "DISK_ERROR%d", sh);
	gen_reset(0, (int *)0, 0, (char **)0, buf);
	return(0);
}

static int index[NSHELF];
static
cmp(int *a, int *b)
{
	char *sa = j_shelf[*a], *sb = j_shelf[*b];

	if((sa == 0) && (sb == 0)) return(0);
	if(sa == 0) return(-1);
	if(sb == 0) return(1);
	return(strcmp(sa, sb));
}

static char *disk[8];

static
sd(int a, int b, char *err)
{
	disk[b] = j_shelf[a];
	return(j_shelf_to_drive(a, SIDEB, b, err));
}
static
ds(int a, int b, char *err)
{
	j_shelf[b] = disk[a];
	return(j_drive_to_shelf(a, b, SIDEB, err));
}

static
sort(char *errbuf)
{
	int i, j, org;

	for(i = 0; i < NSHELF; i++)
		index[i] = i;
	qsort(index, NSHELF, sizeof index[0], cmp);
	for(i = 0; i < NSHELF; i++){
		if(index[i] < 0) continue;
		if(sd(org = i, NLUN-1, errbuf) < 0)
			return(-1);
		j = index[i];
		index[i] = -1;
		while(j != org){
			if(sd(j, NLUN-2, errbuf) < 0)
				return(-1);
			if(ds(NLUN-2, i, errbuf) < 0)
				return(-1);
			i = j;
			if(index[i] < 0)
				break;
			j = index[i];
			index[i] = -1;
		}
		if(ds(NLUN-1, i, errbuf) < 0)
			return(-1);
	}
	return(0);
}
0707070035050513661006440011710000040000010044130464677201700001000000027722dslib.c/*
|| dslib.c - library routines for /dev/scsi
||
|| Copyright 1988, 1989, by
||   Gene Dronek (Vulcan Laboratory) and
||   Rich Morin  (Canta Forda Computer Laboratory).
|| All rights reserved.
*/
#ident	"dslib.c: $Revision: 1.1.1.1 $"

#include <stdio.h>
#include <sys/types.h>

#include "dslib.h"
#ifdef aux
#include <sys/vio.h>
#include <sys/scsireq.h>
#endif aux

int dsdebug=0;
long dsreqflags;	/* flag bits always set by filldsreq */

#define min(i,j)  ( (i) < (j) ? (i) : (j) )


/*
|| Startup/shutdown -----------------------------------------------
*/

static struct context *dsc[FDSIZ];


/*
|| dsopen - open device, set up structures
*/

struct dsreq *
dsopen(opath, oflags)
  char *opath;
  int   oflags;
{
    
  struct dsreq *dsp;
  struct context *cp;
  int fd;
  DSDBG(fprintf(stderr,"dsopen(%s,%x) ", opath, oflags));

  fd = open(opath, oflags);
  if (fd < 0)						
    return NULL;  			/* can't open	*/
  if (dsc[fd] != NULL)		        /* already in use */
    ds_zot("dsopen: fd already in use");

  cp = (struct context *) calloc(1, sizeof(struct context));
  if (cp == NULL)				      /* can't allocate	*/
    ds_zot("dsopen: can't allocate space");
  dsc[fd] = cp;
  cp->dsc_fd = fd;
  dsp = &(cp->dsc_dsreq);

  dsp->ds_flags =	0;
  dsp->ds_time =	10 * 1000;	/* 10 second default timeout */
  dsp->ds_private =	(ulong) cp;	/* pointer back to context */
  dsp->ds_cmdbuf = 	cp->dsc_cmd;
  dsp->ds_cmdlen = 	sizeof cp->dsc_cmd;
  dsp->ds_databuf = 	0;
  dsp->ds_datalen = 	0;
  dsp->ds_sensebuf =	cp->dsc_sense;
  dsp->ds_senselen = 	sizeof cp->dsc_sense;
  DSDBG(fprintf(stderr,"=>cp %x, dsp %x\n", cp, dsp));
  return dsp;
}


/*
|| dsclose - close device, release context struct.
*/

dsclose(dsp)
  struct dsreq *dsp;
{
  int fd;
  struct context *cp;

  if (dsp == NULL)
    ds_zot("dsclose: dsp is NULL");

  cp = (struct context *)dsp->ds_private;
  fd = getfd(dsp);
  if ( cp == NULL )
    ds_zot("dsclose: private is NULL");

  cfree(cp);
  dsc[fd] = (struct context *)NULL;
  return;
}


/*
|| Generic SCSI CCS Command functions ------------------------------------
||
|| dsp		dsreq pointer
|| data		data buffer pointer
|| datalen	data buffer length
|| lba		logical block address
|| vu		vendor unique bits
*/

/*
|| testunitready00 - issue group 0 "Test Unit Ready" command (0x00)
*/

testunitready00(dsp)
  struct dsreq *dsp;
{
  fillg0cmd(dsp, CMDBUF(dsp), G0_TEST, 0, 0, 0, 0, 0);
  filldsreq(dsp, 0, 0, DSRQ_READ|DSRQ_SENSE);
  return(doscsireq(getfd(dsp), dsp));
}


/*
|| requestsense03 - issue group 0 "Request Sense" command (0x03)
*/

requestsense03(dsp, data, datalen, vu)
  struct dsreq *dsp;
  caddr_t data;
  long datalen;
  char vu;
{
  fillg0cmd(dsp, CMDBUF(dsp), G0_REQU, 0, 0, 0, B1(datalen), B1(vu<<6));
  filldsreq(dsp, data, datalen, DSRQ_READ);
  return(doscsireq(getfd(dsp), dsp));
}


/*
|| write0a - issue group 0 "Write" command (0x0a)
*/

write0a(dsp, data, datalen, lba, vu)
  struct dsreq *dsp;
  caddr_t data;
  long datalen, lba;
  char vu;
{
  fillg0cmd(dsp, CMDBUF(dsp), G0_WRIT, B3(lba), B1(datalen), B1(vu<<6));
  filldsreq(dsp, data, datalen, DSRQ_READ);
  return(doscsireq(getfd(dsp), dsp));
}


/*
|| inquiry12 - issue group 0 "Inquiry" command (0x12)
*/

inquiry12(dsp, data, datalen, vu)
  struct dsreq *dsp;
  caddr_t data;
  long datalen;
  char vu;
{
  fillg0cmd(dsp, CMDBUF(dsp), G0_INQU, 0, 0, 0, B1(datalen), B1(vu<<6));
  filldsreq(dsp, data, datalen, DSRQ_READ|DSRQ_SENSE);
  return(doscsireq(getfd(dsp), dsp));
}


/*
|| modeselect15 - issue group 0 "Mode Select" command (0x15)
||
|| save		0 - don't save saveable pages
|| 		1 - save saveable pages
*/

modeselect15(dsp, data, datalen, save, vu)
  struct dsreq *dsp;
  caddr_t data;
  long datalen;
  char save, vu;
{
  fillg0cmd(dsp, CMDBUF(dsp), G0_MSEL, save&1, 0, 0, B1(datalen), B1(vu<<6));
  filldsreq(dsp, data, datalen, DSRQ_WRITE|DSRQ_SENSE);
  return(doscsireq(getfd(dsp), dsp));
}


/*
|| modesense1a - issue group 0 "Mode Sense" command (0x1a)
||
|| pagectrl	0 - current values
||		1 - changeable values
||		2 - default values
||		3 - saved values
||
|| pagecode	0   - vendor unique
||		1   - error recovery
||		2   - disconnect/reconnect
||		3   - direct access dev. fmt.
||		4   - rigid disk geometry
||		5   - flexible disk
||		6-9 - see specific dev. types
||		0a  - implemented options
||		0b  - medium types supported
||		3f  - return all pages
*/

modesense1a(dsp, data, datalen, pagectrl, pagecode, vu)
  struct dsreq *dsp;
  caddr_t data;
  long datalen;
  char pagectrl, pagecode, vu;
{
  fillg0cmd(dsp, CMDBUF(dsp), G0_MSEN, 0x10,
    ((pagectrl&3)<<6) | (pagecode&0x3F),
    0, B1(datalen), B1(vu<<6));
  filldsreq(dsp, data, datalen, DSRQ_READ|DSRQ_SENSE);
  return(doscsireq(getfd(dsp), dsp));
}


/*
|| senddiagnostic1d - issue group 0 "Send Diagnostic" command (0x1d)
||
|| self		0 - run test, hold results
||		1 - run test, return status
||
|| dofl		0 - device online
||		1 - device offline
||
|| uofl		0 - unit online
||		1 - unit offline
*/

senddiagnostic1d(dsp, data, datalen, self, dofl, uofl, vu)
  struct dsreq *dsp;
  caddr_t data;
  long datalen;
  char self, dofl, uofl, vu;
{
  fillg0cmd(dsp, CMDBUF(dsp), G0_MSEN,
    (self&1)<<2 | (dofl&1)<<1 | (uofl&1),
    0, B2(datalen), B1(vu<<6));
  filldsreq(dsp, data, datalen, DSRQ_READ|DSRQ_SENSE);
  return(doscsireq(getfd(dsp), dsp));
}


/*
|| readcapacity25 - issue group 1 "Read Capacity" command (0x25)
||
|| pmi		0 - return last logical block, entire unit
||		1 - return last logical block, current track
*/

readcapacity25(dsp, data, datalen, lba, pmi, vu)
  struct dsreq *dsp;
  caddr_t data;
  long datalen, lba;
  char pmi, vu;
{
  fillg1cmd(dsp, CMDBUF(dsp), G1_RCAP, 0, B4(lba), 0, 0, pmi&1, B1(vu<<6));
  filldsreq(dsp, data, datalen, DSRQ_READ|DSRQ_SENSE
    /* |DSRQ_CTRL2 */ );
  /* dsp->ds_time = 100;	/* often takes a while */
  return(doscsireq(getfd(dsp), dsp));
}


/*
|| readextended28 - issue group 1 "Read Extended" command (0x28)
*/

readextended28(dsp, data, datalen, lba, vu)
  struct dsreq *dsp;
  caddr_t data;
  long datalen, lba;
  char vu;
{
  fillg1cmd(dsp, CMDBUF(dsp), G1_READ, 0, B4(lba), 0, B2(datalen), B1(vu<<6));
  filldsreq(dsp, data, datalen, DSRQ_READ|DSRQ_SENSE
    /* |DSRQ_CTRL2 */ );
  /* dsp->ds_time = 100;	/* often takes a while */
  return(doscsireq(getfd(dsp), dsp));
}


/*
|| writeextended2a - issue group 1 "Write Extended" command (0x2a)
*/

writeextended2a(dsp, data, datalen, lba, vu)
  struct dsreq *dsp;
  caddr_t data;
  long datalen, lba;
  char vu;
{
  fillg1cmd(dsp, CMDBUF(dsp), G1_WRIT, 0, B4(lba), 0, B2(datalen), B1(vu<<6));
  filldsreq(dsp, data, datalen, DSRQ_READ|DSRQ_SENSE
    /* |DSRQ_CTRL2 */ );
  /* dsp->ds_time = 100;	/* often takes a while */
  return(doscsireq(getfd(dsp), dsp));
}


/*
|| Support functions ----------------------------------------------------
*/

/*
|| fillg0cmd - Fill a Group 0 command buffer
*/

fillg0cmd(dsp, cmd, b0,b1,b2,b3,b4,b5)
  struct dsreq *dsp;
  uchar_t *cmd, b0,b1,b2,b3,b4,b5;
{
  uchar_t *c = cmd;
  DSDBG(fprintf(stderr,"fillg0cmd(%x,%x, %02x %02x %02x %02x %02x %02x)\n",
		dsp, cmd, b0,b1,b2,b3,b4,b5));
  *c++ = b0, *c++ = b1, *c++ = b2, *c++ = b3, *c++ = b4, *c++ = b5;
	
  CMDBUF(dsp) = (caddr_t) cmd;
  CMDLEN(dsp) = 6;
}


/*
|| fillg1cmd - Fill a Group 1 command buffer
*/

fillg1cmd(dsp, cmd, b0,b1,b2,b3,b4,b5,b6,b7,b8,b9)
  struct dsreq *dsp;
  uchar_t *cmd, b0,b1,b2,b3,b4,b5,b6,b7,b8,b9;
{
  uchar_t *c = cmd;
  DSDBG(fprintf(stderr,
    "fillg1cmd(%x,%x, %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x)\n",
		dsp, cmd, b0,b1,b2,b3,b4,b5,b6,b7,b8,b9));

  *c++ = b0, *c++ = b1, *c++ = b2, *c++ = b3, *c++ = b4, *c++ = b5;
  *c++ = b6, *c++ = b7, *c++ = b8, *c++ = b9;
	
  CMDBUF(dsp) = (caddr_t) cmd;
  CMDLEN(dsp) = 10;
}


/*
|| filldsreq - Fill a dsreq structure
*/

filldsreq(dsp,data,datalen,flags)
  struct dsreq		*dsp;
  uchar_t		*data;
{
  DSDBG(fprintf(stderr,"filldsreq(%x,%x,%d,%x) cmdlen %d\n",
		dsp,data,datalen,flags,CMDLEN(dsp)));
  dsp->ds_flags	= flags | dsreqflags |
	  (((dsdebug&1) ? DSRQ_TRACE : 0) |
	  ((dsdebug&2) ? DSRQ_PRINT : 0));
  dsp->ds_time	= 10 * 1000;	/* default to 10 seconds */
  dsp->ds_link	= 0;
  dsp->ds_synch	= 0;
  dsp->ds_ret  	= 0;

  DATABUF(dsp) 	= (caddr_t) data;
  DATALEN(dsp)	= datalen;
}


/*
|| bprint - print array of bytes, in hex.
*/

#define hex(x) "0123456789ABCDEF" [ (x) & 0xF ]

bprint(s,n,nperline,space)
	char *s;
{
	int   i, x;
	char  *sp = (space) ? " ": "";

	for(i=0;i<n;i++)  {
		x = s[i];
		fprintf(stderr,((i%4==3)?"%c%c%s%s":"%c%c%s"),
			hex(x>>4), hex(x), sp, sp);
		if ( i%nperline == (nperline - 1) )
			fprintf(stderr,"\n");
	}
	if ( space )
		fprintf(stderr,"\n");
}


/*
|| doscsireq - issue scsi command, return status or -1 error.
*/

doscsireq( fd, dsp)
  int	fd;		/* ioctl file descriptor */
  struct dsreq *dsp;	/* devscsi request packet */
{
  int	cc;
  int	retries = 4;
  uchar_t	sbyte;

  DSDBG(fprintf(stderr,"doscsireq(%d,%x) %x ---- %s\n",fd,dsp,
    (CMDBUF(dsp))[0],
    ds_vtostr( (CMDBUF(dsp))[0], cmdnametab)));

  /*
   *  loop, issuing command
   *    until done, or further retry pointless
   */

  while ( --retries > 0 )  {

   caddr_t sp;

    sp =  SENSEBUF(dsp);
    DSDBG(fprintf(stderr,"cmdbuf   =  ");
		bprint(CMDBUF(dsp),CMDLEN(dsp),16,1));
    if ( (dsp->ds_flags & DSRQ_WRITE) )
      DSDBG(bprint( DATABUF(dsp), min(50,DATALEN(dsp)),16,1 ));
  	
DSDBG(fprintf(stderr,"databuf datalen %x %d\n",DATABUF(dsp), DATALEN(dsp)));
    cc = ioctl( fd, DS_ENTER, dsp);
    if ( cc < 0)  {
      ds_panic(dsp, "cannot ioctl fd %d\n",fd);
    }
  	
	DSDBG(fprintf(stderr,"cmdlen after ioctl=%d\n",CMDLEN(dsp)));
    DSDBG(fprintf(stderr,"ioctl=%d ret=%x %s",
      cc, RET(dsp), 
      RET(dsp) ? ds_vtostr(RET(dsp),dsrtnametab) : ""));
    DSDBG(if (SENSESENT(dsp)) fprintf(stderr," sensesent=%d",
      SENSESENT(dsp)));

    DSDBG(fprintf(stderr,
      " cmdsent=%d datasent=%d sbyte=%x %s\n",
      CMDSENT(dsp), DATASENT(dsp), STATUS(dsp),
      ds_vtostr(STATUS(dsp), cmdstatustab)));
    DSDBG(if ( FLAGS(dsp) & DSRQ_READ )
      bprint( DATABUF(dsp), min(16*16,DATASENT(dsp)), 16,1));

#ifdef aux
  /*
   *  check for AUX bus-error 
   *  we retry with poll-dma
   */
    if ( RET(dsp) == DSRT_AGAIN )  {
      int n = SDC_RDPOLL|SDC_WRPOLL;
      DSDBG(fprintf(stderr,"setting rd/wr-poll"));
      cc = ioctl( fd, DS_SET, n);	/* set bits */
      if ( cc != 0 )
        return -1;
    }
#endif aux

    if ( RET(dsp) == DSRT_NOSEL )
      continue;		/* retry noselect 3X */

    /* decode sense data returned */
    if ( SENSESENT(dsp) )  {
      DSDBG(
        fprintf(stderr, "sense key %x - %s\n",
          SENSEKEY(sp),
          ds_vtostr( SENSEKEY(sp), sensekeytab));
        bprint( SENSEBUF(dsp),
          min(100, SENSESENT(dsp)),
          16,1);
      );
    }
    DSDBG(fprintf(stderr, "sbyte %x\n", STATUS(dsp)));

    /* decode scsi command status byte */
    sbyte = STATUS(dsp);
    switch (sbyte)  {
      case 0x08:		/*  BUSY */
      case 0x18:		/*  RESERV CONFLICT */
    	sleep(2);
    	continue;
      case 0x00:		/*  GOOD */
      case 0x02:		/*  CHECK CONDITION */
      case 0x10:		/*  INTERM/GOOD */
      default:
    	return sbyte;
    }
  }
  return -1;	/* fail retry limit */
}


/*
|| opttovar - lookup option in table, return var addr (NULL if fail)
*/

int *
opttovar( ostr, table)
  char *ostr;
  struct opttab{
    char *opt;
    int  *var;
  } *table;
{
  register struct opttab *tp;

  for (tp=table; (tp->var); tp++)
    if ( strncmp( ostr, tp->opt, 3) == 0 )
      break;

  if ( !tp->var )
    fprintf(stderr,"unknown option %s", ostr);
	
  return (tp->var);
}


/*
|| ds_vtostr - lookup value in table to return string pointer
*/

char *
ds_vtostr( v, table)
  long v;
  struct vtab *table;
{
  register struct vtab *tp;

  for (tp=table; (tp->string); tp++)
    if ( v == tp->val )
      break;
	
  return (tp->string) ? tp->string : "";
}


/*
|| ds_panic - yelp, leave...
*/

ds_panic( fmt, v)
  char *fmt;
  int v;
{
  extern errno;

  fprintf(stderr,fmt,v);
  fprintf(stderr,"\nerrno = %d\n",errno);
  exit(1);
}


/*
|| ds_zot - go away, with a message.
*/

ds_zot(message)
  char *message;
{
  fprintf(stderr, "%s\n", message);
  exit(1);
}
0707070035050453640407770011710000040000020451370464700560700001000000000000generic0707070035050453631006660011710000040000010255410464713532400001600000002147generic/dev.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

static int gen_id(int, int *, int, char **, char *);

static Function fns[] = {
	{ "capacity", "capacity [lun=0]", "L?", gen_capacity },
	{ "display", "display", "", gen_display },
	{ "dev", "dev [type] # dev ? for list", "S?", gen_dev },
	{ "help", "help [cmd]", "S?", gen_help },
	{ "id", "id [target=0]", "L?", gen_id },
	{ "inq", "inq [lun=0]", "L?", gen_inq },
	{ "readt", "readt count [lun=0]", "IL?", gen_readt },
	{ "reset", "reset", "", gen_reset },
	{ "scsi", "scsi bytes... # 6 or 10", "I?I?I?I?I?I?I?I?I?I?", gen_scsi },
	{ "sense", "sense [lun=0]", "L?", gen_sense },
	{ "start", "start [lun=0]", "L?", gen_start },
	{ "stop", "stop [lun=0]", "L?", gen_stop },
	{ "testunit", "testunit [lun=0", "L?", gen_tur },
	{ 0 }
};

Device genericdev = {
	"scsi", "generic scsi",
	gen_extsense,
	fns
};

static int
gen_id(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
#pragma ref ncargs
#pragma ref cargs
#pragma ref err

	if(niargs == 0)
		printf("current SCSI id = %d\n", s_id);
	else
		scsi_target(iargs[0]);
	return(0);
}
0707070035050453621006660011710000040000010255560464677353600001600000002107generic/inq.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

char *gen_rmb[2] = { "nonremovable", "removable" };
char *gen_devtype[256] = {
	"direct access",
	"sequential access",
	"printer",
	"processor",
	"worm",
	"cd-rom"
};

int
gen_inq(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n, i;

#pragma ref ncargs
#pragma ref cargs

	if(niargs == 0)
		for(niargs = 0; niargs < 8; niargs++)
			iargs[niargs] = niargs;
	for(i = 0; i < niargs; i++){
		set6(cmd, 0x12, iargs[i]<<5, 0, 0, 36, 0);
		if(n = s_io(0, &cmd, 0, &ret, -36, err))
			return(n);
		printf("inq(%d,%d): %s %s;", s_id, iargs[i],
			gen_rmb[ret.data[1]>>7], gen_devtype[ret.data[0]]);
		if(ret.data[4] >= 16){
			char buf[256];

			fixedstr(&ret.data[8], 8, buf);
			printf(" %s", buf);
			if(ret.data[4] >= 32){
				fixedstr(&ret.data[16], 16, buf);
				printf("/%s", buf);
				if(ret.data[4] >= 36){
					fixedstr(&ret.data[32], 4, buf);
					printf(" rev=%s", buf);
				}
			}
		}
		printf(" [%d bytes]\n", ret.data[4]);
	}
	return(0);
}
0707070035050453611006660011710000040000011500150464667004700002000000002650generic/sense.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

int
gen_sense(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n;

#pragma ref ncargs
#pragma ref cargs

	if(niargs == 0)
		iargs[0] = 0;
	set6(cmd, 0x03, iargs[0]<<5, 0, 0, 4, 0);
	if(n = s_io(0, &cmd, 0, &ret, 4, err))
		return(n);
	printf("sense(%d,%d): ", s_id, iargs[0]);
	if((ret.data[0]&0x7F) == 0)
		printf("no error\n");
	else {
		printf("error class=0x%x, code=0x%x, sense=0x%x",
			(ret.data[0]>>4)&7, ret.data[0]&0xF, ret.data[2]&0xF);
		if(ret.data[0]&0x80)
			printf(", addr=0x%x", ret.data[3]+256L*ret.data[2]+256L*256*ret.data[1]);
		printf("\n");
	}
	return(0);
}

static char *exstab[16] =
{
	"no sense",
	"recovered error",
	"not ready",
	"medium error",
	"hardware error",
	"illegal request",
	"unit attention",
	"data protect",
	"blank check",
	"vendor specific (#9)",
	"copy aborted",
	"aborted command",
	"equal",
	"volume overflow",
	"miscompare",
	"reserved (#f)",
};

void
gen_extsense(uchar *data, char *dest, int ndata)
{
	int class;

	class = (data[0]>>4)&7;
	if(class == 7){
		if(data[0]&0x80)
			sprintf(dest, "extended sense: %s info=#%2.2x#%2.2x#%2.2x#%2.2x", exstab[data[2]&0xF], data[3], data[4], data[5], data[6]);
		else
			sprintf(dest, "extended sense: %s", exstab[data[2]&0xF]);
	} else {
		sprintf(dest, "sense: class=#%x, code=#%x", class, data[0]&0xF);
	}
}
0707070035050453571006660011710000040000010451570457563432000002000000000613generic/start.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

int
gen_start(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n;

#pragma ref ncargs
#pragma ref cargs

	if(niargs == 0)
		iargs[0] = 0;
	set6(cmd, 0x1B, iargs[0]<<5, 0, 0, 1, 0);
	if(n = s_io(0, &cmd, 0, &ret, 0, err))
		return(n);
	return(0);
}
0707070035050453561006660011710000040000010451730457563432000001700000000612generic/stop.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

int
gen_stop(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n;

#pragma ref ncargs
#pragma ref cargs

	if(niargs == 0)
		iargs[0] = 0;
	set6(cmd, 0x1B, iargs[0]<<5, 0, 0, 0, 0);
	if(n = s_io(0, &cmd, 0, &ret, 0, err))
		return(n);
	return(0);
}
0707070035050453551006660011710000040000010451750457563432000002300000001115generic/capacity.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

int
gen_capacity(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n;
	unsigned long ns, ss;

#pragma ref ncargs
#pragma ref cargs

	if(niargs == 0)
		iargs[0] = 0;
	set10(cmd, 0x25, iargs[0]<<5, 0, 0, 0, 0, 0, 0, 0, 0);
	if(n = s_io(0, &cmd, 0, &ret, 8, err))
		return(n);
	ns = longat(&ret.data[0]);
	ss = longat(&ret.data[4]);
	printf("capacity(%d,%d): %ld blocks of %ld bytes (#%xx#%x)\n", s_id, iargs[0],
		ns, ss, ns, ss);
	return(0);
}
0707070035050453541006660011710000040000010451770457563432000002200000002323generic/display.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

extern char *gen_rmb[2];
extern char *gen_devtype[256];

int
gen_display(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n, i, old_id;
	int retv = 0;
	char rev[100], vendor[100], product[100];

#pragma ref niargs
#pragma ref iargs
#pragma ref ncargs
#pragma ref cargs

	old_id = s_id;
	for(s_id = 0; s_id < 8; s_id++){
		printf("target %d:\n");
		set6(cmd, 0x00, 0, 0, 0, 0, 0);
		if(s_io(0, &cmd, 0, &ret, 0, err))
			continue;
	printf("responded to test unit ready\n");
	continue;
		for(i = 0; i < 8; i++){
			set6(cmd, 0x12, i<<5, 0, 0, 36, 0);
			if(n = s_io(0, &cmd, 0, &ret, -36, err)){
				retv = n;
				break;
			}
			if(ret.nread >= 16)
				fixedstr(&ret.data[8], 8, vendor);
			else
				sprintf(vendor, "??");
			if(ret.nread >= 32)
				fixedstr(&ret.data[16], 16, product);
			else
				sprintf(product, "??");
			if(ret.nread >= 16)
				fixedstr(&ret.data[32], 4, rev);
			else
				sprintf(vendor, "??");
			printf("\tlun(%d): %s %s, %s/%s rev=%s\n", i,
				gen_rmb[ret.data[1]>>7], gen_devtype[ret.data[0]],
				vendor, product, rev);
		}
	}
	s_id = old_id;
	return(retv);
}
0707070035050453531006660011710000040000011504230464700546400002000000000753generic/reset.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"
#include	<scsi.h>

int
gen_reset(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;

#pragma ref niargs
#pragma ref iargs
#pragma ref ncargs
#pragma ref cargs

	set6(cmd, 0, 0, 0, 0, 0, 0);
	cmd.bus_id = s_id;
	cmd.flags |= SCSI_RESET | SCSI_BRESET;
	/* should probably test for some kind of error... */
	ss_io(0, &cmd, 0, &ret, 0, err);
	return(0);
}
0707070035050453521006660011710000040000010452030457563432100001600000000674generic/tur.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

int
gen_tur(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n;

#pragma ref ncargs
#pragma ref cargs

	if(niargs == 0)
		iargs[0] = 0;
	set6(cmd, 0x00, iargs[0]<<5, 0, 0, 0, 0);
	if(n = s_io(0, &cmd, 0, &ret, 0, err))
		return(n);
	printf("(%d,%d): good status\n", s_id, iargs[0]);
	return(0);
}
0707070035050453511006660011710000040000010452040457563432100001700000001215generic/scsi.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

int
gen_scsi(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n;

#pragma ref ncargs
#pragma ref cargs

	switch(niargs)
	{
	case 6:
		set6(cmd, iargs[0], iargs[1], iargs[2], iargs[3], iargs[4], iargs[5]);
		break;
	case 10:
		set10(cmd, iargs[0], iargs[1], iargs[2], iargs[3], iargs[4], iargs[5], iargs[6], iargs[7], iargs[8], iargs[9]);
		break;
	default:
		sprintf(err, "number of bytes (%d) must be 6 or 10\n", niargs);
		return(1);
	}
	if(n = s_io(0, &cmd, 0, &ret, 0, err))
		return(n);
	return(0);
}
0707070035050453501006660011710000040000010255540464677346100001600000001234generic/fns.hextern int gen_inq(int, int *, int, char **, char *);
extern int gen_dev(int, int *, int, char **, char *);
extern int gen_help(int, int *, int, char **, char *);
extern int gen_sense(int, int *, int, char **, char *);
extern int gen_start(int, int *, int, char **, char *);
extern int gen_stop(int, int *, int, char **, char *);
extern int gen_capacity(int, int *, int, char **, char *);
extern int gen_display(int, int *, int, char **, char *);
extern int gen_reset(int, int *, int, char **, char *);
extern int gen_tur(int, int *, int, char **, char *);
extern int gen_scsi(int, int *, int, char **, char *);
extern int gen_readt(int, int *, int, char **, char *);
0707070035050513641006660011710000040000010255520464677343300002000000002007generic/readt.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

int
gen_readt(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n, i;
	unsigned long ns, ss;
	long bs, addr;
	long t1, t2;

#pragma ref ncargs
#pragma ref cargs

	if(niargs == 1)
		iargs[1] = 0;
	set10(cmd, 0x25, iargs[1]<<5, 0, 0, 0, 0, 0, 0, 0, 0);
	if(n = s_io(0, &cmd, 0, &ret, 8, err))
		return(n);
	ns = longat(&ret.data[0]);
	ss = longat(&ret.data[4]);
	bs = ss? sizeof(ret.data)/ss : 1;
	time(&t1);
	srand(t1);
	addr = nrand(ns-iargs[0])-1;
	printf("read(%d,%d): %d blocks @%d (chunk=%dx%d),", s_id, iargs[1], iargs[0], addr, bs, ss);
	fflush(stdout);
	time(&t1);
	for(i = iargs[0]; i > 0; i -= bs){
		set10(cmd, 0x28, iargs[1]<<5, addr>>24, addr>>16, addr>>8, addr,
			0, 0, bs*0, 0);
		if(n = s_io(0, &cmd, 0, &ret, bs*ss, err))
			return(n);
		addr += bs;
	}
	time(&t2);
	printf(" t=%ds (%.0fKB/s)\n", t2-t1, (iargs[0]*(float)ss/1024.)/((t1 == t2)? 1:t2-t1));
	return(0);
}
0707070035050450541006660011710000040000010253650464677245500001400000001727getstatus.c#include	<stddef.h>
#include	<stdio.h>
#include	"scsi.h"
#include	"juke.h"

struct Jstatus j_status;

static
dolun(struct Lunstatus *lun, uchar *u)
{
	lun->poweron = ((*u)&0x80) == 0;
	lun->diskin = ((*u)&0x40) != 0;
	lun->ready = ((*u)&0x01) != 0;
	u++;
	lun->diskindrive = ((*u)&0x80) != 0;
	lun->driveshelf = (*u)&0x7F;
	u++;
	lun->shelfvalid = ((*u)&0x80) != 0;
	lun->retshelf = (*u)&0x7F;
}

j_getstatus(char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int i;

	set6(cmd, 0x1D, 0, 0, 0, 10, 0);
	memset(cmd.data, 0, 10);
	cmd.data[0] = 0xE2;
	if(s_io(1, &cmd, 10, &ret, 0, err))
		return(-1);
	set6(cmd, 0x1C, 0, 0, 0, 128, 0);
	if(s_io(0, &cmd, 0, &ret, 128, err))
		return(-1);
	for(i = 0; i < 8; i++)
		dolun(&j_status.lun[i], &ret.data[16+4*i]);
	for(i = 0; i < NSHELF; i++)
		j_status.shelf[i] = ret.data[48+i];
	j_status.iounit = ret.data[98];
	j_status.carrier = ret.data[99];
	j_status.udrive = ret.data[100];
	j_status.ldrive = ret.data[101];
	return(0);
}
0707070035050422060407770011710000040000020273120464713312700000400000000000inc0707070035050422051006660011710000040000010273140464713312700001300000000247inc/scsi.h#define	SCSI_WR		0x80
#define	SCSI_RD		0x40
#define	SCSI_BRESET	0x20
#define	SCSI_RESET	0x10
#define	SCSI_SENSE	0x08
#define	SCSI_LTMOUT	0x04


#define	SCSI_CERR	0x01
0707070035050450411006660011710000040000010450110457563431200001200000002035iodr_sh.c#include	"scsi.h"
#include	"juke.h"

j_shelf_to_drive(int sh, Side side, int dr, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;

	set6(cmd, 0xD6, dr<<5, 0, (sh<<1)|side, 0, 0);
	return(s_io(0, &cmd, 0, &ret, 0, err));
}

j_drive_to_shelf(int dr, int sh, Side side, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;

	if(sh < 0)
		set6(cmd, 0xD7, dr<<5, 0, 0, 0, 0);
	else
		set6(cmd, 0xD7, (dr<<5)|1, 0, (sh<<1)|side, 0, 0);
	return(s_io(0, &cmd, 0, &ret, 0, err));
}

int
j_empty_drive(long tlimit, char *buf)
{	
	int i, tstop;
	
	tstop = time((long *)0) + tlimit;
	while(time((long *)0) <= tstop){
		setnlun();		/* in case it changes */
		/* look for empty drives */
		for(i = 0; i < nlun; i++)
			if(!j_status.lun[i].diskin)
				return(i);
		/* look for spun down drives */
		for(i = 0; i < nlun; i++){
			if(!j_status.lun[i].ready){
				if(j_drive_to_shelf(i, -1, SIDEA, buf))
					return(-1);
				else
					return(i);
			}
		}
		sleep(10);
		if(j_getstatus(buf))	/* get the jukebox status */
			return(-1);
	}
	return(-1);
}
0707070035050450401006660011710000040000010450120457563431300001400000002643ioshelves.c#include	<stddef.h>
#include	<stdio.h>
#include	<string.h>
#include	"scsi.h"
#include	"juke.h"

char *j_shelf[NSHELF];
int j_wrshelf = 0;

j_rdshelves(char *err)
{
	FILE *fp;
	static haveread = 0;
	int shno;
	char vname[256];

	if(haveread)
		return(0);
	for(shno = 0; shno < NSHELF; shno++)
		j_shelf[shno] = 0;
	if((fp = fopen(JUKEDIR, "r")) == NULL){
		pperror(err, JUKEDIR);
		return(-1);
	}
	while(fscanf(fp, "%d %s\n", &shno, vname) == 2){
		if((shno < 0) || (shno >= NSHELF)){
		fprintf(stderr, "Warning: bad shelf number in %s: %d (vol_id=%s)\n",
				JUKEDIR, shno, vname);
			continue;
	    	
		}
		j_shelf[shno] = strdup(vname);
	}
	fclose(fp);
	haveread = 1;
	return(0);
}

j_wrshelves(char *err)
{
	FILE *fp;
	int shno;

	if((fp = fopen(JUKEDIR, "w")) == NULL){
		pperror(err, JUKEDIR);
		return(-1);
	}
	for(shno = 0; shno < NSHELF; shno++)
		if(j_shelf[shno])
			fprintf(fp, "%d %s\n", shno, j_shelf[shno]);
	fclose(fp);
	return(0);
}

int
j_shelfof(char *vol_id)
{
	int i;
	char buf[512];

	for(;;){
		for(i = 0; i < NSHELF; i++)
			if(j_shelf[i] && (strcmp(j_shelf[i], vol_id) == 0))
				return(i);
		if((i = warm_inv(buf)) <= 0)
			break;
	}
	if(i < 0)
		fprintf(stderr, "jukebox: %s\n", buf);
	return(-1);
}

int
j_driveof(char *vol_id)
{
	int i, sh;

	if((sh = j_shelfof(vol_id)) < 0)
		return(-1);
	for(i = 0; i < NLUN; i++)
		if(j_status.lun[i].shelfvalid && (j_status.lun[i].retshelf == sh))
			return(i);
	return(-1);
}
0707070035050452251006660011710000040000010447370457563430700000700000004561juke.3.TH INTERNAL 3
.CT 2 file_io
.SH NAME
jukebox routines
.tr %"
.SH SYNOPSIS
.B "#include %hdr.h%"
.PP
.tr %%
.B "int j_shelf_to_drive(int sh, Side side, int dr, char *err)"
.PP
.B "int j_drive_to_shelf(int dr, int sh, Side side, char *err)"
.PP
.B "int j_empty_drive(int tlim, char *buf)"
.PP
.B "void j_rdshelves(char *buf)"
.PP
.B "int j_getstatus(char *buf)"
.PP
.B "int j_scsiio(struct scsi_cmd *cmd, int ncmd,"
.br
.B "\ \ \ \ \ \ struct scsi_return *ret, int nret, char *err)"
.PP
.B "int j_shelfof(char *vol_id)"
.PP
.B "int j_volid(int dr, char *err)"
.PP
.B "extern char *j_shelf[NSHELF];"
.PP
.B "extern void pperror(char *buf, char *mesg);
.SH DESCRIPTION
.I J_shelf_to_drive
places the disk in shelf
.I sh
in logical drive
.IR dr .
It returns 0 on success;
otherwise an error message is placed in
.I err .
.PP
.I J_drive_to_shelf
places the disk
in logical drive
.IR dr
in shelf
.IR sh .
If
.I sh
is negative,
the disk is returned to its home shelf.
It returns 0 on success;
otherwise an error message is placed in
.IR err .
.PP
.I J_rdshelves
initializes each element of
.I j_shelf
to the volid of the disk on that shelf.
A zero pointer means there is no disk;
a name of
.B UNALLOCATED
means the disk has not been allocated a name yet.
It returns 0 on success;
otherwise an error message is placed in
.IR err .
.PP
.I J_getstatus
initializes
.B j_status
which include the following fields:
.EX
	struct Lunstatus lun[NLUN]; /* disk status */
	uchar shelf[NSHELF];	/* shelf status */
	uchar iounit;		/* I/O unit status */
	uchar carrier;		/* carrier status */
	uchar udrive;		/* upper drive status */
	uchar ldrive;		/* lower drive status */
.EE
A return value of 0 implies success;
otherwise \-1 is returned and an error message is placed in
.IR err .
.PP
.I J_scsiio
performs a SCSI transaction.
It sends the command in
.I cmd
and
.I ncmd
data bytes and stores the return status in
.IR ret .
A return value of 0 implies success;
otherwise \-1 is returned and an error message is placed in
.IR err .
.PP
.I J_shelfof
returns the shelf number of the disk labelled
.IR vol_id .
If there is no such disk,
\-1 is returned.
.PP
.I J_volid
returns the volid of the disk on drive
.I dr
in
.IR err .
A return value of 0 implies success;
otherwise \-1 is returned and an error message is placed in
.IR err .
.PP
.I Pperror 
returns an error message that is contained in 
.IR buf.
.PP
.SH "SEE ALSO"
.SH DIAGNOSTICS
0707070035050453601006660011710000040000010447430457563430700000700000003362juke.h#define	NLUN	8
#define	NSHELF	50
extern int nlun;
extern void setnlun(void);
extern char *j_shelf[NSHELF];
extern int j_wrshelf;			/* need to write out shelves */
extern j_rdshelves(char *err);
extern j_wrshelves(char *err);
extern j_inventory(char cold, int tlim, char *err);

typedef enum { SIDEA = 0, SIDEB = 1 } Side;

struct Lunstatus
{
	unsigned int poweron:1;		/* is power on ? */
	unsigned int diskin:1;		/* is disk in drive? */
	unsigned int ready:1;		/* is disk spun up or spun down? */
	unsigned int writeprotect:1;	/* is disk write protected? */
	unsigned int diskindrive:1;	/* is driveshelf a drive number? */
	unsigned int shelfvalid:1;	/* is retshelf valid? */
	uchar driveshelf;		/* drive number */
	uchar retshelf;			/* return shelf */
};

struct Jstatus
{	
	struct Lunstatus lun[NLUN]; /* disk status */
	uchar shelf[NSHELF];	/* shelf status */
	uchar iounit;		/* I/O unit status */
	uchar carrier;		/* carrier status */
	uchar udrive;		/* upper drive status */
	uchar ldrive;		/* lower drive status */
};
extern struct Jstatus j_status;
extern int j_getstatus(char *err);
extern int j_shelfof(char *vol_id);
extern int j_driveof(char *vol_id);

extern char *strdup(char *);
extern int j_shelf_to_drive(int, Side, int, char *);
extern int j_drive_to_shelf(int, int, Side, char *);
extern int j_empty_drive(long, char *);
extern int j_rvolid(int, char *);
extern int j_wvolid(int, char *, char *);
extern void pperror(char *buf, char *mesg);
extern int reserve_drive(int, char *);
extern int release_drive(int, char *);
extern int cold_inv(char, char *);
extern int warm_inv(char *);
extern int j_load(char *vol_id, char *buf, long tlim);
extern int j_unload(char *vol_id, char *buf);

#define		JUKEDIR		"/usr/worm/jukedir"
#define		UNALLOCATED	"<unallocated>"
0707070035050450551007770011710000040000010576210464700562400001000000215126jukebox\H"���^Юn��P�P�Հ��P��p�P��P��[��
�P��t.��$^Ь[ЬZ�V�������������������������WЏ�B�����~��6\��W?����Z�[���2�PY�P��������YP�P�e|&�P�ah���P�U���P�w@ÏmPQ6�A�P`7��B�MX�c�wl�V�U��������J��������?��������4��������)��������������������W�
�����/e��<)�P����������@�������
e����V'����!����������������	�W������Ub[��LbU�Ej�����������X�����W	�W������2�X��������?�����X��W�P�v����@���l����=����X�h���	Џu�������~���P�0�V2�X�������l?�����X���P������{��������X��@�PY������Y����P��������Y���.����Y����P��������Y���.�Y�����n6�����������;�����P�PU�Y�Y2#�I�Dc�I�;c�Y����$6�Y���zX�������P�����H�~���*��OX����������!�����X��.���*ݬ����X���-���*^�����v�P ��������X��-���\*�����Q�P �������QX��z-���-*�[�[�.�K�m���U��|gUZˏ����jU��[�����4��cUɏ�[T�UTxjU�UU�E�%W������4@���bUɏ�[T�UTxjU�UU�E��V����4
����~4��t��q4ˏ����jUS��Ux��UU�E�_a.��Uˏ����UT��~x��UU�E�>a��'��)4 ��~�����4
�����4������3�[�����^Ь[�������P �����6���V��,���(�����
�P �������V���+���(�Z�Z^�J�����U��|gUYˏ����iU>�[
ˏ����iU0����~ݏ�����Z����P�������?V��h+�Z�Ь[�[��
�P�[��o��V��:+����'ݬ��'�PZ�Zݬ���[��:Џ����Pj��Uݬ��^�PY�J�_�[�Y���@�Y�[�Y�~�Z����P	Џ����P!�[�Y���P	Џ����P	�J�a_�Pxcan't find vol_id %s
<unknown shelf??>unallocated shelf number %d??ab%s%c): in shelflower,%supper,%slun %d(onlineofflineUsage: jukebox [-aemprsuU] [-w secs] [vol_id
%d: %s
%d
jukebox: %s
-a needs a vol_id-e needs a vol_idaemprsuUw:^Ь[ЬZ�Z��>�P
Џ����P��Z��
�P
Џ����P�s�[��N�PY�Y �Y�[���Z��D8Џ����P�C�����PY�Y��[�Z��8Џ����P��Y����0���S~��?0�PX�Z�X��Y����P
Џ����P���[��������7�Z����X���P
Џ����P���R�[��8�PI�-]�Z��Y�X����P	Џ����Pi�Z�X�~�Y��V�P	Џ����PM�[��I�����.7�Z����X���P	Џ����P�Z�~�Y�X��i�P	Џ����P�P%sa%sbusing unallocated disk from shelf %d
no unallocated disks<unallocated>there is an existing '%s' on shelf %d��^��[ЬZ�Z���P
Џ����P�������.�V�Y�Y27��gUʏ?���U�U���VЏ�I��[�I�[�I�8��Y��V����.�Y�Y2�I�[�Y��X�X�ˏ����H�>\U��X��)��V.�H�\Uˏ����UTCʏ����U:�Z�~�Y�X���
�P
Џ����P���Y�Y2�I�[�Y��V$�Z�~ݏ�����X��
�P
Џ����P������-�X�C����V��u��-��4����P~��P-�PX���O�Y�Y2��I�8���I�Z��gUʏ?���U�U������4���8��X�Y��	�P��8�������[�0���0�U�U�r7�U�s.�U�u<�U�u3��0��c&�W�G��Y�W��2���0�PW�@��Y��YW�W�Y��8���p���,�Z��4�~�W�X��i	�P	Џ����P`��8���'5�PG�Y�G�8����3�Y���������k,�Z��
�P	Џ����P�[�s�Z��B�P�^Ь[ЬZЬY�Y�Z�~�[��x�P
Џ����P�j����Z��:�PX��XԼ\���Y�~�[�Z���P
Џ����P�%�Y�Z��[���P
Џ����P�����Z����PX��X���Y���3�����Y���3�Y��'4�PX�X�������2a�YXU�e�a�YXU�eK�YXU�e�b�YXU�eռ�W�W�W�)�Y��@�����Q2����Y��P3Џ����PF�PBԼ����[������M��#�[���Y��
2����~�~�~�~���
�PмU�E�W[мU�E�WZ�[�Z�P!�[	Џ����P�Z�P�Z�[��}2ЬUЬT�E�OWD��xݬݬ�ݬ��ЬUЬT�E��xD�Wݬ�ݬݬ��Ь[�Z�Z2�ZJ��x�Z���E�����2��x��P*�Z�Z2���J�x��[��ZX�Z��P����P
Џ����P��J�lxYЏ����J�_x�YXX�[��Y������P	Џ����Pb�[�Z���)����P	Џ����PH�YZ�J�x�J�xYЏ����J�x��[�Z��������P	Џ����P
�Z�2����PDISK_ERROR%derror in reading shelf %d: %s; proceeding
vol_id '%s' must end in a or bapparently good superblock but null vol_id<unallocated>process any new disks.
%s@%d -> %d
reloading %d disks.

clearing drive %d:
%d disks in shelves.
theregetstatus done
Ь[ЬZ�jUʏ���U�Y�Y�kUˏ����YT�TUk�jUʏ����U�Y�Y�kU�YT>D�����Tʏ����T�TUk�jUʏ����U�Y�Y�kU�YT�D�����Tʏ����T�TUk�Z�jUʏ���U�Y�Y�kUxYTʏ����T�TUk�jU���U��Z�jUʏ���U�Y�Y� kUxYTʏ����T�TUk�jU���U�8 ^���ߐ��ߔ��ߔ��ߔ��ߐ
��ߔ����
�~������L&������ݬ�~�����
��������P
Џ����P����ߐ��ߔ��ߔ��ߔ��ߐ����ߔ���ݬݏ������~�����~���P	Џ����PY�[�[�K���K�T��O����[��[�[2�K�,��g�[��^��CT��_��;T��`��3T��a��+T�P^��UH�P�ԭ�ѭ�2Э�U�E��R֭����������P[���ݬ��
Џ����Ps����߭�����[��c+�PFЭ�U�U2"����ݭ�����s��rH����������-Э�U�PE�FR��[�����G�P��-��c��3�PZ��Qݬ��bЏ����P7�[�[2%�K��Q�K��Q�[���Z���[��Z��x�P^Ь[�Z�Z2"�J�QU�[�U��,�P�ZP6�Z��������PZ��Z�����h��vG��Џ����Pݬ������PZ	Џ����P6�[�[(ˏ����K��QU�K��QU�eU�UZ�[P�[�Џ����Pjukebox: %s
wWarning: bad shelf number in %s: %d (vol_id=%s)
%d %s
r/usr/worm/jukedir8 ^����������x�U�U������ЬU>E�����U��T�TU���������ݬ�~�����~�����~��8 ^���լ&�������x�U�U���������������7�������x�U�U������ЬU>E�=���U��T�TU���������ݬ�~�����~�����~��Ь[�~��,��PY�~��,�PY����Z�Z��Dˏ����J�FPU�ZPs�Z��Z�Z��D8ˏ����J�#PU%�[�~ݏ�����Z�������P	Џ����P5�ZP0�Z��
��(�[������P�c���Џ����PЏ����P�^Ь��ݬ߭��~߭�����^Ь��ݬ߭��~߭����:�^Ь��ݬ߭��~߭����.�^Ь[ЬZ�[��~����P
Џ����P�
�[��Z����P
Џ����P��ݬ��*�PXݬ������)�H����a�V-�H����b�Vݬ����[��_(Џ����P��H���������2����PW�W �������[��((Џ����P�d�Z�@�X�X��H�����U��|gUY�iUˏ����UT�ʏ����U���Ux��UU�WUs��Uʏ����U�VT�UT�X�B	�XP��ˏ����iU��[�~ݏ�����X�������P
Џ����P��[������PЏ����P��X�:����[�Z��.����P��խ����[��&'Џ����Pf�[ݭ��V~�W������P	Џ����PHЭ�PB�
��&�
Z�[������P����Џ����P�������[��&Џ����Pdisk '%s' busycan't find a free drivecan't find vol_id %svol_id '%s' must end in a or b^��]A��WA2��NA��(�����)&�~�������P��$A�/dev/worm%d^Ь[�[������P
Џ����P����������@~���PY�[��Z����P
Џ����P���Z�Z2��gUʏ����U�Z��Z2���������Yݏ�������P����[��c&Џ����Pl�Z�J��J�Z��Z�����S����[����~�Z�Y������P	Џ����P+��@�����7&�PJ�J���$�#����P%s -> %d
< ^լԼ�������x�U�U���������������ݬ�~�����~�����~���P�������P�P< ^լԼ�������x�U�U���������������ݬ�~�����~�����~��%�P�������P�P8 ^�����������������������I������U�0U���ݬ�~�����~�����~��[�P< ^�������x�U�U���������������ݬ�~�����~�����~��y�P�������P�P�^Ь[��Џ��������f>5���q����P�N>��[ݬ��4Џ����P��[	Џ@ZЏ�ZЬU��T�ZT�߫ݬ��>��k&�P���[U�PU2���ݬ������=���Џ������=Э�P�լA�$�~ݬ��=�� �P���$�U�PUZѭ�$������~ݬ��p�ì$~ݬ��h=��Y �P����Qݬ��C�g���ЬU�$���$լ��/=��4Џ�����=�P^Ь[ЬZ����ЬU��G��Zݬ�[ݬݬݬ��b����P���"��������P�S�Z������"�j���횫����.�������ЬU��U�U��������d�������Zݏ�����[�~�����~�������P�������P����Q<n��&Uʏ����U�U^����U�����UQ�������ЬU��U�U����������������Z��[�~�����~��q����P������������Pf��GЏL"�Gݏ����߫$��rG�����������Yx�����Uʏ����U�E�;Y�Y���Z��f �P�P%s; %sreservation conflictintermediate good/metintermediate goodbusyreservedmet/goodcheck conditiongoodscsiio readscsiio write/dev/scsi< ^լԼ�������x�U�U���������������ݬ������~�����~��y����P�������P�ݼ��E����������Uʏ����U���������Uˏ����U~����Uˏ����U~����Ux��UUˏ����U~��9������Uʏ���U+����U����TxTT�TU����TxTT�TU~�����p�����c�P�^Ь[�kUx��UUˏ����U��ѭ�d�kUʏ���U4��~��~��~��~��Uʏ����U�E��9��~ݬ��VB��Uʏ����U�E�9��Gݬ��2�kUˏ����U~ݭ���ݬ��sense: class=#%x, code=#%xextended sense: %sextended sense: %s info=#%2.2x#%2.2x#%2.2x#%2.2xreserved (#f)miscomparevolume overflowequalaborted commandcopy abortedvendor specific (#9)blank checkdata protectunit attentionillegal requesthardware errormedium errornot readyrecovered errorno sense
, addr=0x%xerror class=0x%x, code=0x%x, sense=0x%xno error
sense(%d,%d): ^Ь[����(���x�U�U���x��[U�U���x��[U�U���x��[U�U���[���������������ݬݏݬ�~�����~������(^Ь[ЬZ�W�j�Z�[������P
Џ����P�r�Z�����~�[��N����POݏ�~�������ݏ�����������P#�W�����P7��y���YЏ����X�W�Y��^��'7��P�Z�����Y�[�������P
�YX�� �Y��XF�Y�Y��W������6��
����Z�������[�������P��Z�����X�[��\����P-�����[������Y�X��j��6��Џ����P>�W�X��6��a6��ݏ���&��Z���������[��K����PЬ[ЬZ���*�x�U�U�x��[U�U�x��[U�U�	x��[U�U�
�[�����
����ݬ�~ݬݏ�Z�~�����X"^Ь[ЬZݬ������������d������	�PY�����Z���Џ����P���Z�[��a����P
Џ����P������%���x[U�U����������������������������Z��ͬ��~�����~��Q����Pͨ��ͨ�P�e�������PX�XU�U���14�U���1K�X�o�@ݬ����ݏj��i�ͬ����Xݬ����ݏP�1��I�ͬ����8������H�P����z4��	ݬ��������ͬ����ͬ���l�P �ͬ����Z��yЏ����P��������~ݏ�Y��	�Yݏ�������P��Y�Z��8Џ����PC�Y��z�Z�ͬ�������[������P	Џ����P������!�Z�[������Pmkfs read%s: errorworm mkfs -f %s %swarning: bad capacity %d
worm mkfs -n %d -f %s %sw+rmkfs %s
superblock at %d
read fail on block %d (b=%d)
no superblocktried for superblock at blocks 1,2
read block %d
superblok at 0
���=U	�U�:��=ݬ��8ݬ���!��=U�E��ݬ��ݬ��%s: %s%s: unknown errno %dЬ[��ZxZU��T�TUZxZU��T�TUZxZU�kT�TUZ�ZP�!�\�^Ь[�Z�Y�kP�P	�P �P+�P-�Y�[�[��
ZP��Q�QP�0PZ�k0�k9��Y�ZP�ZP�P�<�P�������P�+�+�+,,0,:,T,f,x,�,�,�,�,�,�,�,�,�,--.-=-N-b-v-�-�-�-�-�-�-�-�-..&.<.R.k..�.Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo childrenNo more processesNot enough memoryPermission deniedBad addressDirectory not emptyIn useFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesIllegal ioctlText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument too largeResult too largeLink loopConcurrency violationIt's all Greg's faultSecurity label violationNo such system callOut of security labelsInadequate privilege�^���ݬ���^Ь[��U5��M5��O��
������������0�Џ����P1����$ЫZi�[��\9����H���H���א����X�X߭���~��3�PY�kVݏ����PZ�Z�������Y�YX �Z�Y�YX�Z��Y�Z��~����PYЏ�k����Z��XY� �1E�ЬP�^Ь[2�Pʏ����P�PHЫZB�Z�Y;�Z������PЏP�Pk�Y�Z��~��q�PY
� �Џ����P�P�^��e,[�����	�[��t����[�[��3��^Ь[Џ����Z���A��<�[��>����PZ��~������PЏ����Z��
ݫ��6����ԫ�����k�ZP�^Ь[���+X�X�;3�P1�X���瑫+�P�P�PY�k�w+ݏ�ݬ����PZ�Y1��Z��Z�������{�k�aj�Y�~�~ݬ��H�PZ<��y63ݏ�ݬ��r�PZ�Y�Z�Z������ݬ��
�PZ�Z'���Z���Y�~�~ݬ����PZ�Z1 ��h�Z��Y���k�r�����XP^ЬP�����ݬ���
ݬ߬ݬ��Z�P[ЬP���QѠQݬ������ݬ��
ЬP��	Џ����P�[P�^Ь[2�Y���Y	�[��J����Y���Y1�ի�Ѭ�Ѭ"Ѭkë�PѬPЬZ�Zk�Z��P1�����~��^�PXq�kZѬ�ZXP�P�ԬլX�YT¬Xë�P�ZP�XP�XZ�ݏݬ��/�PZ&��Z�~��~����[��� �P�Z�Zk�ӏY�kЫ�ݬݬ��~����P1N�Џ����P�^��0G��0�1���0P�@�Q�a-��@�P�����0��v0P�@���
�P1���]0P�@��W0P�`[�[��S�[:�[ݬ��
�PZd��(0�[��50ݼ��$0��(��������
0��0P�@���/P�`
���/���/�?P1����/Џ����P1��Z�j:1����/P��/Q�A�P�`��/P��/�A�P�2O��/��/�)��x/��[��/ݼ��/���'�����1n���S/P��L/�@��1��@/.��8/��./P�@��(/P�`
��/��/��1�[P���������~����PZ�Z2<�Z7�
ZP�
P�PZP�PP�PP�@��SY�i[�kP�[P�P�ZP
�[�ki�[P�Z���^Ь[���.Z�X�j3�Z��.�ij�jY�i��[[P�PP�ZP�YP�[[P�PP�ZP�PZ1��ZY�jZ�ZY��X�X	��.Z����	�PZݏ��[~���
x
PX�XXP�PP�ZP�PZxX~����PY�Y�����$�[XP�P�PX�[XP�P����P19��P���xX~�Y��-1��[[P�PP�P��-�Y��-���-�R�j��-���-j�Z��-	�Y��-���-���-Y�Y�-��ZPЬ[X�[�kP�[P�PY�Y2:�Y5�
YP�
P�PYP�PP�PP�@�4RX�hZ�jP�ZP�P�YP�Z��[h�[~���^Ь[�[�[�1-�[�&-�[�-�k�^��	R[ԭ��Z�Z�����֭��jk�kZ��[�[�T��Э�P�^ЬZ�ݬ��K�PP�PP�ZP�P��Э�j�Z�,W��,[��,YЭ��,�[P�ZP�ZP�ZP�Pk���P�YP�YP�YP�P����a,�\,��V,���^Ь[ݬ��������	�[�������[��P�P�����~���PW�W~������PX�X[�XP�W���W���[Z�XYЊ�Э�P׭��P��X[��WWP�PP�XP�P[��WWP�PP�XP�[P�P��wP@h�ЬT4}�Q�QR+�RSя��T)���ac��T�)Tac�caP�PP�P�ЬV'}�S�TWя��V,lW���c��V�,lWVcЬP�^Ѭ�ЬPЬP��^ԭ�Э�P�@�aN
Ь@�VN�P�!����P��p���^��#������"��
���"߬ݬ���P[���P���"P��"���������"�����"	Џ����P�[P�^Ь�SOЬ�OOŬ�P�P�~ݬ���^��-OYì���ѭ�Y1!xY~ݭ���	�PY�������Э���Ь[�Y�Z+�Y��ݭ��[���ݭ��[���N�P����Ph�Y[�[���]�Z�Y��ݭ���K�Z�Y��ݭ��[����Y��Э�[/�Zݭ����N�P����P�[����Z�[��r�YZ��YZ�Z����[��>ì��Pí��Q�PQݬ�Y��~������Э��1�ݭ�ݬ�������Y���1���[�Y��ݭ��Z��2�Y��Э�Z14��^���M��Ь[ЬZ�kY�j��Y�׭���^���M��Ь[ЬZЬY�k���i��j�����׭����^�[ЏUUUUK�(�Џ����K�(��̏����K�|(����[�[���(��(�[��S�PZ��(P�PQ�A�C(Q�[ R�[RQQ�Q@�1(��s(P�PQx[A�(R�R@�(��T(��[[�[ ��^��<(��5(��2(��+(��!(P��(Q�A��'@��'��(P�@�'P�PPʏ���P�^���'���'���'���'���'P���'Q�A�v'@�p'��'Pˏ�@�]'P�^��'��'��'��'��u'P��r'Q�A�"'@�'��Z'Pˏ�@�	'QnQPf�K'P�^Ǭ����PĬP�P����[��'��'��'��'��'P��'Q�A�&@�&���&Pˏ�@�&Z�Z[�ǬZPĬP�PZP�^м[��&��[�&м[��&��[�&���[�K�Z�K�C&K��ZK�8&�[��^Ь[ЬZԭ�լ05Ь���jЪP֪�`P	�Z���PY�Y�׭��֭�ѭ���Э�P�^Ь[ЬZԭ�լ16ЬY�j��PЪQ֪�Pa�Z��~�������Y���
֭�ѭ���Э�P������������%�~��\S�^\��������%P���%�����Ь�%�P�^߬ݬ��#���
�^߬ݬݬ���
�^Ь[��A���[���[��ԭ�֭��߬ݬ߭���
�^Ь[��A$��9$��;�����t���ի��
ݫ����������Ь���Ы��k�^ԭ�լ1�ݏ����P����=I��n�P;ݭ�����խ�����P��ݭ������Zݭ���ANԭ�խ� ѭ��í����­��¬�������!����P��ݬ��������^���H����^��B��Ь��Џ���߭�߬ݬ��R�P[׭��PЭ�Q֭��Pa߭����z����[P�^��B��Ь��Ь��߭�߬ݬ���P[׭��PЭ�Q֭��Pa߭����-����[P}�R:���b:S���b�QR������RQT�T:STb�QP}�S�ST�P:���d)���dc�QT������TQ�Q)Qdc	�cP�aQ�QP�}�V�VS:���g(���gc�QW������WQ�Q(Qgc�VP�^ݬ��)�P~�������P���P�Pݬݭ������ЬR�RQ:���a��RQP�ЬUC}�S�TV�URЏ��Y�YUX�YU:Uf�VQU�X�YRW�YR,UfRc�WR	�XU��U�ЬP�^�� �P��1��ݬ���!���!���!���ݏ������9�P[����+�PZ߭���.�P���P��	�P������ѭ�����Џ�������[�����Z����Э�Pխ��Э�P�
ЬQ�Pa�#�^լ	��FPЬP�P[��@!�[��?�����-!�[����(!�[����!Z��a��j�z��j�[��3�[PЬPЬR�R�Q{RPPR�PR�P�P�
������PЬPЬR�R�Q{RPRP�P�PR�RP�����լ�Q�������^� ��$Э�P�@�6C�@�-C���@�$C���׭�խ�������(���	

 !"#$&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~���������������������������������������������������������������������������������������������������������������������������������T7��R�B�����d�ݭ��R������P���֭�������S}��T�T��P���R�P�T��S�C�����R�Q�S��T�P�}T���P���R�P��P�Q�R���Э�P����^Ь[Ь��Ь\ԭ�<���P�[Q}��T�QUR�PR�RP0r��Q[�Rܕ���^U|Y|V��P�P �X����������������������������������������������������y���������������$
���������������y���P�1��1�ȏ@Z� P11��XP�Z�PЌR:Pb�QU�RQ1'0123456789abcdef0123456789ABCDEF�R�S������W�R�S������W�Z������W�SV�Q�UЌP�RSPQ�Ag��VR��|V�e;0��Z1}լ�1u�S��xP�Z��XP�Pq�W�0qYʏ�Z�lP�P
n4
n� 
�
n� ��
n���
n�W8
n������; ��W�Z�+q�Z� q�W�Z�X�QUV�WV�VX&�WQ�Q�H� R�]R�RX(VaHa,a0X��W�Q�VSU�QUX�XYP �Z�ZR�WP	�PX�PY0)��XYP7�XY�XP0��R�P��R}��T�T0���R�֭�}T����YP1b�1]��0R� R�PY�Q�PW�P^,`RWn�WP�^Q0���W^ЎQЌP�P��^Q1i�ȏ�Z1L�� Z1F��Z1@��Z1:��Z�Z�Z�Z�IiY>I��Y	�HhX>H��X�Z1��X�Z�Z1��Z
ЌY��Z�YY�ЌX��XX��Z�X0����XW�WV�W�W�W�WP�PnW�#�V�WP֭��W�P�H���W�x��WP���@���Q�WV��S�����0��0S��,a��Vc�c8Va�0��VUQ�nS�W���-��WЭ�P�0��PV�VP�PV�P��(PacЭ�P,a0Pc�XP�Z�	Z�.�έ�P�PX�XP�PX,a0Pc�XP�PV�VP�PX(Pac�XP�@� R�]R�RP�PX�PX,a0Pc�SU�DeB+��X�Z�X0��XW�W�W�WP�PnW�֭��WP�P�=���W�x��WP���@��Z=��Q&�QV���P�Pn8n����e�VQ�Z1,�� ��1%��WV�XЭ������1�����P0�P�PX(�WV�PX��Q0���Z�	Z�u0��e.�U�Z�1����Q0���Z��Z�X�X�X�Z1.�1+����p�U1�rUU����UR���R�;R���R���RƏ�R0�qPU�R�R���RR�R
d��U�R�	R�\tPTUPU�P	��	��t�UPU�P��XW�����юn���W�W	qU�� ������P����pP�T~�MS�R�RR�R�TRdcP�S�T��RgPP�R������Q�RR�(RS�S�A�����Q�B�bT B�CG@�M �[���u��+��pPB<��Vvӈ�b��2>H�QS'���I[��������#,;
���:��ܒ��X���^Ь[ЬZԭ�ԭ옋Y�YP�P%ULLLLLLLLZZLLLLLLLLLLLLLLLLLLLLLZLLLLe׼1SЬPРQ֠�aP1L��Y�Y%�ԭ��Y*�Z����Yԭ�����Y!%�j���Zխ��Z��Y�
��P�YP�0P����Y��e�խ��Zխ�Џ0u���Y�l���ԭ蘋Y�Y�h��Y�[�[���P[��e�Y���PY����YЏ����P߭�ݬݭ�ݭ��Yݭ����Pխ�֭�խ�1��խ��Э�P׼ЬPРQ֠�aP
ݬ��>�P���P ��P	��P
��P�����1^�ݬ�P��1O�ݬ���P���PY��P�����1V�ݬ�P����X^Ѭ�cѬ�s
Ѭ�[!ݬݬݬݬլм~�~���ԭ�ԭ�ԭ�Ѭ�e
Ѭ�f����
YѬ�o�Y
Ѭ�x�Yޭ�[ԭ�ԭ�׼ЬPРQ֠�aP
ݬ��/�PZ�Z ��Z	��Z
��Z--֭��Z�׼ЬPРQ֠�aP
ݬ����PZ׬*�Z+%׬׼ЬPРQ֠�aP
ݬ����PZѬ?1B�?�1;��e,�Y1��Z�a	�Z�f�Z�A��Z�F�֭��Yx�����Y
�����P�PP���PxP��x�����Z����e�0Z�Z�a�Z�f	WZ�7Z�Z��Э�Z1��Y
1�խ��֭�wЬPРQ֠�aPy�Z.��Z�e	�Z�Emխ�h�Y
cխ�^խ�Y֭��Z�׼ЬPРQ֠�aP
ݬ���PZ�Z+�Z-
�Z0"�Z9�Z�׼�ݬ��y�PZ׬1��խ�έ����Z�����ݬ�Z���Լ��լ	ޭ�P�[P�P�������P�PP�PP�PPȬP�PV``&&&&&&&&&&&&&**@�P߭����vPXмPPX`�߭����pPWмPpW`�мP���`�мPЭ�`��^Ь[ЬZԼ�[XѬ�cѬ�0u��ԭ�Ѭ�s���ЪP֪�`P�Y������j��Z��P�PY����e����Ѭ�cԭ�8Ѭ�[.���(�[�Y�׬/�jЪP֪�`P	�Z����PY�Y�����
����e��Y�����լ�Z�Y��hԼ���[�[XѬ�c���P�PЬ[�Y�k�^�Y�[�Z�Y	��e��e�Z䘋Zˏ����ZP�P�]�[P�Y�ZP�Z��e�ZP�Z��e�Z��[���ݬ�����ݬݬ���;������^Ь[�����
Џ����P1����ݏ�������P���ի��ߘ�P�@�I5����[��\��
��
��������~Џ~ݫ��~��D����PkЫ��k!�k���������
��� ��k1Q�ЫP֫�`P������Q�P���QP�%������P�^��X�������PZЬ[����[�
�Z�������0Pk�
�Z������PZ�[�k�X��[ЏaY�Y�z	���P%�YP�Y�Pk�ݬ�������P��X�ЬPЬPЭ`Э��PЬP�PЬQ�aP���P����Q�
���Q��a�(Џ�U����7����^�С��ݏOV���:���longjmp botch
�0�����Џ��X}�V�VQ:Xa��QS:Xg
(Xgc�QW������WQ�Q(Qgc�VP�^Ь[�[�A�[�Z� [�[P�^Ь[Ѭ�����	Џ����P)�ѫ�ѫ���k�֫�k׫���ЬPP�ЬX��X�SЬR�U��T� T��T�T
�+T�-T�S��T|P�T04�T9/�Q����yPVyPP�VP�WQ�0T�TP�Q�U�S�U��TǑT.�S��V�T�e�T�E[��T�T+�T-�S��T�T0�T9�V������FfV>F��V��S�VV�VU�U�����Џ����U�U�dЏdU�X�R�Rh}PP1��R�U#�Q����	y��PP�R�yPV�VP�WQ�R�U�=;�Q
yPP�RyPP�R�Q��QV�W{VQW�PV�W{
VPV�PP�V�P�R�U��Qy��PP�RyPP���PPnPVnQPd�~���P`VP�SrPP�RpP~��p�P�PR��R�R�
�RP|Pp��
P��rPP�"��������!� � � � � � � � � � � � � � � $$$�#�#�#�#�#�#�#�#~#x#h#]#O#�g�g d*--%s%s%c
: illegal option -- %s%s%c
: option requires an argument -- �d�d�d�d�dP�K��S���g�;���vf�py6��>�1<�7{i�V�g9��"���$h�JG�y��Fr\��K��� PH�/bin/shsh-caaa/tmp/XXXXXX/tmp//         (((((                  H���������������������� ��������<d<$�E�Έ&($<- D2�7@<��A@�
DE�MDMD�FID��#D#D&D,D1D7D<DBDGDMDRDXD]DcDhDnDqDwD�D�D���D �D!�D"�D#�D$�D%�D&D'	�D(�D)I7D*$�*D,*D-;�AD/A�GD0GD1PD2YD3���D5���D6���D7�M%D8���D:�D;���D=���D>�D?�D@�DA�QDBDCDD/U�>DF>DGDDHK�QDIQDJ`DKbDKdDLiDMrYDK���DO�DP�DQ�DR�DT�DU�DV�]@	_�b�f@"m@s@y��������������DW��W���W��$Y�� DDZ���D[���D\���D]��]���]��$_�� D��"D`���Da�Db�Dc�c��c�&�\�\������$e� DDf!�!Dl!�0Dm0DnG�PDpP�_Dq_Drv�DtDt���Du�Dv�Dw�Dx���Dy�Dz��D{�D|�D~!
�D.�D�;�ED�ED�W��D��!���D��&pD��+n��Dt�0@2@(
4�>�b���D�����E���N$��U D\�b@D����D����D��D����D���D�D��'D�'D�)�.D�.D�>D�HD�JD�XD�q��D��h@
j@(	l�v�b���D�����}����$��� D��"��"�@"D����D����D��D����D��D����D���XD����D��D���D�D��D�D�D�+D�4D�CD�LD�S�@
�@	�U��U���V�\�`h����`l �2�`R�`S�`T�`U�^X�\p.	p.p.p.#p./p.:`E`N^X\
Z```f^
h\t`w`�`�`�`�`
�`

�`l��`b"��`l$��`$�^(�\�`�`�`�`l�
�`l��^�\�`�`,�`,``^��V�T*dT5�EV�&9$TB DK�"R@"Y�"]@"
D]�eDeD
rDD�D�D���D�aa
D���D�dS
D���D�h>
D���D�l
D	D	D/	D<	p
DO	D b	D!o	D"v	D#�	D$�	D%�	D&�	D'�	t
D(�	D)�	D*�	D+
D,

x@	{@��b��
�-
��-
�\�`h����`l �2�`R�`S�`T�`U�^X�\�p.�p.�p.�p.�p.p.``'^1\
3`9`?^
A\M`P`Z`c`i`n`
s`

x`l�~`b"��`l$��`$�^(�\�`�`�`�`l�
�`l��^�\�`�`,�`,�`�`�^��-
�-�
d�
�EV�&$	�
 D�"@'�"+@"
D
�
��
D�
D�
D�
/�D�
D�
D�
��
D�
��
D�
D�
2���
D�
D�
��
D�
D6�D D D!D"D"D !D#%D#'�2D$2D%AD&G:xD'V�qD(qD)�D*�D*�D+�D,�D,�D*�D-���D/�D0�D1�>v��D#�D3�BaD4�D5�D6D7D7�D8D9&D:,D<3�PD=PD>gD?r��DB�DB�DC�DB�DD�DG�DH�DI�DL�DM���DO�FTDP�DQ
DR

DS
DT#
�,
�,
D7,
DW4
J<DXA
DYN
DZW
D[]
N�D\h
T@	W@]@a�d��2g�b��n@p�
�u��j
�]j
w�]k
�$_l
� D���@���@
��"�@"	��$D`u
��
Dd�
De�
Df�
Dg�
Dh�
Di�
��
Dk�
Dl�
Dm�
Dn�
Do�
DpDq�DsDt"�.�7Dv7DwDDxQ�UDyU�Dzf�hD{hD|rD}z��D~�D�����D����D��D������D��D��D����D����D��D�	�@��b��������$���2D��$��$D��D�D�D�&D�.D�2D�6D�?D�CD�H�@"�@"
�S��S���T�$�T�T�2D�����"D�V�VD�Vh�D�k�}��}
��~
$�~~2D���"D����D��D����������"$��'2D,�"3@"D����D��D��D��:��D��D��D��D����D��D��D��D�D�D�D�)�.D�.D�?D�HD�YD�bD�eD�nD�nD�pD�x��D��D����D��D��A@
C@	E@�����I���N(�h��S(d���2Y\a`he��o`l �2u`R|`S�`T�`U�^X�\�p.�p.�p.�p.�p.�p.�`�`�^�\
�``	^
\``$`-`3`8`
=`

B`l�H`b"�L`l$�Q`$W^(c\l`o`v`|`l�
�`l��^�\�`�`,�`,�`�`�^��������d���EX�&�$����2D��(���@(�
�,@,
D
���D�D�D
D?DADgDpDrD���D�����$�  D,�"D���D�D�D�D�D �D!D"&D#FD$OD$QD%VD$iD&mD&oD'tD&~D(�D)�D*�D+�D,�0@2�(6�B�8 F����-�O�-�[ d�l\t`hx���`l �2�`R�`S�`T�`U�^X�\�p.�p.�p.�p.�p.�p.�`�`	^	\
	`	`	^
	\*	`-	`7	`@	`F	`K	`
P	`

U	`l�[	`b"�_	`l$�d	`$j	^(v	\	`�	`�	`�	`l�
�	`l��	^�	\�	`�	`,�	`,�	`�	`�	^�	�-��	-��	d��	�EY�&�	 �	&\
\	
$
�
 D!
�"D���D�D�D�D�D�D�D�%
�)
���D�D�D-
��*D*�5D51
�DU�WD W�nD"pD#yD$�5
�:
�b�@
@(C
����%�J
�%�V
$'�b
 Dn
�"D(���D,�r
���D-�D.���D0�D0�D1�D2�D0�D3�D4�v
@{
@(
~
����5��
�5��
$7��
 D�
�"�
@"D9���D=�D=���D>�D>�D?D@D>"DA&DB6DB6�6D=6DD6DE:�
�DFQ�
@
�
�b��X�GX�
�GY�
$IZ�
 D�
�"DK\�\DN\DOkDPtDPvDQ{DR�DP�DS��
@�
@
���T��
�T��
 ��2�
\`h��`l �2`R`S$`T+`U2^X:\Dp.Lp.Sp.Yp.fp.rp.}`�`�^�\
�`�`�^
�\�`�`�`�`�`�`
�`

�`l��`b"��`l$��`$�^(\````l�
 `l�%^.\5`:`,?`,E`K`Q^X�T�dTndx�EZ�&|$� D����
������"D�D	D
L������8 ���d�d��e�$
f� D��
�
�


�
�"Do�tDtDyD�D�
�
�
�8 !
�����-
��>
$�L
 DZ
�a
�"e
@"D���D�D�D D"D"!D#*D$9D">D&BD&D�MD'M�\D(\D)sD+|����D&�D.�D/�D0���D2�i
@
k
@	���3�q
�3�
\�
`h�
���
`l �2�
`R�
`S�
`T�
`U�
^X�
\�
p.�
p.�
p.�
p.�
p.�
p.``^!\
#`)`/^
1\=`@`J`S`Y`^`
c`

h`l�n`b"�r`l$�w`$}^(�\�`�`�`�`l�
�`l��^��3��3��d���E[�&�$�� D����"D���D�D
���d�������������$� D�
�"D���D�D��d����������!$�) D1�4�"D���D�D�8�d�>����� D� L\N`"S`"[`0d`(h�j^l\n`"s`"x`"~`$�^�\�`�`�`�`�`�`
�`

�`l��`b"��`l$��`$�^(�\�`�`�`�`l�
�`l��^\
``,`,`#`)^0� 6 =dD�E]�&H$O DV�"]�"a@"e�l@
D�%D%D2D?DLDYDfDtD}D�D���D�s�D���D�D�D ���D!�wsD"���D$���D%�D%���D&�D'�<D(<D)XD*aD+kD,qD-�D.�D/�D0�D0�����D%�D4�D5���D6�{[D7���D9�D:�D;D=D>D?D@&�/DB/LDCB�@(	���@�@�@
������b��I�DI��DJ�\�`h����`l �2�`R�`S�`T�`U�^X�\�p.p.p.p.p.+p.6`A`J^T\
V`\`b^
d\p`s`}`�`�`�`
�`

�`l��`b"��`l$��`$�^(�\�`�`�`�`l�
�`l��^�\�`�`,�`,�``
^�DJD�d�&�E]�&* /$�7 PD	���D�D���D
�?�D�D���D�B�b���D���F��N\V`hZ��d`l �2j`Rq`Sy`T�`U�^X�\�p.�p.�p.�p.�p.�p.�`�`�^�\
�`�`�^
\```"`(`-`
2`

7`l�=`b"�A`l$�F`$L^(X\a`d`k`q`l�
u`l�z^�\�`�`,�`,�`�`�^�����d��E^�&�$� D��"�@"D	�
D

DD'D+D?D?�?D?DLDYD[D`DpDpDrDvD{D{D���D�D���D�D�D�D�D�� D�D �D!�D"�D#
�DD%�@
��b���
���@	��&��&\`h��`l �2 `R'`S/`T6`U=^XE\Op.Wp.^p.dp.qp.}p.�`�`�^�\
�`�`�^
�\�`�`�`�`�`�`
�`

�`l��`b"��`l$��`$^(\``!`'`l�
+`l�0^9\@`E`,J`,P`V`\^c�&j&,td,{�Ea�&$,� D����$�������"D5�5D5D:D=D`DD���������< ����������\�`"�`"�`0�`(���^�\�`"�`"`"	`$^\``'`0`6`;`
@`

E`l�K`b"�O`l$�T`$Z^(f\o`r`y``l�
�`l��^�\�`�`,�`,�`�`�^������d���Eb�&�$�� D����$�����"D���D�D�D�D�D�D�����< �����*��4\6`";`"C`0L`(P�R^T\V`"[`"``"f`$i^k\w`z`�`�`�`�`
�`

�`l��`b"��`l$��`$�^(�\�`�`�`�`l�
�`l��^�\�`�`,�`,``^�� �+d�3�Ef�&7$�A DK�R�$X�_��e�"D	���D�DDD%D=i�m�v�8 z��?�?��@�\�`"�`"�`0�`(���^�\�`"�`"�`"�`$�^�\�`�`�`�`�`�`
�`

�`l�`b"�`l$�
`$^(\(`+`2`8`l�
<`l�A^J\Q`V`,[`,a`g`m^t�@|@�d@��En�&�$@� D����$�������"DI�IDIDmD�D���������< ����������\�`"�`"`0	`(
�^\`"`"`"#`$&^(\4`7`A`J`P`U`
Z`

_`l�e`b"�i`l$�n`$t^(�\�`�`�`�`l�
�`l��^�\�`�`,�`,�`�`�^������d���E��&�&\�\� $
� D��(�"�'@,�(0�<�A�"D���D�D�D���D�E-!��D�D�����D�D
�*D*H !D:DGD R�\D"\�aD#a��D$�D%�D'�L!D(�������D+���D,�D-���D/���D1���D2�D3���D5�P�R����6�W�6�]&� \b \�h!l� p� t� x� |� �� �� �$@�� D����(������(���@(������"�@"
DA�DGDIDK�=DL=DMCDNNDO[�]DQ_DRc�qDSqDT�DU�DV���DW���DX���DY�DZ D[4 D\; �; �; �; D`; DaC DbN Dcb �� Dd� �� Df� ��������b�����b���� �g� 
�g�   0 \"`"'`"/`08`(<�>^@\B`"G`"L`"R`$U^W\c`f`p`y``�`
�`

�`l��`b"��`l$��`$�^(�\�`�`�`�`l�
�`l��^�\�`�`,�`,�`�`�^�g� g8!d8!�E��&"$8!, D6�=�$C�J��P�"DA!�A!DA!DF!DI!Dm!D�!D�!Tg$D�!D�!W]$��!D�![5$D"D"_)$D<"c'$�I"DI"g�k�t�8 x���< �K"� K"�� L"�&�`\�`\��$�$�$��#��#��#��#��#��#��#��#�~#�x#�h#�]#�O#�$6L"� P��,�@,�"�D8Q"�U"D;U"D<f"�l"D=l"D>x"#D@�"#��"��"DB�"�"��"���"DD�"�D�" �D�"-\/`"4`"<`0E`(I�K^M\O`"T`"Y`"_`$b^d\p`s`}`�`�`�`
�`

�`l��`b"��`l$��`$�^(�\�`�`�`�`l�
�`l��^�\�`�`,�`,�``
^�D�"Dx$#dx$+�E���&/$x$6x$>2DE�K�Q@W�([�g�"D�$��$D�$D�$k�o���$�
�$x�
�$$�$� D���@��"�@"
D�$��$D�$D�$D�$D%D%�.%D.%DA%�Z%DZ%Dd%�*Dw%�}%�}%D!}%D!�%��%D#�%D$�%��)D%�%D&�%D&�%D'�%D(�%��%D!�%D*�%��%D+�%��%D,�%D-�%��%D/�%D0�%��)D1�%��)D2�%D3&�&D5&� &D6 &D7-&��)D8D&�M&D:M&D;Q&��)D=f&D>y&D?|&D@�&�@	��(���@�@��b(���&�A�&��A�&�$C�&��&�2D � �
 @ �( �  @(
$ �- �(1 �= �"DE�&��&DF�&DG�&��&�H�&A �H�&I $J�&R  D[ �a @g �"n �"r @"
DK�&��&DS�&v �)DU
'DV'z �)�.'DW.'DX;'�H'DZH'D[W'D\d'D]�'D^�'D_�'��'Db�'~ i)Dc(De
(Df+(Dh-(� O)DiM(� <)Dje(�e(Dle(�t(Dmt(� 2)Dn�(��(Dp�(Dq�(Dr�(��(Ds�(� ()Dt�(��(Dv�(Dw�(Dx)Dy)Dz)D{")� �� �� �b,�� @(	� �� �T � �� �bT"�� �X"�$)�|$)� �|%)� \� `h� ��� `l �2� `R� `S� `T!`U	!^X!\!p.#!p.*!p.0!p.=!p.I!p.T!`_!`h!^r!\
t!`z!`�!^
�!\�!`�!`�!`�!`�!`�!`
�!`

�!`l��!`b"��!`l$��!`$�!^(�!\�!`�!`�!`�!`l�
�!`l��!^"\"`"`,"`,"`""`("^/"�|%)7"|*C"d*M"�E���&Q"$*Y" Pa"�"e"�"D*�*D
*D$*j"k*D
?*m"d*�`*D`*�`*p"�a*x"\�"`�"`�"`�"`�"`�"`
�"`

�"`l��"`b"��"`l$��"`$�"^(�"\�"`�"`�"`�"`l�
�"`l��"^�"�a*#�*#d�*#�E���&#$�*$# N+#�,/#@,D�*��*D�*D	�*D
�*D�*D�*3#@
��*�
�*5#�
�*<#\H#`K#`U#`^#`d#`i#`
n#`

s#`l�y#`b"�}#`l$��#`$�#^(�#\�#`�#`�#`�#`l�
�#`l��#^�#�
�*�#
�*�#�*�#t+�#�$+�#4+�#�4+�#��.$��.	$y�0$��1$L`2#$�x3,$�,54$<5=$��8F$�$9O$X9U$�p9^$��9e$�9n$L(:v$��;}$(h>�$f?�$ ?�$�l?�$�?�$y,@�$�A�$��A�$
�A�$B�$!<B�$!tB�$$�B�$��B�$��C�$��C%xD%�8D%HD%�pD#%�D+%�D6%-�D>%��DF%��DN%�DW%f`M`%nTh%�Tp%�(Ty%4T�%�U�%U�%�,U�%<U�%��U�%�`V�%pV�%��V�%H�V�%AW�%x�X�%��X�%��.�%�%~<�%r\&.�\&��?&�x3&	��f &t�*&&C�-&	��f3&��<&0dD&l�L&!BT&�[&,@b&Z�
l&ETv&~&��&��1�&���&�9�&��&���&	X�f�&^\�&���&���&c��&	c|g�&[f
'h�'FA'Z)'��2'�D'�\J'�X9O',�&Y'&<Ba'�l
i'��=p'�z'��$�'$tB�'m��'�A�'`(:�'$9�'���'t�0�'�*�'x�?�'d0�'���'��C�'(��'�,�'N@
(��*()�(!\"(��9((��D/(;$+6(�?<(	y�gI(;L"W(u8!b(��8j(��Bs(a�C{(\�*�(��B�(v8D�(e`2�(Nh>�(	��g�(�$d�(�4+�(+�(	��g�(	
�w�(� d�(��D�(��D�(�(d�(f�.)�00)�p9)�<5$)L�/,)y�62).�D9)�,5@)~zFI)�HDN)�4TW),d_)	:܇g)
�Ao)�Dt)� ?z)+�7�)788�)��8�)	-��)(�;�)��<�)��<�)X@=�)(>�)[�>�)	�H��)�U?�)�l?�):`M�)�?�)��D�)��U�)�`V*pU
*�,U*��D*��U *�PA**�U0*zT7*�pD=*��CD*�pVL*x<UT*�e\*��ed*�Sm*H�Vv*�TO~*A�V�*��R�*n(W�*�T�*�(T�*?U�*�!U�*N W�*|�X�*crt0.oexitjukebox.ojukebox.crccmainmainargcargcargvargv_6_30_45_54_57_70cerrbufvol_idUflagaflageflagmflagpflagrflaguflagsflagsecsmainusageusage_81usageerrexiterrexiterrbuferrexitspin_86_87_88prstatusprstatus_99_102_105_106_107_113_112_114_115_116clLunstatuserrbufprstatusunloadunloadforceforceclLunstatuserrbufunloadejectejectvol_iderrbuferrbuf_140shdrejectJstatuslunLunstatusshelfiounitcarrierudriveldriveJstatusLunstatuspowerondiskinreadywriteprotectdiskindriveshelfvaliddriveshelfretshelfLunstatus1SIDEASIDEB1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufjukebox.callocate.oallocate.crccallocateallocatevol_idvol_idbufbuf_9_10_13_14_17_24shdrivenbufallocateJstatuslunLunstatusshelfiounitcarrierudriveldriveJstatusLunstatuspowerondiskinreadywriteprotectdiskindriveshelfvaliddriveshelfretshelfLunstatus1SIDEASIDEB1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufallocate.ccold.ocold.crcccold_invcold_invtypetypebufbuf_5_12_13_26_39_40_64_67_sortshdrivenshdiditvol_idnside1cold_invgetvolgetvolshshdrivedrivevol_idvol_idside_89_92_100_101_102ibufgetvolcmp_cmpcmpabsasbcmpsd_sdsdaberr_disksdds_dsdsaberrdssortsorterrbuferrbuf_indexijorgsortdiskindexJstatuslunLunstatusshelfiounitcarrierudriveldriveJstatusLunstatuspowerondiskinreadywriteprotectdiskindriveshelfvaliddriveshelfretshelfLunstatus1SIDEASIDEB1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufcold.cgetstatus.ogetstatus.crccdolun_dolundolunlunLunstatuslunLunstatusuudolunj_getstatusj_getstatuserriretscsi_returncmdscsi_cmdj_getstatusj_statusJstatusJstatuslunLunstatusshelfiounitcarrierudriveldriveJstatusLunstatuspowerondiskinreadywriteprotectdiskindriveshelfvaliddriveshelfretshelfLunstatus1SIDEASIDEB1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufgetstatus.cioshelves.oioshelves.crccj_wrshelfhaveread_3j_rdshelvesj_rdshelveserr_13_12_17_21shnovnamefp_iobufj_rdshelvesj_wrshelvesj_wrshelveserr_26shnofp_iobufj_wrshelvesj_shelfofj_shelfofvol_idvol_id_49ibufj_shelfofj_driveofj_driveofvol_idishj_driveofj_shelfJstatuslunLunstatusshelfiounitcarrierudriveldriveJstatusLunstatuspowerondiskinreadywriteprotectdiskindriveshelfvaliddriveshelfretshelfLunstatus1SIDEASIDEB1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufioshelves.ciodr_sh.oiodr_sh.crccj_shelf_to_drivej_shelf_to_driveshside1drerrcmdscsi_cmdretscsi_returnj_shelf_to_drivej_drive_to_shelfj_drive_to_shelfdrshside1errcmdscsi_cmdretscsi_returnj_drive_to_shelfj_empty_drivej_empty_drivetlimitbufbufitstopj_empty_driveJstatuslunLunstatusshelfiounitcarrierudriveldriveJstatusLunstatuspowerondiskinreadywriteprotectdiskindriveshelfvaliddriveshelfretshelfLunstatus1SIDEASIDEB1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmdiodr_sh.clib.olib.crccs_starts_startdrerriargscargss_starts_stops_stopdrerriargscargss_stops_ejects_ejectdrerriargscargss_eject2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobuflib.cload.oload.crccj_loadj_loadvol_idbufbuftlimittlimit_11_14_35_40lLunstatusnshside1drdisk_to_loadj_loadJstatuslunLunstatusshelfiounitcarrierudriveldriveJstatusLunstatuspowerondiskinreadywriteprotectdiskindriveshelfvaliddriveshelfretshelfLunstatus1SIDEASIDEB1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufload.cnlun.onlun.crccnlunsetnlunsetnlun_7bufsetnlunJstatuslunLunstatusshelfiounitcarrierudriveldriveJstatusLunstatuspowerondiskinreadywriteprotectdiskindriveshelfvaliddriveshelfretshelfLunstatus1SIDEASIDEB1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufnlun.cwarm.owarm.crccwarm_invwarm_invbufbuf_25shvol_idside1drivewarm_invJstatuslunLunstatusshelfiounitcarrierudriveldriveJstatusLunstatuspowerondiskinreadywriteprotectdiskindriveshelfvaliddriveshelfretshelfLunstatus1SIDEASIDEB1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufwarm.cge_stop.ostop.crccgen_stopgen_stopniargsiargsncargscargserrcmdscsi_cmdnretscsi_returngen_stop2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufstop.cge_start.ostart.crccgen_startgen_startniargsiargsncargscargserrcmdscsi_cmdnretscsi_returngen_start2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufstart.cge_reset.oreset.crccgen_resetgen_resetniargsiargsncargscargserrcmdscsi_cmdretscsi_returngen_reset2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufreset.cso_eject.oeject.crccsony_ejectsony_ejectniargsiargsncargscargserrcmdscsi_cmdnretscsi_returnsony_eject2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufeject.cs_h_io.oh_io.crccfd_fds_ignuass_ioss_iopreservecmdscsi_cmdncmdncmdretscsi_returnnreterr_8_14_22nretvss_iosmsg_smsg_28_29_30_31_32_33_34_35s_ios_iopreservecmdscsi_cmdncmdretscsi_returnretscsi_returnnreterrerr_56mycmdscsi_cmdnioerrstatusbufignoreduas_ios_idss_extsense2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufh_io.cge_sense.osense.crccgen_sensegen_senseniargsiargsncargscargserr_8_11_12_15_16cmdscsi_cmdretscsi_returnngen_senseexstab_exstab_18_19_20_21_22_23_24_25_26_27_28_29_30_31_32_33gen_extsensegen_extsensedatadatadestndata_39_40_41classgen_extsense2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufsense.cs_volid.ovolid.crccmyread_myreadmyreaddriveblockblockretscsi_returnerrcmdscsi_cmdmyreadj_rvolidj_rvoliddrivedriveerrerr_13_22_31_32_35_38bretscsi_returnlastbdebugbufj_rvolidmywrite_mywritemywritedriveblockblockcmdscsi_cmdcmdscsi_cmdretscsi_returnerrmywritej_wvolidj_wvoliddrivedrivevol_iderrerr_43_46_55_57_58_61_64cmdscsi_cmdtmpfilefp_iobufretscsi_returnbufnj_wvolidJstatuslunLunstatusshelfiounitcarrierudriveldriveJstatusLunstatuspowerondiskinreadywriteprotectdiskindriveshelfvaliddriveshelfretshelfLunstatus1SIDEASIDEB1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufvolid.cs_pperror.opperror.crccpperrorpperrorbufmesg_5_6pperrorscsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmdpperror.cs_longat.olongat.crcclongatlongatsrcsrcnlongatscsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmdlongat.caccess.oatol.ocerror.oclose.odata.oerrlst.oexit.oflsbuf.ofopen.ofprintf.ofseek.ogetopt.olseek.omalloc.omemcmp.omemset.omin.oonexit.oopen.oprintf.oqsort.orand.ordwr.oread.osbrk.oscanf.osetbuf.osleep.osprintf.ostrchr.ostrcmp.ostrcpy.ostrdup.ostrlen.ostrncpy.osystem.otime.otmpnam.oudiv.ounlink.ourem.owait.owrite.o_cleanup.o_exit.oalarm.ocreat.odoprnt.odoscan.oexecl.oexecv.oexecve.ofilbuf.ofork.ogetpid.okill.omktemp.osetjmp.osignal.ostrcat.otolower.oungetc.oatof.octype.oldexp.o_exitstart_main_environ__iob_setbuf_getopt_optarg_atol_usage_s_id_setnlun_optind_unload_strcpy_eject_sleep_cold_inv_allocate_j_load_s_start_fprintf_s_stop_printf_prstatus_j_rdshelves_j_shelf_j_wrshelf_j_wrshelves_errexit_j_getstatus_j_status_j_drive_to_shelf_j_shelfof_sprintf_j_driveof_s_eject_j_shelf_to_drive_nlun_min_j_wvolid_strdup_getvol_nrand_warm_inv_j_rvolid_strlen_gen_reset_strcmp_qsort_memset_s_io_fopen_pperror_fscanf_fclose_j_empty_drive_time_gen_start_gen_stop_sony_eject_access_ss_io_s_ignua_open_write_close_read_ss_extsense_gen_extsense_gen_sense_memcmp_strncpy_tmpnam_longat_system_unlink_fseek_fread_errno_sys_nerr_sys_errlistcerror__sibuf__sobuf__lastbuf__cleanup__exit__setcleanup__flsbuf__stdioclean_onexit_malloc_fflush_free_creat_lseek__doprnturem__filbuf_opterr_optopt_strchrudiv_sbrk_ialloc_realloc_mstats__onexitfns_srand_rand_lrand_frand_Srand_fwrite_end_brk_scanf__doscan_sscanf_alarm_setjmp_signal_getpid_kill_pause_longjmp_snprintf_fork_execl_wait_ftime_strcat_mktemp__sctab__ctype__getccl_tolower__innum_ungetc__instr_atof_execv_execve_vfork_getppid_strtod_ldexp0707070035050452421006660011710000040000010632770461717160700001200000007445jukebox.c#include	<stdio.h>
#include	<limits.h>
#include	"scsi.h"
#include	"juke.h"

main(int argc, char *argv[])
{
	int c;
	int aflag = 0, eflag = 0, mflag = 0, pflag = 0;
	int rflag = 0, sflag = 0, uflag = 0, Uflag = 0;
	long secs = 3600L*24*183;	/* half a year is enough */
	char *vol_id;
	char errbuf[1024];
	extern int optind;
	extern char *optarg;

	setbuf(stdout, (char *)0);	/* turn off buffering */
	while((c = getopt(argc, argv, "aemprsuUw:")) != -1)
		switch (c)
     		{
		case 'a':       aflag = 1; break;
		case 'e':       eflag = 1; break;
		case 'm':	mflag = 1; break;
		case 'p':       pflag = 1; break;
		case 'r':       rflag = 1; break;
		case 's':       sflag = 1; break;
		case 'u':       uflag = 1; break;
		case 'U':       Uflag = 1; break;
		case 'w':	secs = atol(optarg); break;
		default:	usage(); break;
		}
	s_id = 2;
	setnlun();
	if(!aflag&&!eflag&&!mflag&&!pflag&&!rflag&&!uflag&&!Uflag)
		sflag = 1;
	vol_id = (optind < argc)? argv[optind] : 0;
	if(uflag || Uflag)
		unload(Uflag);
	if(eflag){
		if(vol_id == 0){
			strcpy(errbuf, "-e needs a vol_id");
			goto scram;
		}
		if(eject(vol_id, errbuf))
			goto scram;
	}
	if(rflag){
		unload(1);
		sleep(1);
		if(cold_inv(vol_id? *vol_id : 'u', errbuf) < 0)
			goto scram;
	}
	if(aflag){
		if(vol_id == 0){
			strcpy(errbuf, "-a needs a vol_id");
			goto scram;
		}
		if(allocate(vol_id, errbuf))
			goto scram;
	}
	if(mflag){
		if((c = j_load(vol_id, errbuf, secs)) < 0)
			goto scram;
		if(s_start(c, errbuf) < 0)
			fprintf(stderr, "jukebox: %s\n", errbuf);
		if(s_stop(c, errbuf) < 0)
			fprintf(stderr, "jukebox: %s\n", errbuf);
		printf("%d\n", c);
	}
	if(sflag)
		prstatus();
	if(pflag){
		if(j_rdshelves(errbuf) < 0)
			goto scram;
		for(c = 0; c < NSHELF; c++)
			if(j_shelf[c])
				printf("%d: %s\n", c, j_shelf[c]);
	}
	if(j_wrshelf)
		if(j_wrshelves(errbuf))
			errexit(errbuf);
	exit(0);
scram:
	if(j_wrshelf)
		j_wrshelves(errbuf);
	errexit(errbuf);
}

usage()
{
	fprintf(stderr, "Usage: jukebox [-aemprsuU] [-w secs] [vol_id\n");
	exit(1);
}

errexit(char *errbuf)
{
	fprintf(stderr, "jukebox: %s\n", errbuf);
	exit(1);
}

prstatus()
{
	struct Lunstatus *l;
	int c;
	char errbuf[1024];
	static char *spin[2] = { "offline", "online" };

	if(j_getstatus(errbuf)){
		fprintf(stderr, "jukebox: %s\n", errbuf);
		exit(1);
	}
	if(j_rdshelves(errbuf)){
		fprintf(stderr, "jukebox: %s\n", errbuf);
		exit(1);
	}
	for(c = 0; c < 8; c++){
		l = &j_status.lun[c];
		if(!l->diskin)
			continue;
		printf("lun %d(", c);
		if(j_status.udrive == (0x80|c))
			printf("upper,%s", spin[l->ready]);
		else if(j_status.ldrive == (0x80|c))
			printf("lower,%s", spin[l->ready]);
		else
			printf("in shelf");
		printf("): ");
		if(l->shelfvalid){
			if(j_shelf[l->retshelf>>1])
				printf("%s%c", j_shelf[l->retshelf>>1], "ab"[l->retshelf&1]);
			else
				printf("unallocated shelf number %d??", l->retshelf);
		} else
			printf("<unknown shelf??>");
		printf("\n");
	}
}

unload(int force)
{
	struct Lunstatus *l;
	int c;
	char errbuf[1024];

	if(j_getstatus(errbuf)){
		fprintf(stderr, "jukebox: %s\n", errbuf);
		exit(1);
	}
	if(j_rdshelves(errbuf)){
		fprintf(stderr, "jukebox: %s\n", errbuf);
		exit(1);
	}
	for(c = 0; c < 8; c++){
		l = &j_status.lun[c];
		if(!l->diskin)
			continue;
		if(force || !l->ready)
			if(j_drive_to_shelf(c, -1, SIDEA, errbuf))
				fprintf(stderr, "jukebox: %s\n", errbuf);
	}
}

eject(char *vol_id, char *errbuf)
{
	int sh;
	int dr;

	if(j_rdshelves(errbuf)){
		fprintf(stderr, "jukebox: %s\n", errbuf);
		exit(1);
	}
	sh = j_shelfof(vol_id);
	if(sh < 0){
		sprintf(errbuf, "xcan't find vol_id %s", vol_id);
		return(-1);
	}
	j_wrshelf = 1;
	if((dr = j_driveof(vol_id)) >= 0){
		j_shelf[sh] = 0;
		return(s_eject(dr, errbuf));
	}
	dr = NLUN-1;
	if(j_shelf_to_drive(sh, SIDEA, dr, errbuf) < 0)
		return(-1);
	if(s_eject(dr, errbuf))
		return(-1);
	j_shelf[sh] = 0;
	return(0);
}
0707070035050453221006660011710000040000010452360457563432300000600000000741lib.c#include	<stdio.h>
#include	"scsi.h"
#include	"scsish.h"
#include	"generic/fns.h"
#include	"sony/fns.h"

s_start(int dr, char *err)
{
	int iargs[1];
	char *cargs[1];

	iargs[0] = dr;
	return(gen_start(1, iargs, 0, cargs, err));
}

s_stop(int dr, char *err)
{
	int iargs[1];
	char *cargs[1];

	iargs[0] = dr;
	return(gen_stop(1, iargs, 0, cargs, err));
}

s_eject(int dr, char *err)
{
	int iargs[1];
	char *cargs[1];

	iargs[0] = dr;
	return(sony_eject(1, iargs, 0, cargs, err));
}
0707070035050453771006660011710000040000010450320457563431500000700000003012load.c#include	<stdio.h>
#include	<stddef.h>
#include	<string.h>
#include	"scsi.h"
#include	"juke.h"

j_load(char *vol_id, char *buf, long tlimit)
{
	Side side;
	int n, sh, dr;
	char disk_to_load[256];
	struct Lunstatus *l;

	if(j_rdshelves(buf))	/* read in shelf names */
		return(-1);
	if(j_getstatus(buf))	/* get the jukebox status */
		return(-1);
	/* now check which side we want */
	n = strlen(vol_id);
	strcpy(disk_to_load, vol_id);
	if(disk_to_load[n-1] == 'a')
		side = SIDEA;
	else if(disk_to_load[n-1] == 'b')
		side = SIDEB;
	else {
		sprintf(buf, "vol_id '%s' must end in a or b", vol_id);
		return(-1);
	}
	disk_to_load[n-1] = 0;
	/* which shelf is that? */
	sh = j_shelfof(disk_to_load);
	if(sh < 0){
		sprintf(buf, "can't find vol_id %s", disk_to_load);
		return(-1);
	}
	while(tlimit >= 0){
		for(n = 0; n < NLUN; n++){
			l = &j_status.lun[n];
			if(l->diskin && l->shelfvalid && (sh == (l->retshelf>>1))){
				if(((l->retshelf&1) == side) && (n < nlun))
					return(n);
				if(l->ready)
					goto await;
				if(j_drive_to_shelf(n, -1, 0, buf))
					return(-1);
				if(j_getstatus(buf))	/* get the jukebox status */
					return(-1);
				break;
			}
		}
		/* disk is available */
		dr = j_empty_drive(tlimit, buf);
		if(dr < 0){
			sprintf(buf, "can't find a free drive");
			return(-1);
		}
		if(j_shelf_to_drive(sh, side, dr, buf) < 0)
			return(-1);
		return(dr);
await:
		sleep(10);
		tlimit -= 10;
		if(j_getstatus(buf))	/* get the jukebox status */
			return(-1);
	}
	sprintf(buf, "disk '%s' busy", disk_to_load);
	return(-1);
}
0707070035050453761006660011710000040000010450340457563431500000700000002411main.c#include	<stdio.h>
#include	"jukebox.h"
#include	"hdr.h"

main(int argc, char *argv[])
{
	int c;
	int err = 0, cold = 0, warm = 0;
	char *toload = 0, *uload = 0;
	char *drive = 0;
	char buf[256];
	extern int optind;
	extern char *optarg; 

	setbuf(stdout, (char *)0);	/* turn off buffering */
	/* gather options */
	while ((c = getopt(argc,argv,"cn:l:wu:")) != -1)
		switch (c)
     		{
		case 'l':	toload = optarg; break;
		case 'c':       cold = 1; break;
		case 'w':       warm = 1; break;
		case 'u':	uload = optarg ; break;
		case 'n':	drive = optarg ; break;
		default:	err = 1; break;
		}
	if(err)
		exit(1);
	/* now actually do some work */
	if (toload){
		if (j_load(toload, buf, 30))
			printf("load %s failed: %s\n", toload, buf);
		else
			printf("loaded %s on %s\n", toload, buf);
	}
	if(drive){
		if(j_volid(atoi(drive), buf))
			printf("j_volid(%s) failed: %s\n", drive, buf);
		else
			printf("%s is mounted on drive %d\n", buf, atoi(drive));
	}
	if(cold){
		printf("invent cold: %d\n", cold);
		cold_inventory(30, buf);
		
	}
	if (warm) {
		printf("invent warm: %d\n", warm);
		warm_inventory(buf);
		
	}


	if (uload){
		if (j_unload(uload, buf)) 
			printf("unload %s failed: %s\n", uload, buf);
		else
			printf("unloaded %s from %s\n", uload, buf);
		

	}
	exit(0);
}
0707070035050375071006660011710000040000010576310464713705700000700000004763mkfileSYS=research
< $SYS.mk
JL=juke.a
X=allocate cold getstatus ioshelves iodr_sh lib load nlun warm
JLIB=${X:%=$JL(%.o)}
JSRC=${X:%=%.c}

SL=scsi.a
X=s_$IO ge_sense s_volid s_pperror s_fixedstr s_longat s_xd
SLIB=${X:%=$SL(%.o)}

SHL=scsish.a
GENERIC=ge_dev ge_inq ge_stop ge_start ge_capacity ge_display\
	ge_reset ge_tur ge_scsi ge_readt # ge_sense in $SL
SONY=so_dev so_inq so_alt so_config so_status so_eject so_rel so_set\
	so_shelfside so_diskid so_internal so_media so_readid so_copy\
	so_i0.tab so_i1.tab so_scsi.tab so_sense so_nesd.tab
WREN=wr_dev wr_inq wr_mode wr_diag
X=$GENERIC $SONY $WREN
SHLIB=${X:%=$SHL(%.o)}

all:V:	jukebox scsish

both:V:	../jukebox ../scsish

../%:	%
	cp $prereq $target

jukebox:	jukebox.o $JL $SHL $SL
	$CC $CFLAGS -o $target $prereq $LDFLAGS

scsish:	scsish.o $SHL $SL
	$CC $CFLAGS -o $target $prereq $LDFLAGS

jpp:V:
	pr mkfile juke.h scsi.h jukebox.c $JSRC | lp -ddp -n2

poot:V:	scsish
 	echo 'dev scsi
 	id 6
 	readt 50000' | scsish

scsi.cpio:V:	inc/scsi.h
	find * -print | sed -e '/\.[oa]$/d' -e '/\.cpio$/d' | cpio -oc > $target
inc/scsi.h:Pcmp -s:	/usr/include/scsi.h
	cp $prereq $target


# below is just magic; believe it.

$JL(%.o):N:	%.o
$JL:Q:	$JLIB
	names=`membername $newprereq`
	ar rv $JL $names && rm $names
	$RANLIB $JL

$SL(%.o):N:	%.o
$SL:Q:	$SLIB
	names=`membername $newprereq`
	ar rv $SL $names && rm $names
	$RANLIB $SL

$SHL(%.o):N:	%.o
$SHL:Q:	$SHLIB
	names=`membername $newprereq`
	ar rv $SHL $names && rm $names
	$RANLIB $SHL

s_%.o:	scsi/%.c
	cd scsi; $CC $CFLAGS -c $stem.c && mv $stem.o ../$target
so_%.o:	sony/%.c
	cd sony; $CC $CFLAGS -c $stem.c && mv $stem.o ../$target
so_%.o:	sony/fns.h
ge_%.o:	generic/%.c
	cd generic; $CC $CFLAGS -c $stem.c && mv $stem.o ../$target
ge_%.o:	generic/fns.h
wr_%.o:	wren/%.c
	cd wren; $CC $CFLAGS -c $stem.c && mv $stem.o ../$target
wr_%.o:	wren/fns.h
so_%.o wr_%.o ge_%.o:	scsish.h scsi.h

so_%.tab.o:Q:	sony/%.tab
	cd sony
	echo generating $target
	p=$stem.tab
	awk -F'	' '
	BEGIN	{ h["0"]=0;h["1"]=1;h["2"]=2;h["3"]=3;h["4"]=4;h["5"]=5;h["6"]=6;h["7"]=7;
		h["8"]=8;h["9"]=9;h["a"]=10;h["b"]=11;h["c"]=12;h["d"]=13;h["e"]=14;h["f"]=15;
		}
	function done(	i){
		for(i = 0; i < 256; i++) if(x[i]){
				print "\t\"" x[i] "\","
				x[i] = ""
			} else printf "\t\"<#%x>\",\n", i
		print "};"
	}
	function hex(n,	i){
		return(h[substr(n, 1, 1)]*16+h[substr(n, 2, 1)]);
	}
	NF == 1	{ if(NR > 1) done(); print "char *" $1 "[] = {" }
	NF > 1	{ x[hex($1)] = $2; }
	END	{ done(); }' < $p > $p.c && $CC $CFLAGS -c $p.c && mv $p.o ../$target
	rm $p.c
0707070035050450531006660011710000040000010447730457563431100000700000000340nlun.c#include	<stdio.h>
#include	"scsi.h"
#include	"juke.h"

int nlun = 1;

void
setnlun(void)
{
	char buf[512];

	for(nlun = 0; nlun < NLUN; nlun++){
		sprintf(buf, "/dev/worm%d", nlun);
		if(access(buf, 0) < 0)
			return;
	}
}
0707070035050453131006660011710000040000010000000457563432400001200000000000nohup.out0707070035050446240407770011710000040000020447210457563430600001000000000000osanity0707070035050452261006660011710000040000010447230457563430600002200000001051osanity/tstfill.cshort pat[][8] =
{
	0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
	0xb6db, 0xeb6d, 0xb6db, 0xeb6d, 0xb6db, 0xeb6d, 0xb6db, 0xeb6d,
	0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF, 0xFFFF,
	0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 0xAAAA, 
	0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 0x5555, 
};

fillbuf(buf, n)
	char *buf;
{
	int i = 0;
	register j;

	while(n > 0){
		if(i >= sizeof(pat)/sizeof(pat[0]))
			i = 0;
		for(j = 0; j < 64; j++, buf += 16)
			memcpy(buf, pat[i], 16);
		n--;
		i++;
	}
}
0707070035050446231006660011710000040000010447250457563430600002000000002004osanity/tstrd.cmain(argc, argv)
	char **argv;
{
	long first, last, t;
	char buf[32768], buf1[32768], *bufp;
	int fd, n;
	char *worm = "/dev/worm0";

	if((argc < 3) || (argc > 4)){
		print("Usage: tstrd [device] firstblock firstnonblock\n");
		exit(1);
	}
	if(argc > 3)
		worm = *++argv;
	if((fd = open(worm, 0)) < 0){
		perror(worm);
		exit(1);
	}
	first = atol(argv[1]);
	last = atol(argv[2]);
	if((first < 0) || (last <= first)){
		print("bad first=%ld last=%ld\n", first, last);
		exit(1);
	}
	print("reading blocks %ld - %ld inclusive on %s\n", first, last-1, worm);
	fillbuf(buf, 32);
	bufp = &buf[1024*(first%5)];
	lseek(fd, first*1024, 0);
	while(first < last){
		n = last-first;
		if(n > 25) n = 25;
		if(read(fd, buf1, n*1024) != n*1024){
			print("block %ld: ", first);
			perror("read");
			exit(1);
		}
		if(memcmp(bufp, buf1, n*1024)){
			print("block %ld: bytes differ\n", first);
			exit(1);
		}
		if((first%5000) == 0){
			t = time((long *)0);
			print("done block %ld: %s", first, ctime(&t));
		}
		first += n;
	}
	exit(0);
}
0707070035050452331006660011710000040000010447270457563430600002000000002730osanity/tstsk.cmain(argc, argv)
	char **argv;
{
	long first, last, t;
	char buf[32768], buf1[32768], *bufp;
	int fd, n, i;
	char *worm = "/dev/worm0";
	long bands[50][2];
	int nbands;
	long loop;
	double tseek, tbl;
	float floop;

	if(argc < 3){
		print("Usage: tstsk [device] firstblock firstnonblock ...\n");
		exit(1);
	}
	if((argc&1) == 0)
		worm = *++argv;
	if((fd = open(worm, 0)) < 0){
		perror(worm);
		exit(1);
	}
	nbands = 0;
	while(*++argv){
		first = atol(*argv);
		last = atol(*++argv);
		if((first < 0) || (last <= first)){
			print("bad first=%ld last=%ld\n", first, last);
			exit(1);
		}
		bands[nbands][0] = first;
		bands[nbands][1] = last;
		nbands++;
	}
	tseek = tbl = 0;
	last = 0;
	fillbuf(buf, 32);
	for(loop = 0;; loop++){
		i = nrand(nbands);
		first = bands[i][0] + lrand()%(bands[i][1]-bands[i][0]);
		n = 20;
		if(first+n > bands[i][1])
			first = bands[i][1]-n;
		if(first < bands[i][0])
			first = bands[i][0], n = bands[i][1]-first;
		tbl += n;
		lseek(fd, first*1024, 0);
		last -= first;
		if(last < 0) last = -last;
		tseek += last;
		bufp = &buf[1024*(first%5)];
		if(read(fd, buf1, n*1024) != n*1024){
			print("block %ld: ", first);
			perror("read");
			exit(1);
		}
		if(memcmp(bufp, buf1, n*1024)){
			print("block %ld: bytes differ\n", first);
			exit(1);
		}
		if(loop && ((loop%100) == 0)){
			t = time((long *)0);
			floop = loop+1;
			print("loop %ld: ave blocks=%.1f, ave seek=%.1fk at %s",
				loop, tbl/floop, tseek/floop, ctime(&t));
		}
		last = first+n;
	}
}
0707070035050446221006660011710000040000010447310457563430600002000000001646osanity/tstwr.cmain(argc, argv)
	char **argv;
{
	long first, last, t;
	char buf[32768], buf1[32768], *bufp;
	int fd, n;
	char *worm = "/dev/worm0";

	if((argc < 3) || (argc > 4)){
		print("Usage: tstwr [device] firstblock firstnonblock\n");
		exit(1);
	}
	if(argc > 3)
		worm = *++argv;
	if((fd = open(worm, 1)) < 0){
		perror(worm);
		exit(1);
	}
	first = atol(argv[1]);
	last = atol(argv[2]);
	if((first < 0) || (last <= first)){
		print("bad first=%ld last=%ld\n", first, last);
		exit(1);
	}
	print("writing blocks %ld - %ld inclusive on %s\n", first, last-1, worm);
	fillbuf(buf, 32);
	bufp = &buf[1024*(first%5)];
	lseek(fd, first*1024, 0);
	while(first < last){
		n = last-first;
		if(n > 25) n = 25;
		if(write(fd, bufp, n*1024) != n*1024){
			print("block %ld: ", first);
			perror("write");
			exit(1);
		}
		if((first%5000) == 0){
			t = time((long *)0);
			print("done block %ld: %s", first, ctime(&t));
		}
		first += n;
	}
	exit(0);
}
0707070035050452241006660011710000040000010447330457563430600001700000000214osanity/mkfileCFLAGS=-g
NPROC=2
ALL=tstwr tstrd tstsk

all:V:	$ALL

tst%:	tst%.o tstfill.o
	$CC $CFLAGS -o $target $prereq

clean:V:
	rm -f *.o $ALL core
0707070035050446211007770011710000040000010447350457563430600001500000000113osanity/seektstsk 5 100000 400000 500000 800000 900000 1200000 1300000 1500000 1600000
0707070035050422101006660011710000040000010273160464713414700001400000000126research.mk# config stuff: research unix
CC=lcc
CFLAGS=-g
RANLIB=ranlib
LDFLAGS=
IO=h_io
NPROC=2
0707070035050450510407770011710000040000020447760464700560600000500000000000scsi0707070035050517151006440011710000040000010255620464677426000001500000027722scsi/dslib.c/*
|| dslib.c - library routines for /dev/scsi
||
|| Copyright 1988, 1989, by
||   Gene Dronek (Vulcan Laboratory) and
||   Rich Morin  (Canta Forda Computer Laboratory).
|| All rights reserved.
*/
#ident	"dslib.c: $Revision: 1.1.1.1 $"

#include <stdio.h>
#include <sys/types.h>

#include "dslib.h"
#ifdef aux
#include <sys/vio.h>
#include <sys/scsireq.h>
#endif aux

int dsdebug=0;
long dsreqflags;	/* flag bits always set by filldsreq */

#define min(i,j)  ( (i) < (j) ? (i) : (j) )


/*
|| Startup/shutdown -----------------------------------------------
*/

static struct context *dsc[FDSIZ];


/*
|| dsopen - open device, set up structures
*/

struct dsreq *
dsopen(opath, oflags)
  char *opath;
  int   oflags;
{
    
  struct dsreq *dsp;
  struct context *cp;
  int fd;
  DSDBG(fprintf(stderr,"dsopen(%s,%x) ", opath, oflags));

  fd = open(opath, oflags);
  if (fd < 0)						
    return NULL;  			/* can't open	*/
  if (dsc[fd] != NULL)		        /* already in use */
    ds_zot("dsopen: fd already in use");

  cp = (struct context *) calloc(1, sizeof(struct context));
  if (cp == NULL)				      /* can't allocate	*/
    ds_zot("dsopen: can't allocate space");
  dsc[fd] = cp;
  cp->dsc_fd = fd;
  dsp = &(cp->dsc_dsreq);

  dsp->ds_flags =	0;
  dsp->ds_time =	10 * 1000;	/* 10 second default timeout */
  dsp->ds_private =	(ulong) cp;	/* pointer back to context */
  dsp->ds_cmdbuf = 	cp->dsc_cmd;
  dsp->ds_cmdlen = 	sizeof cp->dsc_cmd;
  dsp->ds_databuf = 	0;
  dsp->ds_datalen = 	0;
  dsp->ds_sensebuf =	cp->dsc_sense;
  dsp->ds_senselen = 	sizeof cp->dsc_sense;
  DSDBG(fprintf(stderr,"=>cp %x, dsp %x\n", cp, dsp));
  return dsp;
}


/*
|| dsclose - close device, release context struct.
*/

dsclose(dsp)
  struct dsreq *dsp;
{
  int fd;
  struct context *cp;

  if (dsp == NULL)
    ds_zot("dsclose: dsp is NULL");

  cp = (struct context *)dsp->ds_private;
  fd = getfd(dsp);
  if ( cp == NULL )
    ds_zot("dsclose: private is NULL");

  cfree(cp);
  dsc[fd] = (struct context *)NULL;
  return;
}


/*
|| Generic SCSI CCS Command functions ------------------------------------
||
|| dsp		dsreq pointer
|| data		data buffer pointer
|| datalen	data buffer length
|| lba		logical block address
|| vu		vendor unique bits
*/

/*
|| testunitready00 - issue group 0 "Test Unit Ready" command (0x00)
*/

testunitready00(dsp)
  struct dsreq *dsp;
{
  fillg0cmd(dsp, CMDBUF(dsp), G0_TEST, 0, 0, 0, 0, 0);
  filldsreq(dsp, 0, 0, DSRQ_READ|DSRQ_SENSE);
  return(doscsireq(getfd(dsp), dsp));
}


/*
|| requestsense03 - issue group 0 "Request Sense" command (0x03)
*/

requestsense03(dsp, data, datalen, vu)
  struct dsreq *dsp;
  caddr_t data;
  long datalen;
  char vu;
{
  fillg0cmd(dsp, CMDBUF(dsp), G0_REQU, 0, 0, 0, B1(datalen), B1(vu<<6));
  filldsreq(dsp, data, datalen, DSRQ_READ);
  return(doscsireq(getfd(dsp), dsp));
}


/*
|| write0a - issue group 0 "Write" command (0x0a)
*/

write0a(dsp, data, datalen, lba, vu)
  struct dsreq *dsp;
  caddr_t data;
  long datalen, lba;
  char vu;
{
  fillg0cmd(dsp, CMDBUF(dsp), G0_WRIT, B3(lba), B1(datalen), B1(vu<<6));
  filldsreq(dsp, data, datalen, DSRQ_READ);
  return(doscsireq(getfd(dsp), dsp));
}


/*
|| inquiry12 - issue group 0 "Inquiry" command (0x12)
*/

inquiry12(dsp, data, datalen, vu)
  struct dsreq *dsp;
  caddr_t data;
  long datalen;
  char vu;
{
  fillg0cmd(dsp, CMDBUF(dsp), G0_INQU, 0, 0, 0, B1(datalen), B1(vu<<6));
  filldsreq(dsp, data, datalen, DSRQ_READ|DSRQ_SENSE);
  return(doscsireq(getfd(dsp), dsp));
}


/*
|| modeselect15 - issue group 0 "Mode Select" command (0x15)
||
|| save		0 - don't save saveable pages
|| 		1 - save saveable pages
*/

modeselect15(dsp, data, datalen, save, vu)
  struct dsreq *dsp;
  caddr_t data;
  long datalen;
  char save, vu;
{
  fillg0cmd(dsp, CMDBUF(dsp), G0_MSEL, save&1, 0, 0, B1(datalen), B1(vu<<6));
  filldsreq(dsp, data, datalen, DSRQ_WRITE|DSRQ_SENSE);
  return(doscsireq(getfd(dsp), dsp));
}


/*
|| modesense1a - issue group 0 "Mode Sense" command (0x1a)
||
|| pagectrl	0 - current values
||		1 - changeable values
||		2 - default values
||		3 - saved values
||
|| pagecode	0   - vendor unique
||		1   - error recovery
||		2   - disconnect/reconnect
||		3   - direct access dev. fmt.
||		4   - rigid disk geometry
||		5   - flexible disk
||		6-9 - see specific dev. types
||		0a  - implemented options
||		0b  - medium types supported
||		3f  - return all pages
*/

modesense1a(dsp, data, datalen, pagectrl, pagecode, vu)
  struct dsreq *dsp;
  caddr_t data;
  long datalen;
  char pagectrl, pagecode, vu;
{
  fillg0cmd(dsp, CMDBUF(dsp), G0_MSEN, 0x10,
    ((pagectrl&3)<<6) | (pagecode&0x3F),
    0, B1(datalen), B1(vu<<6));
  filldsreq(dsp, data, datalen, DSRQ_READ|DSRQ_SENSE);
  return(doscsireq(getfd(dsp), dsp));
}


/*
|| senddiagnostic1d - issue group 0 "Send Diagnostic" command (0x1d)
||
|| self		0 - run test, hold results
||		1 - run test, return status
||
|| dofl		0 - device online
||		1 - device offline
||
|| uofl		0 - unit online
||		1 - unit offline
*/

senddiagnostic1d(dsp, data, datalen, self, dofl, uofl, vu)
  struct dsreq *dsp;
  caddr_t data;
  long datalen;
  char self, dofl, uofl, vu;
{
  fillg0cmd(dsp, CMDBUF(dsp), G0_MSEN,
    (self&1)<<2 | (dofl&1)<<1 | (uofl&1),
    0, B2(datalen), B1(vu<<6));
  filldsreq(dsp, data, datalen, DSRQ_READ|DSRQ_SENSE);
  return(doscsireq(getfd(dsp), dsp));
}


/*
|| readcapacity25 - issue group 1 "Read Capacity" command (0x25)
||
|| pmi		0 - return last logical block, entire unit
||		1 - return last logical block, current track
*/

readcapacity25(dsp, data, datalen, lba, pmi, vu)
  struct dsreq *dsp;
  caddr_t data;
  long datalen, lba;
  char pmi, vu;
{
  fillg1cmd(dsp, CMDBUF(dsp), G1_RCAP, 0, B4(lba), 0, 0, pmi&1, B1(vu<<6));
  filldsreq(dsp, data, datalen, DSRQ_READ|DSRQ_SENSE
    /* |DSRQ_CTRL2 */ );
  /* dsp->ds_time = 100;	/* often takes a while */
  return(doscsireq(getfd(dsp), dsp));
}


/*
|| readextended28 - issue group 1 "Read Extended" command (0x28)
*/

readextended28(dsp, data, datalen, lba, vu)
  struct dsreq *dsp;
  caddr_t data;
  long datalen, lba;
  char vu;
{
  fillg1cmd(dsp, CMDBUF(dsp), G1_READ, 0, B4(lba), 0, B2(datalen), B1(vu<<6));
  filldsreq(dsp, data, datalen, DSRQ_READ|DSRQ_SENSE
    /* |DSRQ_CTRL2 */ );
  /* dsp->ds_time = 100;	/* often takes a while */
  return(doscsireq(getfd(dsp), dsp));
}


/*
|| writeextended2a - issue group 1 "Write Extended" command (0x2a)
*/

writeextended2a(dsp, data, datalen, lba, vu)
  struct dsreq *dsp;
  caddr_t data;
  long datalen, lba;
  char vu;
{
  fillg1cmd(dsp, CMDBUF(dsp), G1_WRIT, 0, B4(lba), 0, B2(datalen), B1(vu<<6));
  filldsreq(dsp, data, datalen, DSRQ_READ|DSRQ_SENSE
    /* |DSRQ_CTRL2 */ );
  /* dsp->ds_time = 100;	/* often takes a while */
  return(doscsireq(getfd(dsp), dsp));
}


/*
|| Support functions ----------------------------------------------------
*/

/*
|| fillg0cmd - Fill a Group 0 command buffer
*/

fillg0cmd(dsp, cmd, b0,b1,b2,b3,b4,b5)
  struct dsreq *dsp;
  uchar_t *cmd, b0,b1,b2,b3,b4,b5;
{
  uchar_t *c = cmd;
  DSDBG(fprintf(stderr,"fillg0cmd(%x,%x, %02x %02x %02x %02x %02x %02x)\n",
		dsp, cmd, b0,b1,b2,b3,b4,b5));
  *c++ = b0, *c++ = b1, *c++ = b2, *c++ = b3, *c++ = b4, *c++ = b5;
	
  CMDBUF(dsp) = (caddr_t) cmd;
  CMDLEN(dsp) = 6;
}


/*
|| fillg1cmd - Fill a Group 1 command buffer
*/

fillg1cmd(dsp, cmd, b0,b1,b2,b3,b4,b5,b6,b7,b8,b9)
  struct dsreq *dsp;
  uchar_t *cmd, b0,b1,b2,b3,b4,b5,b6,b7,b8,b9;
{
  uchar_t *c = cmd;
  DSDBG(fprintf(stderr,
    "fillg1cmd(%x,%x, %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x)\n",
		dsp, cmd, b0,b1,b2,b3,b4,b5,b6,b7,b8,b9));

  *c++ = b0, *c++ = b1, *c++ = b2, *c++ = b3, *c++ = b4, *c++ = b5;
  *c++ = b6, *c++ = b7, *c++ = b8, *c++ = b9;
	
  CMDBUF(dsp) = (caddr_t) cmd;
  CMDLEN(dsp) = 10;
}


/*
|| filldsreq - Fill a dsreq structure
*/

filldsreq(dsp,data,datalen,flags)
  struct dsreq		*dsp;
  uchar_t		*data;
{
  DSDBG(fprintf(stderr,"filldsreq(%x,%x,%d,%x) cmdlen %d\n",
		dsp,data,datalen,flags,CMDLEN(dsp)));
  dsp->ds_flags	= flags | dsreqflags |
	  (((dsdebug&1) ? DSRQ_TRACE : 0) |
	  ((dsdebug&2) ? DSRQ_PRINT : 0));
  dsp->ds_time	= 10 * 1000;	/* default to 10 seconds */
  dsp->ds_link	= 0;
  dsp->ds_synch	= 0;
  dsp->ds_ret  	= 0;

  DATABUF(dsp) 	= (caddr_t) data;
  DATALEN(dsp)	= datalen;
}


/*
|| bprint - print array of bytes, in hex.
*/

#define hex(x) "0123456789ABCDEF" [ (x) & 0xF ]

bprint(s,n,nperline,space)
	char *s;
{
	int   i, x;
	char  *sp = (space) ? " ": "";

	for(i=0;i<n;i++)  {
		x = s[i];
		fprintf(stderr,((i%4==3)?"%c%c%s%s":"%c%c%s"),
			hex(x>>4), hex(x), sp, sp);
		if ( i%nperline == (nperline - 1) )
			fprintf(stderr,"\n");
	}
	if ( space )
		fprintf(stderr,"\n");
}


/*
|| doscsireq - issue scsi command, return status or -1 error.
*/

doscsireq( fd, dsp)
  int	fd;		/* ioctl file descriptor */
  struct dsreq *dsp;	/* devscsi request packet */
{
  int	cc;
  int	retries = 4;
  uchar_t	sbyte;

  DSDBG(fprintf(stderr,"doscsireq(%d,%x) %x ---- %s\n",fd,dsp,
    (CMDBUF(dsp))[0],
    ds_vtostr( (CMDBUF(dsp))[0], cmdnametab)));

  /*
   *  loop, issuing command
   *    until done, or further retry pointless
   */

  while ( --retries > 0 )  {

   caddr_t sp;

    sp =  SENSEBUF(dsp);
    DSDBG(fprintf(stderr,"cmdbuf   =  ");
		bprint(CMDBUF(dsp),CMDLEN(dsp),16,1));
    if ( (dsp->ds_flags & DSRQ_WRITE) )
      DSDBG(bprint( DATABUF(dsp), min(50,DATALEN(dsp)),16,1 ));
  	
DSDBG(fprintf(stderr,"databuf datalen %x %d\n",DATABUF(dsp), DATALEN(dsp)));
    cc = ioctl( fd, DS_ENTER, dsp);
    if ( cc < 0)  {
      ds_panic(dsp, "cannot ioctl fd %d\n",fd);
    }
  	
	DSDBG(fprintf(stderr,"cmdlen after ioctl=%d\n",CMDLEN(dsp)));
    DSDBG(fprintf(stderr,"ioctl=%d ret=%x %s",
      cc, RET(dsp), 
      RET(dsp) ? ds_vtostr(RET(dsp),dsrtnametab) : ""));
    DSDBG(if (SENSESENT(dsp)) fprintf(stderr," sensesent=%d",
      SENSESENT(dsp)));

    DSDBG(fprintf(stderr,
      " cmdsent=%d datasent=%d sbyte=%x %s\n",
      CMDSENT(dsp), DATASENT(dsp), STATUS(dsp),
      ds_vtostr(STATUS(dsp), cmdstatustab)));
    DSDBG(if ( FLAGS(dsp) & DSRQ_READ )
      bprint( DATABUF(dsp), min(16*16,DATASENT(dsp)), 16,1));

#ifdef aux
  /*
   *  check for AUX bus-error 
   *  we retry with poll-dma
   */
    if ( RET(dsp) == DSRT_AGAIN )  {
      int n = SDC_RDPOLL|SDC_WRPOLL;
      DSDBG(fprintf(stderr,"setting rd/wr-poll"));
      cc = ioctl( fd, DS_SET, n);	/* set bits */
      if ( cc != 0 )
        return -1;
    }
#endif aux

    if ( RET(dsp) == DSRT_NOSEL )
      continue;		/* retry noselect 3X */

    /* decode sense data returned */
    if ( SENSESENT(dsp) )  {
      DSDBG(
        fprintf(stderr, "sense key %x - %s\n",
          SENSEKEY(sp),
          ds_vtostr( SENSEKEY(sp), sensekeytab));
        bprint( SENSEBUF(dsp),
          min(100, SENSESENT(dsp)),
          16,1);
      );
    }
    DSDBG(fprintf(stderr, "sbyte %x\n", STATUS(dsp)));

    /* decode scsi command status byte */
    sbyte = STATUS(dsp);
    switch (sbyte)  {
      case 0x08:		/*  BUSY */
      case 0x18:		/*  RESERV CONFLICT */
    	sleep(2);
    	continue;
      case 0x00:		/*  GOOD */
      case 0x02:		/*  CHECK CONDITION */
      case 0x10:		/*  INTERM/GOOD */
      default:
    	return sbyte;
    }
  }
  return -1;	/* fail retry limit */
}


/*
|| opttovar - lookup option in table, return var addr (NULL if fail)
*/

int *
opttovar( ostr, table)
  char *ostr;
  struct opttab{
    char *opt;
    int  *var;
  } *table;
{
  register struct opttab *tp;

  for (tp=table; (tp->var); tp++)
    if ( strncmp( ostr, tp->opt, 3) == 0 )
      break;

  if ( !tp->var )
    fprintf(stderr,"unknown option %s", ostr);
	
  return (tp->var);
}


/*
|| ds_vtostr - lookup value in table to return string pointer
*/

char *
ds_vtostr( v, table)
  long v;
  struct vtab *table;
{
  register struct vtab *tp;

  for (tp=table; (tp->string); tp++)
    if ( v == tp->val )
      break;
	
  return (tp->string) ? tp->string : "";
}


/*
|| ds_panic - yelp, leave...
*/

ds_panic( fmt, v)
  char *fmt;
  int v;
{
  extern errno;

  fprintf(stderr,fmt,v);
  fprintf(stderr,"\nerrno = %d\n",errno);
  exit(1);
}


/*
|| ds_zot - go away, with a message.
*/

ds_zot(message)
  char *message;
{
  fprintf(stderr, "%s\n", message);
  exit(1);
}
0707070035050450471006660011710000040000011476170464014756600001500000005504scsi/volid.c#include	<stddef.h>
#include	<stdio.h>
#include	"../scsi.h"
#include	"../juke.h"

static
myread(int drive, long block, struct scsi_return *ret, char *err)
{
	struct scsi_cmd cmd;

	set10(cmd, 0x28, drive<<5, block>>24, block>>16, block>>8, block, 0, 0, 1, 0);
	return(s_io(0, &cmd, 0, ret, 1024, err));
}

j_rvolid(int drive, char *err)
{
	struct scsi_return ret;
	long b, lastb;
	char buf[1024];
	int debug = 0;

	err[0] = 0;
	if(s_start(drive, err) < 0)
		return(-1);
	if(myread(drive, 0L, &ret, err) == 0){
		memset(buf, 0, 1024);
		if(memcmp(buf, ret.data, 1024)){
			if(debug)
				fprintf(stderr, "superblok at 0\n");
			goto done;	/* found a superblock at 0 */
		}
	}
	for(b = 1, lastb = -1;;){
hack:
		if(debug)
			fprintf(stderr, "read block %d\n", b);
		if(myread(drive, b, &ret, err))
			break;
		lastb = b;
		b = ((long *)ret.data)[9];
	}
	if(lastb < 0){
		if(b == 1){	/* for disks with a bad block 1 */
			b = 2;
			goto hack;
		}
		if(debug)
			fprintf(stderr, "tried for superblock at blocks 1,2\n");
		sprintf(err, "no superblock");
		s_stop(drive, buf);
		return(1);
	}
	if(myread(drive, lastb, &ret, err) < 0){
		s_stop(drive, buf);
		fprintf(stderr, "read fail on block %d (b=%d)\n", lastb, b);/**/
		return(-1);
	}
	if(debug)
		fprintf(stderr, "superblock at %d\n", lastb);
done:
	strncpy(err, (char *)&ret.data[42], 128);
	err[127] = 0;
	s_stop(drive, buf);
	return(0);
}

static
mywrite(int drive, long block, struct scsi_cmd *cmd, struct scsi_return *ret, char *err)
{
	set10((*cmd), 0x2A, drive<<5, block>>24, block>>16, block>>8, block, 0, 0, 1, 0);
	return(s_io(0, cmd, 1024, ret, 0, err));
}

j_wvolid(int drive, char *vol_id, char *err)
{
	char tmpfile[L_tmpnam];
	char buf[512];
	struct scsi_return ret;
	struct scsi_cmd cmd;
	FILE *fp;
	int n;

	printf("mkfs %s\n", vol_id);
	/* first get the capacity/size for mkfs to make a valid superblock */
	tmpnam(tmpfile);
	if((fp = fopen(tmpfile, "w+r")) == NULL){
		pperror(err, tmpfile);
		return(-1);
	}
	if(s_start(drive, err) < 0)
		return(-1);
	set10(cmd, 0x25, drive<<5, 0, 0, 0, 0, 0, 0, 0, 0);
	if(n = s_io(0, &cmd, 0, &ret, 8, err))
		return(n);
	switch(longat(&ret.data[0]))
	{
	case 1637999:		/* sony 12in clv single density */
		sprintf(buf, "worm mkfs -n %d -f %s %s", 1600000, tmpfile, vol_id);
		break;
	case 3275999:		/* sony 12in clv double density */
		sprintf(buf, "worm mkfs -n %d -f %s %s", 3250000, tmpfile, vol_id);
		break;
	default:
		fprintf(stderr, "warning: bad capacity %d\n", longat(&ret.data[0]));
		sprintf(buf, "worm mkfs -f %s %s", tmpfile, vol_id);
		break;
	}
	if(system(buf)){
		sprintf(err, "%s: error", buf);
		return(-1);
	}
	unlink(tmpfile);
	fseek(fp, 1024L, 0);
	if(fread(cmd.data, 1, 1024, fp) == 0){
		pperror(err, "mkfs read");
		return(-1);
	}
	fclose(fp);
	if(mywrite(drive, 1L, &cmd, &ret, err))
		return(-1);
	unlink(tmpfile);
	s_stop(drive, err);
	return(0);
}
0707070035050450461006660011710000040000010450010457563431200001700000000434scsi/pperror.c#include	"../scsi.h"

void
pperror(char *buf, char *mesg)
{
	extern int sys_nerr;
	extern char *sys_errlist[];
	extern int errno;

	if((errno < 0) || (errno >= sys_nerr))
		sprintf(buf, "%s: unknown errno %d", mesg, errno);
	else
		sprintf(buf, "%s: %s", mesg, sys_errlist[errno]);
}
0707070035050450451006660011710000040000010450030457563431200002000000000400scsi/fixedstr.c#include	"../scsi.h"

void
fixedstr(uchar *src, int len, char *dest)
{
	uchar *s;

	while((*src == ' ') && (len > 0))
		src++, len--;
	for(s = src+len-1; s >= src; s--)
		if(*s != ' ')
			break;
	memcpy(dest, (char *)src, len = s-src+1);
	dest[len] = 0;
}
0707070035050450441006660011710000040000010450040457563431200001600000000247scsi/longat.c#include	"../scsi.h"

unsigned long
longat(uchar *src)
{
	unsigned long n;

	n = *src++;
	n = (n<<8) | *src++;
	n = (n<<8) | *src++;
	n = (n<<8) | *src;
	return(n);
}
0707070035050450431006660011710000040000010450050457563431200001200000001642scsi/xd.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"

#define	WIDTH	32

void
xd(uchar *p, int n, FILE *fp)
{
	register i, nd, l;
	unsigned char buf[WIDTH];
	int didstar;
	unsigned char *s;

	for(nd = 0; n > 0; n -= l, nd += l){
		l = min(WIDTH, n);
		if(nd && (l == WIDTH) && (memcmp(buf, p, l) == 0)){
			p += WIDTH;
			if(didstar++ == 0)
				fprintf(fp, "*\n");
			continue;
		}
		memcpy(buf, p, l);
		didstar = 0;
		fprintf(fp, "%5.5d", nd);
		s = p;
		for(i = 0; i < l; i++){
			if((i%4) == 0) putc(' ', fp);
			fprintf(fp, "%2.2x", *p++);
		}
		putc('\n', fp);
		fprintf(fp, "     ");
		for(i = 0; i < l; i++){
			if((i%4) == 0) putc(' ', fp);
			if((*s >= ' ') && (*s < 0177))
				fprintf(fp, " %c", *s++);
			else switch(*s++)
			{
			case '\n':	fprintf(fp, "\\n"); break;
			case '\t':	fprintf(fp, "\\t"); break;
			default:	fprintf(fp, ".."); break;
			}
		}
		putc('\n', fp);
	}
	fprintf(fp, "%5.5d\n", nd);
}
0707070035050513571006660011710000040000011505520464714335200001500000005050scsi/md_io.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	<sys/types.h>
#include	<sys/dsreq.h>

#define	DEV(buf, target, lun)	sprintf(buf, "/dev/scsi/sc0d%dl%d", target, lun)

static fd = -1;
int s_id;
void (*ss_extsense)(uchar *, char *, int);

ss_io(int preserve, struct scsi_cmd *cmd, int ncmd, struct scsi_return *ret, int nret, char *err)
{
	int retv;
	dsreq_t ds;
	char dev[512];

	err[0] = 0;
	retv = -1;
	if(ncmd && nret){
		sprintf(err, "both input (%d bytes) and output (%d bytes) expected", ncmd, nret);
		return(retv);
	}
	if(cmd->bus_id & 0x8000){
		sprintf(err, "reset not supported");
		return(retv);
	}
	if(fd < 0){
		DEV(dev, cmd->bus_id, ((cmd->cmd[1]>>5)&7));
		if((fd = open(dev, 2)) < 0){
			pperror(err, dev);
			return(-1);
		}
	}
	ds.ds_flags = DSRQ_SENSE;
	ds.ds_time = 30000;
	ds.ds_cmdbuf = (char *)cmd->cmd;
	ds.ds_cmdlen = 10;
	if(ncmd){
		ds.ds_databuf = (char *)cmd->data;
		ds.ds_datalen = ncmd;
		ds.ds_flags |= DSRQ_WRITE;
	} else {
		ds.ds_databuf = (char *)ret->data;
		ds.ds_datalen = nret;
		ds.ds_flags |= DSRQ_READ;
	}
	ds.ds_sensebuf = (char *)ret->sense;
	ds.ds_senselen = sizeof ret->sense;
	ds.ds_iovbuf = 0;
	ds.ds_link = 0;
	if(ioctl(fd, DS_ENTER, &ds) < 0){
		pperror(err, "DS_ENTER ioctl");
err_ret:
		close(fd);
		fd = -1;
		return(retv);
	}
	if(ds.ds_ret
		&& (ds.ds_ret != DSRT_SHORT)
		&& (ds.ds_ret != DSRT_OK)
	)	/* an error */
		fprintf(stderr, "ds_ret = #%x\n", ds.ds_ret);
	ret->type = 3;
	ret->scsi_stat = ds.ds_status;
	ret->scsi_msg = ds.ds_msg;
	ret->reg1 = ret->reg2 = 0;
	if(nret >= 0){
		if(ds.ds_datasent != nret){
			if(ds.ds_datasent == 0)
				retv = 1;
			else
				sprintf(err, "data transfer error; wanted %d, got %d", nret, ds.ds_datasent);
			goto err_ret;
		}
	} else {
		ret->nread = ds.ds_datasent;
	}
	if(!preserve){
		close(fd);
		fd = -1;
	}
	return(0);
}

static char *smsg[16] =
{
	"good", "check condition", "met/good", "reserved",
	"busy", "reserved", "reserved", "reserved",
	"intermediate good", "reserved", "intermediate good/met", "reserved",
	"reservation conflict", "reserved", "reserved", "reserved",
};

s_io(int preserve, struct scsi_cmd *cmd, int ncmd, struct scsi_return *ret, int nret, char *err)
{
	int n;
	int status;
	char buf[512];
	char ioerr[512];

	cmd->bus_id = s_id;
	if(n = ss_io(preserve, cmd, ncmd, ret, nret, err)){
		if(n < 0)
			return(n);
		strcpy(ioerr, err);
		err[0] = 0;
	} else
		ioerr[0] = 0;
	if(status = ret->scsi_stat){
		(*ss_extsense)(ret->data, buf, sizeof buf);
		sprintf(err, "%s; %s", ioerr[0]? ioerr : smsg[(status>>1)&0xF], buf);
		return(1);
	}
	return(0);
}
0707070035050450501006660011710000040000010576220464700551700001400000004236scsi/h_io.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	<scsi.h>

#define		DEV		"/dev/scsi"

static fd = -1;
int s_id;
int s_ignua = 1;
void (*ss_extsense)(uchar *, char *, int);

ss_io(int preserve, struct scsi_cmd *cmd, int ncmd, struct scsi_return *ret, int nret, char *err)
{
	int n;
	int retv;

	err[0] = 0;
	retv = -1;
	if(fd < 0){
		if((fd = open(DEV, 2)) < 0){
			pperror(err, DEV);
			return(-1);
		}
	}
	cmd->flags |= (ncmd == 0)? SCSI_RD:SCSI_WR;
	if((n = write(fd, cmd, 16+ncmd)) != 16+ncmd){
		pperror(err, "scsiio write");
err_ret:
		close(fd);
		fd = -1;
		return(retv);
	}
	if(nret >= 0){
		if((n = read(fd, ret, 36+nret)) != 36+nret){
			if(n == 36)
				retv = 1;
			else
				pperror(err, "scsiio read");
			goto err_ret;
		}
	} else {
		if((n = read(fd, ret, 36-nret)) < 0){
			pperror(err, "scsiio read");
			goto err_ret;
		}
		ret->nread = n-36;
	}
	if(!preserve){
		close(fd);
		fd = -1;
	}
	return(0);
}

static char *smsg[16] =
{
	"good", "check condition", "met/good", "reserved",
	"busy", "reserved", "reserved", "reserved",
	"intermediate good", "reserved", "intermediate good/met", "reserved",
	"reservation conflict", "reserved", "reserved", "reserved",
};

s_io(int preserve, struct scsi_cmd *cmd, int ncmd, struct scsi_return *ret, int nret, char *err)
{
	int n;
	int status;
	char buf[512];
	char ioerr[512];
	struct scsi_cmd mycmd;
	int ignoredua = 0;

	cmd->bus_id = s_id;
again:
	if(n = ss_io(preserve, cmd, ncmd, ret, nret, err)){
		if(n < 0)
			return(n);
		strcpy(ioerr, err);
		err[0] = 0;
	} else
		ioerr[0] = 0;
	if(status = ret->scsi_stat){
		set6(mycmd, 0x03, cmd->cmd[1]&0xE0, 0, 0, 100, 0);
		if(n = ss_io(0, &mycmd, 0, ret, -100, err))
			return(n);
		if(s_ignua){	/* ignore unit attention ?? */
			if((ret->data[2]&0xF) == 6){	/* it is */
				if(ignoredua++ == 0){	/* but only ignore once */
					set6(mycmd, 0x12, cmd->cmd[1]&0xE0, 0, 0, 5, 0);
					if(n = ss_io(0, &mycmd, 0, ret, 5, err))
						return(n);
					goto again;
				}
			}
		}
		if(ss_extsense == 0)
			ss_extsense = gen_extsense;
		(*ss_extsense)(ret->data, buf, sizeof buf);
		sprintf(err, "%s; %s", ioerr[0]? ioerr : smsg[(status>>1)&0xF], buf);
		return(1);
	}
	return(0);
}
0707070035050517141007550011710000040000010255710464677445500001400000000251scsi/gendevawk 'END { for(t = 1; t < 8; t++) for(l=0; l < 8; l++){
		printf "/etc/mknod sc0d%dl%d c 43 %d\n", t, l, l*8+t
		}
		print "chmod 600 *; chown andrew *"
	}' < /dev/null
0707070035050446171006660011710000040000011470230464700536700000700000003041scsi.htypedef unsigned char uchar;

struct scsi_cmd
{
	unsigned long id;
	uchar bus_id;		/* SCSI id of destination device */
	uchar flags;
	uchar cmd[10];		/* SCSI command */
	uchar data[4096];	/* optional data */
};

struct scsi_return
{
	unsigned long id;
	uchar scsi_stat;	/* scsi status byte */
	uchar scsi_msg;		/* scsi message byte */
	uchar flags;
	uchar type;		/* 1=td 2=us */
	unsigned short reg1;	/* td=sa, us=per */
	unsigned short reg2;	/* td=mscp, us=per */
	unsigned char sense[22];
	char pad[2];
	uchar data[4096];	/* any data */
	uchar nread;		/* chars read(-8) if ret count was -ve */
};

#define	set6(x,a,b,c,d,e,f)	(x).flags=0,(x).cmd[0]=(a),(x).cmd[1]=(b),(x).cmd[2]=(c),\
	(x).cmd[3]=(d),(x).cmd[4]=(e),(x).cmd[5]=(f)
#define	set10(x,a,b,c,d,e,f,g,h,i,j)	(x).flags=0,(x).cmd[0]=(a),(x).cmd[1]=(b),(x).cmd[2]=(c),\
	(x).cmd[3]=(d),(x).cmd[4]=(e),(x).cmd[5]=(f),(x).cmd[6]=(g),(x).cmd[7]=(h),\
	(x).cmd[8]=(i),(x).cmd[9]=(j)
#define	setdiag(x,lun,n)	(x).flags=0,(x).cmd[0]=0x1C,(x).cmd[1]=(lun)<<5,(x).cmd[2] = 0,\
	(x).cmd[3]=(n)>>8,(x).cmd[4]=(n),(x).cmd[5]=0

extern s_io(int, struct scsi_cmd *, int, struct scsi_return *, int, char *);/* return 0 on no error, does sense on error */
extern ss_io(int, struct scsi_cmd *, int, struct scsi_return *, int, char *);/* return 0 on no error */
extern int s_ignua;	/* should s_io ignore unit attentions? */
extern void (*ss_extsense)(uchar *, char *, int);
extern int s_start(int, char *);
extern int s_stop(int, char *);
extern int s_eject(int, char *);
extern int s_id;
extern unsigned long longat(uchar *);
0707070035050454001007770011710000040000011461060464700562400000700000435026scsish�0�+T�^Юn��P�P�Հ��P��p�P��P�؟��
�P���~�����o���������M��	����[��~�[�[�����ڋ��(����~�� ��@^Ь[���廓�����7��[ݏ�� ������P��
�� ���͐�PZ�jݏd��p��� ���Q��PX�X�������p����PV��p����������e�������WЦZ�Y�YX���P�P�I�P�L"�P�S[k�I�p���Hu��U�PE� �T�I�p���1u��U�PE� ��G���G��0�G����p���V�����M����U����I�p�E���j?�Z�Y�Y����j��U
�U?�Z��YX��������j���������������1�Z�X�Y��p������ݦ�����������D���������������� ��W���P�����f��G��A������Ь[ЬZի$�k��֏�P�Z�k����P�[P�[��P�^ԭ����U"ХUݬ�U������P��
�����ݬ���������P��Џ���Э�PЬ�Ȝ��œUХ�i��Ь[ЬZЬY�YթЩV�V�VW�ZHݫ�k��K����ЫX,�h(�W�h�W��	����Pݨ���ﳈ�X��P9ЫX/�h+�Z�h��!��Pݨ�k�������P	�X��P���&�~լ�[м[�[�����0����P�P$��ڛլ�[м[�[�﹜������PЬ[լ-�者	����Y�Y�Y��=������(�k��_��P2����‡Џ�Z�j`�jUݥ�e�����Z�Џ�Z�jݺ�k����P�Z��j�j��<����k��~��������PЬ[�[�[�[��>�������[�s��^Џ`��߭��߭��~������sony%d is an invalid target
device '%s' unknown
	%s(%s)
available devices:
?dev=%s
(%s) %s
	%s
device %s(%s):
error in '%s': %s
device %s: %s
param mismatch: %s: i=%d/n=%d param='%s'
%s: lun %d out of range
can't find cmd '%s'
> dev=%s, target=%d:
լ��7�����ޅ
ݼ��~����Pcurrent SCSI id = %d
generic scsitestunit [lun=0testunitstop [lun=0]stopstart [lun=0]startsense [lun=0]senseI?I?I?I?I?I?I?I?I?I?scsi bytes... # 6 or 10scsiresetIL?readt count [lun=0]readtinq [lun=0]inqid [target=0]idhelp [cmd]helpS?dev [type]devdisplayL?capacity [lun=0]capacity�8!^Ь[ЬZЬY�[�[�[�[Kj�[��X�X[��������xHjU�U���������$�������Yݏ���������~�����~���e�PW	�WP������U�Eﲘ����Ux��UU�E�Hj��8������߃����U�Uz�����������xk�������ﳃ����U�U N�����������Lk������g�����U�U$"���������� k������3��[�����~����I��X������P [%d bytes]
 rev=%s/%s %sinq(%d,%d): %s %s;cd-romwormprocessorprintersequential accessdirect accessremovablenonremovable< ^լԼ�������x�U�U���������������ݬ�~�����~�����~��2d�P�������P�P< ^լԼ�������x�U�U���������������ݬ�~�����~�����~���c�P�������P�P< ^լԼ����%���x�U�U���������������������������ݬ������~�����~��bc�P�������P<������i�P[������i�PZ�Z�[�Z�[ݼ�������P��Pcapacity(%d,%d): %ld blocks of %ld bytes (#%xx#%x)
h!^Ь[�X��O�͘���F���@�������ހ�����������������������[�~�����~�����~��ub�P�6��m��#�Z�Z��������xZU�U���������$�������[ݏ���������~�����~��
b�PY	�YX������U�U��d���������g�����d������U�U ����������g�������Y�����U�U�͜�������rg����d���+��͜������dߚ���U�E�?�����Ux��UU�E�&��Z��*��s�Z���������e����͘����XP	lun(%d): %s %s, %s/%s rev=%s
??responded to test unit ready
target %d:
8 ^�����������������������%�������U�0U���ݬ�~�����~�����~��_�P< ^լԼ�������x�U�U���������������ݬ�~�����~�����~��/`�P�������Pݼ�������A~�P(%d,%d): good status
< ^ЬU�U
U�U
�Ѭ�������ЬU�����ЬU�����ЬU�����ЬU�����ЬU�����~������ЬU�����ЬU�����ЬU�����ЬU�����ЬU�����ЬU�����ЬU�����ЬU�� ���ЬU��$���ݬ��:ݬ��ā�P(ݬ�~�����~�����~���^�P�������P�Pnumber of bytes (%d) must be 6 or 10
�X ^Ь[ЬZѬԫ����%���x�U�U����������������������������Z������~�����~��R^�PV	�VP�������d�P͸�������od�P�����������ݏ��C��Pʹ��ʹ��ʹ�X�������������|�k͸�~��?~�PY�����X�Y�kݫ��D���5���{��I���zs�����ᅡ�kW�Wu����(���x�U�U���x��YU�U���x��YU�U���x��YU�U���Y���������X�������Z����X~�����~�����~��3]�PV�VP}�XY�XW��ͼ���8�����UnUͬ�
nUTa�]Tͬ�����ͼ��ͨ�
����ͼ�ͨ�NkUvͬ�TDTUVUTf�#Tnͨ�RgRT~����ͼ�~�����z�P�E�P t=%ds (%.0fKB/s)
read(%d,%d): %d blocks @%d (chunk=%dx%d),Sony WDA-3000sonystatusSLset shelfside lunsetsense [lun=0]senseLS?rel lun [shelfside]relLI?readid lun [start]readidLIIS?media lun start count [file]mediaII?internal test [drive]  # internal -1 for listinternalinq [lun]inqLeject lunejectdiskid [lun]diskidLIILIcopy srclun start n destlun destcopyconfigL?alternate [lun]alternate�D ^Ь[ЬZЬY�[�[�[�[Kj�[��X�X[�o�������xHjU�U����������������Y������~�����~��~Z�PW	�WP�(�Hj�������x����Uʏ���U ����Uˏ���U~��V��hx������Uʏ����U ����Uˏ���U~����:x�����Uˏ���U~����Uʏ����U	Џ�VЏ�V�V����Uʏ����UЏ����	Џ������ߚ���Uʏ����UЏ���	Џ������ߚ���Uʏ����UЏͼ�	Џͼ��ͼ���T��w�X�����Pnot readyreadydrive errorno alternatewritablewrite protect%s,%s,%s,%s (0x%x)
empty (0x%x)
power off (0x%x)
inq(%d,%d): Ь[��Y�Yݬݬ��,��� ���v�[�Z�ZYH�
Z~�
nÎZU�U	�
X� X�X�kU��TxTT�TU��TxTT�TU~�����v�[�Z��
Z~�
nÎZU-�Y)��ί��ʯU��ï�
e�ﴯ�
���l< ^Ь[լ�k���ߐ�����xkU�U��ߔ��ߔ��ߔ��ߔ���ݬݏ�����~�����~��W�P�������P"�Z�Zx
ZU�E���ߪ�k�������Z��P%ld%c(%d,%d): alternate table %d (%d entries)
<"^���ߐ��ߔ��ߔ��ߔ��ߐ,��ߔ���ݬ�,�����~�����~��W�P�������P�/���!�~���t�P[�����������\>KﳎU�e1	Џ�ZЏ�Z�Z>KU�e~>KU�e1	Џ�YЏ�Y�Y>K�i�U�e~���ݚ���U�U	Џ�XЏ�X�X�~�������	�t����U�E�0������{t����nt��"�U�U����"�~����Nt��$�U�U����$�~��O��.t��'�~��&�~�� �~��
��t�P IF-129=0x%x, SY-46=0x%x, SS-30=0x%x
 lower controller=0x%x, upper controller=0x%x,	ROMS:	Unibus-SCSI controller=%s
sUnknownWORMconfig(%d,%d): %s device, '%s', %c controller%s, %c drive%s
U.S. Design 1158T.D. Systems Vikingno doardЬ[��q��sˏ���[Uxˏ����[U	Џ�ZЏ�Z�Z��:���rˏ����[U
����rˏ����[U
�����rˏ����[U$ˏ����[~����r
����vr��u��ir^����������������
�������������������������	�ݬ�~ݬ�
�����~���S�P[�[PF����������������������ݬݏ�ݬ�~�����~��S�P[�[P�P�,^ݬ������/����P�������P�m���[�Z�Z��kUʏ���U	Џ1XЏ.X�X�kUʏ����U	Џ>WЏ5W�W�kUʏ����U	Џ>VЏ9V�V�Z�����
q�kUʏ����U���Uʏ���US��Uˏ����U~�����p��Uʏ���UV��Uˏ����UT��~ʏ����U�U~��F��p)��Uˏ����UT�Tʏ����Uߥa�T~����op��n��bp�Z�[������Z�Z2_�ZY�ZU�UZ�U2�[ZU�eU�[YT�dT�UT��YU�ZU�Y����p�Z~�Y����p�[YU�e~��������2[��_���o�k~������[��<���o�kUˏ����UZ�kUʏ���U �Zˏ����ZUߥa�Z~�����o
�����o�[�kUʏ���U�kUˏ����U~����^o
��s��Oo�[�kUʏ���U�kUˏ����U~��2��)o
��
��o�Plower drive: no disk
lower drive: disk, LUN=%d
upper drive: no disk
upper drive: disk, LUN=%d
no disk
disk shelf=%d%c (%d)
carrier: I/O shelf%d-%d%ddisk in shelf %d%c (%d)ab, return shelf %d%cdisk in drive %donoffno not drive %d: %sready,%sdisk in LUN,power %s,
no diskuse shelf instead of drive for LUN %dwait ejection,wait loading,temporarydisk%s,: < ^�������x�U�U���������������ݬ�~�����~�����~��O�P�������P�PD ^լ
������������ݬݼ����P����PR�������x�U����U������������������ݬ�~�ͼ��~�����~��N�P�������P�P@ ^ݬݼ��^�P����PO�������x�U�U������������������ݬ�~�����~�����~��N�P�������P�P�^Ь[�[���kU�U0�U9ݭ���]ݬ��pЏ����PH�Z�kU�U0�U9�Z
U��T�TU�0UZ�>J����Z�k�a	�k�b��Z�[U�U[�e��ZPshelfside '%s' must be numa or numb< ^լԼ�������x�U�U���������������ݬݏ�����~�����~��M�P�������P/ݼ���"��'k�ݏ������PS�P(%d,%d) disk id block:
^Ь[ЬZ���������������
������[��x���U�U�����������������	�ݬ�~ݬ�
�����~��FL�P[�[PG�������������x��ZU�U���Z������ݬ�Zݬ�~�����~��L�P[�[P�PL ^мY�Y�������Y��I�Ue�"�"J#�#�$E%�'��	���i�Z�J�z��`�J�k��Z�����i�Z�ݬ����ݏ�~ݏ�������P	�P�мU�E�$�����ci��F��Vi�Z����[�Z����~��~��U�E�i��k~����!i�Z�[�ݬ����ݏ�~ݏ���
����P	�P�мU�E�����h��Q���h�Z����[�Z�\��U�E����~��U�E�؆��U�E�͒�kU�E�Î�����~h�Z�[�мU�E� �����_h�。���_������3oݬ������~ݏ���;����P	�P���ͼ���o����[�kU��M��h��~��~�k~�����g����ͼ�~������g�mмU�E�t�����g�����B_������nݬ������~ݏ�������P	�P��ͼ���Wn����[�kU����Tg��~��~�k~��d��:g����ͼ�~��@��%g��ѬЬUԥЬUХ���ݬ����������P	�P���`�Uʏ���U��`�Uʏ����U����UЏ͸�L��a�Uʏ���U��a�Uʏ����U����UЏ͸� ������v������B`�P�мU�E���͸ߏ	Џ7*YЏ3*Y�Y��������<f����]������mݬ����ݏ�͸��������P	�P��ͼ����l����[��Uʏ���U������e��Uʏ����U��k��e���Uʏ����U
��9��e��Uʏ����U
����ye��Uʏ����U
�����_e��~����Ne��Uʏ����U�E�
����-e����ͼ�~��3��e�Z�Z
7~J����U����U�U�[U�eU�E�,��J��~�Z��!���d�Z�������d��h[�Z�Z%�kU��TxTT�TU~�Z����d�Z�[�����d�)���ߐ����ߔ��ߔ��ߔ��ߔ��ߔ��ߔ��ߔ��ߔ��ߔ���ݬ������~�����~��F�Pʹ��ʹ�P��мU�E��}����d����[� ��U��TxTT�TU~��~��~���������c� ��	U��TxTT�TU~��
~��~������c� ��
U��TxTT�TU~��~��~��U��s��c��U��TxTT�TU~��U��TxTT�TU~��
��^c�Pbackup mem(0/%d/%d)
sys controllower driveupper drive%s(%d/%d/%d)%c%s: component(fatal err/err/cmds)

 %d:%ddiagnostic count (drive:avail):test %d[%s]: %s
diagnostic not performed: %s (last error code 0x%2.2ux) disk-fault drive-fault controller-fault no faultsdiagnostic result:upplowdrive %d[%ser]: %s
drive %d not occupied
internal 3 (%s):
 (time: %lds)
	failed, error codes=#%x, #%x, #%x	ended normallyinternal 2 (%s):
%s[%s]: %s[#%x] (%s)
Diagnostic #E4: last 16 errors; initiator[identify] error[sense] (cmd)
internal 1 (%s):
[%d] %s (%d,%d)
Diagnostic #E5: last 16 internal tasks (drive,shelf)
internal 0 (%s):
	internal %d: %s
available internal commands:
read data compareECC margin checkwritesearch writable areawritten sector searchblank sector searchseekmoveread disk iddrive on/offurk 15urk 14urk 13urk 12urk 11urk 10urk 9urk 8urk 7urk 6urk 5urk 4diagnostic aborted: write area fulldiagnostic aborted: write-protectdrive connected but no diskdrive not connected or powered offjukebox statusdrive controller diagnosticsscsi control board diagnosticsarm controller diagnosticserror information tableinternal command table^Ь[ЬZ�������x[U�U���������
������
��լ�X�X�X������[��Z��x��ZU�U��x��ZU�U�����	�ݬ�~ݬ�
�����~���?�PY�YPJ�������x[U�U���������������ݬݏݬ�~�����~��?�PY�YP�P�P^Ь[ЬZ�k���Ыͼ�Ы͸������XѬE��Kݼ��c�P����*��.ݼ��	V�PXݼ�Z��D�P�~�Z�����������P	�P�d��`�Uʏ���U��`�Uʏ����U����U����D��a�Uʏ���U��a�Uʏ����U����U����������v�Z��Sa�P�������������Џ�5ʹ�	Џ�5ʹ��ʹ��ͼ�U�͸�T�TUS�S~�U�T�����\�Xݼ����k\��ɕ��ŕU�ユ�
e�ﯕ�
���R�����W�W�*�W��Q������`������b�PG���W�Џ�5�ԿЏu5���Џ[5���ЏA5��Џ'5��Џ5��Џ5��Џ�4��Џ�4��Џ�4�}�Џ�4�v�ЏVЏ������������W�W��G�@��W��ͼ�W�͸����������Z���������W����������P	�P�J����Y����U�YU���X"�hШU֨�ie�X�i~��~Q��iU�UV��YWU����T�TUͰ�����d����^����U�U�F�UͰ�~�����Z����U�U����U-����������ܓU��Փ�
e��Ɠ�
���P�iV�Ͱ���U�E�%��)��������W�����������Z���������W������^����P	�P�(����Y�������X"�hШU֨�ie�X�i~��`P��iU�UV��YWU����T�TUͰ�����d����^����U�U�F�k��UͰ�~����xY����U�U����U-������’�メU�﷒�
e�晴�
���O�iV�Ͱ���U�E�������)����X$�hШU֨�e�Xݏ��O��V���YWU����T�TUͰ�����d����^����U�U�F�UͰ�~�����X����U�U����U-�����������U����
e��ڑ�
��OЏV�Ͱ��������)�﷑�ﳑU�﬑�
e��
���N��d��#X��������4����U�E�� ����U�E�ڻ�E�ӿ�����W�������
���W�P
%d %s, 	%d %s@%d, uncorrectable (alternated)>96% burst (alternated)50-96% burst (alternated)<50% burstread error 3 (alternated)unwrittenread error 1 (alternated)seek error 3 (alternated)seek error 2 (alternated)seek error 1 (alternated)goodrare error 0x%x stored in '%s'upperlowermedia margin check for %d blocks [%d-%d] on %s drive (%d,%d):drive %d not occupied and ready
w-v^Ь[��y�������(���x�U�U���x��[U�U���x��[U�U���x��[U�U���[���������������ݬݏݬ�~�����~��,6�P�������P��^Ь[мX�W��X�ѬЬUХZ"�ZZ�W�[�����~�X��<����Pp�ZЏ����Y�W�Z����YU�[�����Z�X������P
�ZY�� �Z��Y�Z��k��%U�PN�[�����Y�X�������P�P4ݏ���&���X���[������X��X��-������T�P(%d,%d): '%s'
read(blk=%d) failed
%d: �T^Ь[ЬZ�k��ЫYЫ��Ы��Ы����—���ﺗ��Э�Ͱ�Э�UЭ�T�TUS�S~�Uݭ�ݭ��TYU�U~�Yݭ�ݭ���U�	�1T�Z�ʹ�������P	�P�P��<�Uʏ���U��<�Uʏ����Uѭ�Uԭ�A��=�Uʏ���U��=�Uʏ����Uѭ�U���ݭ�����Z��:X�P����
����������u��ͬ���vZЏ������խ��Eݭ�ݏ��S�PVy�Z��V�Yݭ�ݭ���s�PX�X[�XY�X���X���XVIǏ'YU�U���Ǐ'Y��߭����Y߭����=�Pŭ��'~������R�r���ݭ�ݏ��R�PV�L����Z�~�V�Yݭ�ݭ�����PW�W�*����Zݭ�ݭ�ݭ��W�Yݭ�ݭ�����P�����WY�W���W��Ǐ'YU�U���Ǐ'Y��߭���FY߭���,=�Pŭ��'~��.��8R�I���߭���Y�ͬ��խ����ݭ������	Rխ�ݭ�ݭ��Y�����Q�P#�Ͱ�UNUTN��SFSTVT~�U��t���Q�P8 ^Ь[ЬZЬY�������x�U�U�����������������������x�U��U��x�U��U������x��ZU�U��x��ZU�U�	�x��ZU�U�
�Z��x��[U�U��x��[U�U�
�x��[U�U��[��x��YU�U��x��YU�U��x��YU�U��Y��ݬ �~����������~��2(^Ь[��Z�[�Pc�[�Џ[ݬ����ݬݬݬ�������P	Џ����P/����Y�[U�[�U�iU��D�U�ZT�UT�Y�����U�UYP%d blocks at %.1fKB/s
copy buggered up: sbase=%d nblks=%d dbase=%d
%ds: 	doing block %ld at %sdrive %d not occupied
copying drive (%d,%d)[%d-%d] to drive (%d,%d)[%d-%d]
<#ff><#fe><#fd><#fc><#fb><#fa><#f9><#f8><#f7><#f6><#f5><#f4><#f3><#f2><#f1><#f0><#ef><#ee><#ed><#ec><#eb><#ea><#e9><#e8><#e7><#e6><#e5><#e4><#e3><#e2><#e1><#e0><#df><#de><#dd><#dc><#db><#da><#d9><#d8><#d7><#d6><#d5><#d4><#d3><#d2><#d1><#d0><#cf><#ce><#cd><#cc><#cb><#ca><#c9><#c8><#c7><#c6><#c5><#c4><#c3><#c2><#c1><#c0><#bf><#be><#bd><#bc><#bb><#ba><#b9><#b8><#b7><#b6><#b5><#b4>disk rotatedisk releasedisk set<#b0><#af><#ae><#ad><#ac><#ab><#aa><#a9><#a8><#a7><#a6><#a5><#a4><#a3>carrier movedisk check<#a0><#9f><#9e><#9d><#9c><#9b><#9a><#99><#98><#97><#96><#95><#94><#93><#92><#91><#90><#8f><#8e><#8d><#8c><#8b><#8a><#89><#88><#87><#86><#85><#84><#83><#82><#81><#80><#7f><#7e><#7d><#7c><#7b><#7a><#79><#78><#77><#76><#75><#74><#73><#72><#71><#70><#6f><#6e><#6d><#6c><#6b><#6a><#69><#68><#67><#66><#65><#64><#63><#62><#61><#60><#5f><#5e><#5d><#5c><#5b><#5a><#59><#58><#57><#56><#55><#54><#53><#52><#51><#50><#4f><#4e><#4d><#4c><#4b><#4a><#49><#48><#47><#46><#45><#44><#43><#42><#41><#40><#3f><#3e><#3d><#3c><#3b><#3a><#39><#38><#37><#36><#35><#34><#33>readmoveseek<#2f><#2e><#2d><#2c><#2b><#2a><#29><#28><#27><#26><#25>disk outdrive offdrive onrecalibratesense drive status<#1f><#1e><#1d><#1c><#1b><#1a><#19>diagnostics<#17><#16><#15><#14><#13><#12><#11><#10><#f><#e><#d><#c><#b>error margin check<#9>sense alternate information<#7><#6><#5>recover disk warning<#3>version checksense resultnop<#ff><#fe><#fd><#fc><#fb><#fa><#f9><#f8><#f7><#f6><#f5><#f4><#f3><#f2><#f1><#f0><#ef><#ee><#ed><#ec><#eb><#ea><#e9><#e8><#e7><#e6><#e5><#e4><#e3><#e2><#e1><#e0><#df><#de><#dd><#dc><#db><#da><#d9><#d8><#d7><#d6><#d5><#d4><#d3><#d2><#d1><#d0><#cf><#ce><#cd><#cc><#cb><#ca><#c9><#c8><#c7><#c6><#c5><#c4><#c3><#c2><#c1><#c0><#bf><#be><#bd><#bc><#bb><#ba><#b9><#b8><#b7><#b6><#b5><#b4><#b3><#b2><#b1><#b0><#af><#ae><#ad>no disk in LUNreservedmedium removal preventeddrive not readyunit attentionunacceptable diagnostics parameterillegal parameterillegal parameter lengthillegal shelf numberillegal logical addressreserved bit nonzeroinvalid LUNinvalid command<#9f><#9e><#9d><#9c><#9b><#9a><#99><#98><#97><#96><#95>drive error (SONY)<#93><#92><#91><#90><#8f><#8e><#8d><#8c><#8b><#8a><#89><#88><#87><#86><#85><#84><#83><#82><#81><#80><#7f><#7e><#7d><#7c><#7b><#7a><#79><#78><#77><#76><#75><#74><#73><#72><#71><#70><#6f><#6e><#6d><#6c><#6b><#6a><#69><#68><#67><#66><#65><#64><#63><#62><#61><#60><#5f><#5e><#5d><#5c><#5b><#5a><#59><#58><#57><#56><#55><#54><#53><#52><#51><#50><#4f><#4e><#4d><#4c><#4b><#4a><#49><#48><#47><#46><#45><#44><#43><#42><#41><#40><#3f><#3e><#3d><#3c><#3b><#3a><#39><#38><#37><#36><#35><#34><#33><#32><#31><#30><#2f><#2e><#2d><#2c><#2b><#2a><#29><#28><#27><#26><#25><#24><#23><#22><#21><#20><#1f><#1e><#1d><#1c><#1b><#1a><#19><#18><#17><#16><#15><#14><#13><#12><#11><#10><#f><#e><#d><#c><#b><#a><#9><#8><#7><#6><#5><#4><#3><#2><#1><#0>not connected or power offdrive not ready (no disk)diagnostic could not be donetest not donegooddis/reconnect-LUN 7dis/reconnect-LUN 6dis/reconnect-LUN 5dis/reconnect-LUN 4dis/reconnect-LUN 3dis/reconnect-LUN 2dis/reconnect-LUN 1dis/reconnect-LUN 0no dis/reconnect-LUN 7no dis/reconnect-LUN 6no dis/reconnect-LUN 5no dis/reconnect-LUN 4no dis/reconnect-LUN 3no dis/reconnect-LUN 2no dis/reconnect-LUN 1no dis/reconnect-LUN 0<#d7><#d6><#d3><#c4><#c3><#c2><#c0>7<#2d><#2c><#2a><#28><#25><#1e><#1d><#1c><#1b><#1a><#18><#17><#16><#15><#12><#c><#b><#a><#8><#3>1<#1><#0><#ff><#fe><#fd><#fc><#fb><#fa><#f9><#f8><#f7><#f6><#f5><#f4><#f3><#f2><#f1><#f0><#ef><#ee><#ed><#ec><#eb><#ea><#e9><#e8><#e7><#e6><#e5><#e4><#e3><#e2><#e1><#e0><#df><#de><#dd><#dc><#db><#da><#d9><#d8>disk releasedisk set<#d5><#d4>request recovered status<#d2><#d1><#d0><#cf><#ce><#cd><#cc><#cb><#ca><#c9><#c8><#c7><#c6><#c5>recover disk warningsense alternate informationread disk id<#c1>disk eject<#bf><#be><#bd><#bc><#bb><#ba><#b9><#b8><#b7><#b6><#b5><#b4><#b3><#b2><#b1><#b0><#af><#ae><#ad><#ac><#ab><#aa><#a9><#a8><#a7><#a6><#a5><#a4><#a3><#a2><#a1><#a0><#9f><#9e><#9d><#9c><#9b><#9a><#99><#98><#97><#96><#95><#94><#93><#92><#91><#90><#8f><#8e><#8d><#8c><#8b><#8a><#89><#88><#87><#86><#85><#84><#83><#82><#81><#80><#7f><#7e><#7d><#7c><#7b><#7a><#79><#78><#77><#76><#75><#74><#73><#72><#71><#70><#6f><#6e><#6d><#6c><#6b><#6a><#69><#68><#67><#66><#65><#64><#63><#62><#61><#60><#5f><#5e><#5d><#5c><#5b><#5a><#59><#58><#57><#56><#55><#54><#53><#52><#51><#50><#4f><#4e><#4d><#4c><#4b><#4a><#49><#48><#47><#46><#45><#44><#43><#42><#41><#40><#3f><#3e><#3d><#3c><#3b><#3a><#39><#38><#37><#36><#35><#34><#33><#32><#31><#30><#2f><#2e>written sector searchblank sector search<#2b><#29><#27><#26>read capacity<#24><#23><#22><#21><#20><#1f>prevent/allow medium removalsend diagnosticsreceive diagnosticsstart/stop unitmode sense<#19>copyreleasereservemode select<#14><#13>inquiry<#11><#10><#f><#e><#d>moveseekwrite<#9>read<#7><#6><#5><#4>request sense<#2>rezero unittest unit ready<0^լԼ�������x�U�U��������� ������ݬݏ���������~�����~����P�������P>ݼ��H|������8ݏ��������������������8�P^��ЬU��[�[�[!�[I�[
.B���ݬ��=�X��^ݬ���<�B��Hݬ���<�,ЬU��U�UЬU��~��F�U��<ЬU��Uʏ����U�E�j�������<���ݬ��#=ЬU��Uʏ���U>ЬU��T��
SxSS�ST��	UxUU�UT~�������B<���ݬ���<ЬU��U�E��i��}�����<���ݬ��<��Uʏ���UIЬU��T��SxSS�ST��SxSS�ST��UxUU�UT~�������;���ݬ��P< info=#%x, ext sense: %s at addr #%xsense: %swarning: extra data is %d, not 4! no errorkey #fmiscomparevolume overflowkey #caborted commandcopy abortedkey #9blank checkdata protectunit attentionillegal requesthardware errormedium errornot readyrecovered errorno sense%s
sense(%d,%d): <#ff><#fe><#fd><#fc><#fb><#fa><#f9><#f8><#f7><#f6><#f5><#f4><#f3><#f2><#f1><#f0><#ef><#ee><#ed><#ec><#eb><#ea><#e9><#e8><#e7><#e6><#e5><#e4><#e3><#e2><#e1><#e0><#df><#de><#dd><#dc><#db><#da><#d9><#d8><#d7><#d6><#d5><#d4><#d3><#d2><#d1><#d0><#cf><#ce><#cd><#cc><#cb><#ca><#c9><#c8><#c7><#c6><#c5><#c4><#c3><#c2><#c1><#c0><#bf><#be><#bd><#bc><#bb><#ba><#b9><#b8><#b7><#b6><#b5><#b4><#b3><#b2><#b1><#b0><#af><#ae><#ad><#ac><#ab><#aa><#a9><#a8><#a7><#a6><#a5><#a4><#a3><#a2><#a1><#a0><#9f><#9e><#9d><#9c><#9b><#9a><#99><#98><#97><#96><#95><#94><#93><#92><#91><#90><#8f><#8e><#8d><#8c><#8b><#8a><#89><#88><#87><#86><#85><#84><#83><#82><#81><#80><#7f><#7e><#7d><#7c><#7b><#7a><#79><#78><#77><#76><#75><#74><#73><#72><#71><#70>carrier errorshelf errordrive 1 errordrive 0 errori/o shelf errorhook servo errorroter servo errorz-axis servo error<#67><#66><#65><#64><#63><#62><#61>no data in specified address<#5f><#5e><#5d><#5c><#5b><#5a><#59><#58><#57><#56>tracking erroruncorrectable read errordata could not be readall address could not be readaddress block not foundspecified address not found<#4f><#4e><#4d><#4c><#4b><#4a><#49><#48>alternation troubledisk warningwrite protect error 2write protect error 1cannot read disk iddisk errorwrite errorwrite warning<#3f><#3e><#3d><#3c><#3b>disk already exists in shelfdisk already exists in drive<#37><#36><#35><#34><#33>drive not readyno disk in drivedrive power offdrive error<#2e><#2d><#2c>over laser powerunder laser powerwrite modulation troublehead lead outskew troubleslide trouiblespindle troubletracking troublefocus troubleloading troubledrive interface parity errorcommand not terminated<#1f><#1e><#1d><#1c><#1b><#1a><#19><#18><#17><#16><#15>scsi hardware/firmware errorSONY I/F II hardware/firmware errorcontroller errortime out errorecc trouible occurred<#f><#e><#d><#c><#b>copy aborted<#9>message reject errorparity errorunit attention<#5><#4>illegal requestrecovered errorinvalid commandno senseWren VIwrenIIIIImodeselect er-param er-retries read-recon write-recon cache-enablemodeselectmodesenseextinqdiag\ ^���������������`������ݬݏ`�����~�����~��j�Pͤ��ͤ�Pf�ͼ��������5�ͨ��������$�������ͨ��ͼߚ���U�E�A����Ux��UU�E��@�~��o��
�	�.,�Pinq(%d,%d): %s %s, %s/%s rev=%0.4s serial=%0.8s
8 ^���ߐ��ߔ���x�U�U��ߔ��ߐ��ߔ���ݬ������~�����~��x
�P[�[Ph��
��+�[�[;�K�ab��
�Ux[T�TT�TU	Џ>kZЏ<kZ�Z��;
��Y+�[����~���~���	��>+�P< ^����������x�U�U������������ݬ������~�����~���P�������P3��	���*����~��X	���*����~��-	��*�P8 ^���ߐ��ߔ���x�U�U��ߔ��ߐ$��ߔ���ݬ�$�����~�����~��6�P[	�[P�(����Q*���UxUU���T�TU~���UxUU���T�TU~���UxUU���T�TU~���UxUU���T�TU~���UxUU���T�TU~������)���UxUU���T�TU~��
�UxUU���T�TU~���UxUU���T�TU~���UxUU��
�T�TU~��[��)��A��)�[�[;�K�q`���Ux[T�TT�TU	Џ>kZЏ<kZ�Z��+��I)�[������8)�P< ^����������x�U�U������ ������ݬ� �����~�����~��
�P�������P2����~����UxUU����TxTT����S�ST�TU~��C��(�P8 ^���ߐ��ߔ���x�U�8U��ߔ��ߐ��ߔ���ݬ������~�����~��0
�P[	�[P�����K(�[�[;�K�T_��
�Ux[T�TT�TU	Џ>kZЏ<kZ�Z�����(�[���
�Uˏ����U~��J���'���~���~��
�~���~���~������'�PЬ[��k�����'�[�~������PZ�ZPV�[�~��Q����PZ�ZPA�[�~�������PZ�ZP,�[�~��-����PZ�ZP�[�~������PZ�ZP�P8 ^Ь[ЬZ��/�� '�kU�U��U�kU�U�U������&ЫU�U��Uݫ������&ЫU�U��Uݫ����&ЫU�U��Uݫ��[��&ЫU�U�(�U$ի	Џ
iXЏ	iX�X����d&�����W&��_����
���)�kU�U��UЫU�U����U�������������������������Z������~�����~���PY	�YP�L����������%���U�U���kU�U�	�U�k��ЫU�U�
�U��������������������������Z�~����������~���PY	�YP��ЫU�U��UЫU�U����U�������������������������Z������~�����~���PY	�YP�N����������	$ЫU�U�
�U����ЫU�U�
�U��������������������������Z�~����������~��'�PY	�YP��ЫU�U���U�����������8�������������Z������~�����~����PY�YPn����������)#���U�U��ի���U�U������������������������Z�~����������~��Z�PY�YP�P
sleep(10); kill me if you disagree
disencache %sable, write-recon=%d/256, read-recon=%d/256, er-retries=%d, er-param=%d(=#%x), changing modes to mode sense(%d,0):
	prefetch: thr=%d max=%dx%d min=%dx%d
, cache size=%d
cache control:
	WIERSVDCacheEnabledrive geometry:
	%d cyls, %d heads

	drive type:	%d alt sec/%d alt trk per zone(=%d trks), %d alt trks per vol
	sec=%dB, trk=%d secs, interleave=%d trk skew=%d cyl skew=%d
format parameters:
SoftSecHardSecRemoveSURFINS write reconnect=%d/256
	read reconnect=%d/256,disconnect/reconnect:

	%d retries, max ecc span=%d
~ %s%serror recovery:
	AWREARRETBRCEECPERDTEDCR8 ^�~���'�P[����������������������ݬ�~�����~�����~��k�PZ	�ZP�����������������������ݬ������~�����~��'�PZ�ZPf�~��6'�[P[�[����7 ����U����U��^�� +����~����~����~����~����~����~��
����P	error==#%x,#%x FRU=(#%x,#%x,#%x,#%x)
	no errors
selftest diagnostic (%ds)
�^Ь[��Џ��������V5���q��a�P�V��[ݬ��Џ����P��[	Џ@ZЏ�ZЬU��T�ZT�߫ݬ��VV��?&�P���[U�PU2���ݬ��>��,V��	Џ�����VЭ�P�լA�$�~ݬ���U��!�P���$�U�PUZѭ�$������~ݬ����ì$~ݬ��U��y!�P����Qݬ���g���ЬU�$���$լ��U��	Џ�����qU�P^Ь[ЬZ����ЬU��ca��Zݬ�[ݬݬݬ��b����P���"��������P�S�Z������#�j���횫����.�������ЬU��U�U��������d�������Zݏ�����[�~�����~�������P�������P����Tn��&Uʏ����U�U^����U�����UQ�������ЬU��U�U����������������Z��[�~�����~��q����P������������Pf��C`Џ|q�6`ݏ����߫$��"`�����������Yx�����Uʏ����U�E��SY�Y���Z��!�P�P%s; %sreservation conflictintermediate good/metintermediate goodbusyreservedmet/goodcheck conditiongoodscsiio readscsiio write/dev/scsi< ^լԼ�������x�U�U���������������ݬ������~�����~��y����P�������P�ݼ���^���������Uʏ����U����l����Uˏ����U~����Uˏ����U~����Ux��UUˏ����U~��9��1����Uʏ���U+����U����TxTT�TU����TxTT�TU~�������������P�^Ь[�kUx��UUˏ����U��ѭ�d�kUʏ���U4��~��~��~��~��Uʏ����U�E�R��~ݬ��
B��Uʏ����U�E��Q��Gݬ����kUˏ����U~ݭ���ݬ���sense: class=#%x, code=#%xextended sense: %sextended sense: %s info=#%2.2x#%2.2x#%2.2x#%2.2xreserved (#f)miscomparevolume overflowequalaborted commandcopy abortedvendor specific (#9)blank checkdata protectunit attentionillegal requesthardware errormedium errornot readyrecovered errorno sense
, addr=0x%xerror class=0x%x, code=0x%x, sense=0x%xno error
sense(%d,%d): ��\U	�U�Y���[ݬ��8ݬ��!���[U�E�c
ݬ��ݬ���%s: %s%s: unknown errno %dЬ[ЬZ�kU�U 
�Z�[�Z��[ZU������UY�Y[�iU�U �Y��[YU�U�UZ�U�[ݬ��B��ZU�eЬ[��ZxZU��T�TUZxZU��T�TUZxZU�kT�TUZ�ZP�� ^�Zլ��ݬ� ��N�PY�Z=�Y 8�Yݬ߭����P%� ���U����ݬ��(��Yݬ߭����W�Z��ݬ���ЬX�[�[YO�[~�nÎ[U$ЬU�eЬUХT֥� dݬ� ��
ЬU֬�e~��Qݬ���[�ЬU�eЬUХT֥�
dݬ�
��U
��ݬ��q�[�[Y��[~�nÎ[U$ЬU�eЬUХT֥� dݬ� ��
�hU�U �U���~��ݬ��C��V�V	�V
$��ݬ���"��tݬ�����_ݬ����[�S���ЬU�eЬUХT֥�
dݬ�
��r�Y��YZ�����Z��
ݬ��%5.5d
..\t\n %c     %2.2x%5.5d*
�^Ь[�Z�Y�kP�P	�P �P+�P-�Y�[�[��
ZP��Q�QP�0PZ�k0�k9��Y�ZP�ZP���P�^ݬ��
�P�����^߭����2��P�<P�P���߭���v�PZ����ZP1Ъ[Џ�Y�YXЏVԭ�Э�������Wx�WWP�PP�PP��b�P�P�_�WWP�PP�PP��c�PѪPH�WWP�PP�PP2�f�Y�WWP�PP�PP2�h�X�WWP�PP�PP��d����WWP�PP�PP��e����W�W�'�1|��YX�Y���XYЭ�X�V���VV�Y�Z��R���PY�X�Z��B���PX�[Y�[Y1
�Ѫ��[X�[X�Ѫ��V��߭���T�PZ֪ 1���^Ь[ЬZ�Z:ݫ��lmP�PZëZP��P���P�PQ�Q�QPQ�QZP�^Ǐ�Q�Pď�QP�P���Ǐ�Q���խ����Q��׭����Y�<��P�<P�P����<��Z�<ZP�<P�PZ��<Z�Z���p��P�PQ�Q�QP�[�խ�DЏFZ�:�����Zѭ���:��Z���P���Z�Z��ѭ�P�:ЏFZ���:���Zѭ��O�����Z~��Q�P���Zխ���Z��Э�[�[���Z��+�P�n��J�Z
�J��I[�Z�[J��I����I�[��Z�����cP�^���~[���IZ����ЬP��Q�A��IZ���~[����������[��Y�iP�@��IZ����������y�[���P[�Y��di~�[���P[�Y��di~�[��~�P[�Y��di~�[��g�P[ЬPѠ�d�2��0��[ЬP��d�~�[��5�P[��~P�^��PxPP�P�PЏnPЏmP��^Ь[�[Ѭ
�
�P�
PQ�
Q�QPQ�0Q�� ��
�P�
P�P�P�0P��[P^��#~P��~�P=����H���P��(�[����ݭ���i�P����[�m}ݭ���5����[[P�PP�PP�@�U}�������P��[�[
���^Ь[ЬZ߭��[���P[�P1�����l�j����k���j��l��j߭��[���P[ʱ���l������k������l����Z~�[��L�P[�߭��[��;�P[������Z~�[��$�P[1j�߭��[���P[쐭���P�^Ь[ЬZ�[�kP����kP����P%�Y�
YP��Q�QP�0PY�kP����Yj�[P�^��|
��{|�z|0ݏݬݬ����P���P1�Ь�N|�����H|��>|[�[�[�6|�k
��[�(|
��|�����|Z�[�|�ZPo���{ZЬ[����Z��{�ì[P�P�~�[ݬ��W�P��1m��[P��{�[�[�{�k
��[�{�[���[�{ЬP�~�~,DNhz����������#�2�B�Q�b�v���������΀ۀ����0�:�P�f������Error 0Not ownerNo such file or directoryNo such processInterrupted system callI/O errorNo such device or addressArg list too longExec format errorBad file numberNo childrenNo more processesNot enough memoryPermission deniedBad addressDirectory not emptyIn useFile existsCross-device linkNo such deviceNot a directoryIs a directoryInvalid argumentFile table overflowToo many open filesIllegal ioctlText file busyFile too largeNo space left on deviceIllegal seekRead-only file systemToo many linksBroken pipeArgument too largeResult too largeLink loopConcurrency violationIt's all Greg's faultSecurity label violationNo such system callOut of security labelsInadequate privilege�^���ݬ���Ь[�ZЬYЫP֫�`P�Z��Z
׬�k��[���PZ��Z	�Y��P��ЬP�^Ь[�����
Џ����P1����ݏ��h�P���ի��ߘ�P�@�iw����[�����AC
��.C��_���~Џ~ݫ��~���PkЫ��k!�k���������
��� ��k1Q�ЫP֫�`P�^Ь[��5J��-J��O��	������������0�Џ����P1����$ЫZi�[���9����Z\���R\���א����X�X߭���~����PY�kVݏ��#�PZ�Z�������Y�YX �Z�Y�YX�Z��Y�Z��~���PYЏ�k����Z��XY� �1E�ЬP�^Ь[2�Pʏ����P�PHЫZB�Z�Y;�Z������PЏP�Pk�Y�Z��~��=�PY
� �Џ����P�P�^��EA[�����	�[��t����[�[�H��^Ь[Џ����Z���A��<�[��>����PZ��~��`����PЏ����Z��
ݫ������ԫ�����k�ZP�^Ь[��@X�X�H�P1�X���瑫+�P�P�PY�k�w+ݏ�ݬ���PZ�Y1��Z��Z�������{�k�aj�Y�~�~ݬ����PZ<��!J3ݏ�ݬ��J�PZ�Y�Z�Z��r����ݬ���PZ�Z'���Z����Y�~�~ݬ��_�PZ�Z1 ��h�Z��Y���k�r�����XP^ЬP�����ݬ��t	ݬ߬ݬ��2�P[ЬP���QѠQݬ������ݬ��<	ЬP��	Џ����P�[P�^�Z��s[
��D��Z��Z�Z��kݏ���uF��ݏ���`G���Ь[�kP��D���P��D��k��6G��HsP�^Ь[ЬZ�[���Y��D���Y���׬�լ�j�[�[��YkìZP�P�^Ь[ЬZլ�P<��Y��D���Y�����Y��D���Y
�[�[�׬�լ�jìZP�P��(���~���PZ�Z2<�Z7�
ZP�
P�PZP�PP�PP�@�gsY�i[�kP�[P�P�ZP
�[�ki�[P�Z���^Ь[��GZ�X�j3�Z�G�ij�jY�i��[[P�PP�ZP�YP�[[P�PP�ZP�PZ1��ZY�jZ�ZY��X�X	���FZ������PZݏ��[~��
x
PX�XXP�PP�ZP�PZxX~���PY�Y�����$�[XP�P�PX�[XP�P����P19��P���xX~�Y��-1��[[P�PP�P�4F�Y�-F��%F�,r�j�F��Fj�Z�F	�Y��E���E���EY�Y��E��ZPЬ[X�[�kP�[P�PY�Y2:�Y5�
YP�
P�PYP�PP�PP�@�qX�hZ�jP�ZP�P�YP�Z��[h�[~���^Ь[�[�[�iE�[�^E�[�UE�k�^��q[ԭ��Z�Z�����֭��jk�kZ��[�[�`��Э�P�^ЬZ�ݬ��	�PP�PP�ZP�P��Э�j�Z��DW���D[���DYЭ���D�[P�ZP�ZP�ZP�Pk���P�YP�YP�YP�P�����D�D���D���^Ь[ݬ��������	�[�������[��P�P�����~��i�PW�W~������PX�X[�XP�W���W���[Z�XYЊ�Э�P׭��P��X[��WWP�PP�XP�P[��WWP�PP�XP�[P�P���o@h�ЬT4}�Q�QR+�RSя��T)���ac��T�)Tac�caP�PP�P@ЬV#}�S�TQя��V(���ac��V�(VacЬP�ЬV'}�S�TWя��V,lW���c��V�,lWVcЬP�^Ѭ�ЬPЬP��^ԭ�Э�P�@�c
Ь@�zc�P�!����P��^��`9�����I9��6��<9߬ݬ����P[���P��)9P��9��I������	9�����9	Џ����P�[P�^�[ЏUUUUK�eB�Џ����K�UB��̏����K�DB����[�[���tB��qB�[��S�PZ��ZBP�PQ�A�BQ�[ R�[RQQ�Q@��A��;BP�PQx[A��AR�R@��A��B��[[�[ ��^��B���A���A���A���AP���AQ�A�A@�A���AP�@�AP�PPʏ���P�^��A��A��A��A��AP��AQ�A�>A@�8A��vAPˏ�@�%AP�^��XA��QA��NA��GA��=AP��:AQ�A��@@��@��"APˏ�@��@QnQPf�AP�^Ǭ����PĬP�P����[���@���@���@���@���@P���@Q�A�y@@�s@��@Pˏ�@�`@Z�Z[�ǬZPĬP�PZP�^м[��}@��[�t@м[��n@��[�e@���[�K�Z�K�@K��ZK�@�[���|������,@�~��\S�^\��S��@P���@��7Ь��?�P�^Ь[��u=��m=�������H���ի��
ݫ��|�������Ь���Ы��k�^ԭ�լ1�ݏ����P����]k��R�P;ݭ�����խ�����P��ݭ������Zݭ���aNԭ�խ� ѭ��í����­��¬�������!���t�P��ݬ������^���j����^��B��Ь��Џ���߭�߬ݬ��~�P[׭��PЭ�Q֭��Pa߭���������[P�^��B��Ь��Ь��߭�߬ݬ��1�P[׭��PЭ�Q֭��Pa߭��������[P�Џ��X}�V�VQ:Xa��QS:Xg
(Xgc�QW������WQ�Q(Qgc�VP}�R:���b:S���b�QR������RQT�T:STb�QP}�S�ST�P:���d)���dc�QT������TQ�Q)Qdc	�cP�aQ�QP�}�V�VS:���g(���gc�QW������WQ�Q(Qgc�VP�^ݬ��)�P~��N����P���P�Pݬݭ������ЬR�RQ:���a��RQPЬT�PЬQЬS�QS�Ï��TUЏ��T�QR:Ta�U�RQT�T�RQ)Tac�caP�PP�UT��ЬUC}�S�TV�URЏ��Y�YUX�YU:Uf�VQU�X�YRW�YR,UfRc�WR	�XU��U�ЬP�
ЬQ�Pa�#ЬPЬR�R�Q{RPPR�PR�P�P��P�^� ��$Э�P�@�\�@�\���@��[���׭�խ������P��;�P������	

 !"#$&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~���������������������������������������������������������������������������������������������������������������������������������T7��R�B�����d�ݭ��R�������P���֭�������S}��T�T��P���R�P�T��S�C�����R�Q�S��T�P�}T���P���R�P��P�Q�R���Э�P����^Ь[Ь��Ь\ԭ�<���P�[Q}��T�QUR�PR�RP0r��Q[�Rܕ���^U|Y|V��P�P �X����������������������������������������������������y���������������$
���������������y���P�1��1�ȏ@Z� P11��XP�Z�PЌR:Pb�QU�RQ1'0123456789abcdef0123456789ABCDEF�R�S������W�R�S������W�Z������W�SV�Q�UЌP�RSPQ�Ag��VR��|V�e;0��Z1}լ�1u�S��xP�Z��XP�Pq�W�0qYʏ�Z�lP�P
n4
n� 
�
n� ��
n���
n�W8
n������; ��W�Z�+q�Z� q�W�Z�X�QUV�WV�VX&�WQ�Q�H� R�]R�RX(VaHa,a0X��W�Q�VSU�QUX�XYP �Z�ZR�WP	�PX�PY0)��XYP7�XY�XP0��R�P��R}��T�T0���R�֭�}T����YP1b�1]��0R� R�PY�Q�PW�P^,`RWn�WP�^Q0���W^ЎQЌP�P��^Q1i�ȏ�Z1L�� Z1F��Z1@��Z1:��Z�Z�Z�Z�IiY>I��Y	�HhX>H��X�Z1��X�Z�Z1��Z
ЌY��Z�YY�ЌX��XX��Z�X0����XW�WV�W�W�W�WP�PnW�#�V�WP֭��W�P�H���W�x��WP���@���Q�WV��S�����0��0S��,a��Vc�c8Va�0��VUQ�nS�W���-��WЭ�P�0��PV�VP�PV�P��(PacЭ�P,a0Pc�XP�Z�	Z�.�έ�P�PX�XP�PX,a0Pc�XP�PV�VP�PX(Pac�XP�@� R�]R�RP�PX�PX,a0Pc�SU�DeB+��X�Z�X0��XW�W�W�WP�PnW�֭��WP�P�=���W�x��WP���@��Z=��Q&�QV���P�Pn8n����e�VQ�Z1,�� ��1%��WV�XЭ������1�����P0�P�PX(�WV�PX��Q0���Z�	Z�u0��e.�U�Z�1����Q0���Z��Z�X�X�X�Z1.�1+����p�U1�rUU����UR���R�;R���R���RƏ�R0�qPU�R�R���RR�R
d��U�R�	R�\tPTUPU�P	��	��t�UPU�P��XW�����юn���W�W	qU�� ������P����pP�T~�MS�R�RR�R�TRdcP�S�T��RgPP�R������Q�RR�(RS�S�A�����Q�B�bT B�CG@�M �[���u��+��pPB<��Vvӈ�b��2>H�QS'���I[��������#,;
���:��ܒ��X�����QP�%�\����PЬPЭ`Э��PЬP�PЬQ�aP���P����Q�
���Q��a�(Џ������7����^�С��ݏ����v���longjmp botch
�0�������,����p
���L���J�����t�lpd��^JFx@@�`
;#@��hp���
����	����
;�|q��	�	�	v	n	d	_	X	4$!����7��!� ������!@��~:"x[U�.N;7�63$!S���������S�00111222??C/�-�-o-P-3-$--�,�,�,�,�,�,�,�,{,t,m,f,_,X,Q,D,7,2,-,,,�+�+�+�+%CC
CC�B�B�B�B�B�B�B�B�B�B�B�B�B�B�B|BvBpBjBdBXBRBLBFB@B:B4B.BBBB�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A�A~AxArAlAfA`AZATANAHABA<A6A0A*A$AAAAAAA�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@�@|@v@p@j@d@^@X@R@L@F@@@:@4@.@(@"@@@@
@@�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?z?t?n?h?b?\?V?P?J?D?>?8?2?,?&? ?????�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>�>z>t>n>h>b>\>V>P>J>D>>>8>2>,>&> >>>>>>�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=�=~=x=r=l=f=`=Z=T=N=H=B=<=6=0=*=$=======�<�<�<�<�<�<�<�<�<�<�<�<�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I�I{IuIoIiIcI]IWIQIKIEI?I9I3I-I'I!IIII	II�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�H�HHyHsHmHgHaH[HUHOHIHCH=H7H1H+H%HHHH
HHH�G�G�G�G�G�G�G�G�G�G�G�G�G�G�G�G�G�G�G�G�G}GwGqGkGeG_GYGSGMGGGAG;G5G/G)G#GGGGGG�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F�F{FuFoF\FVFPFJFDF>F8F2F,F&F FF
F�E�E�E�E�E�EnE_EOE6E-EEEEEEE�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D�D|DvDpDjDdD^DXDRDLDFD@D:D4D.D(D"DDDD
DD�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�C�CzCtCnChCbC\CVCPCJCDC>C8C2C,C�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R�R~RxRrRfR^RVRQRKR@R0RRR�Q�Q�Q�Q�Q�Q�Q�Q�Q�Q�R�Q�R�Q�QzQtQnQhQbQ\QVQPQJQDQ>Q8Q2Q,Q&Q QQQQQQ�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P~PxPrPlPfP`PZPTPNPHPBP<P6P0P*P$PPPPPPP�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O|OvOpOjOdO^OXOROLOFO@O:O4O.O(O"OOOO
OO�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�NzNtNnNhNbN\NVNPNJNDN>N8N2N,N&N NNNNN�M�M�M�M�M�M�M�M�M�M�M�M�M�M}MwMqMkMRMLMFM=M0M*M$MMMMMMM�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L|LvLpLjLdL^LXLRLLLFL@L;L6L4L/L�R�R�R�R*L�R%L LL�R�R�R�R�RLxRrRL	LL�KKR�K�K�K�K�K�Q�Q�Q�Q�Q�Q�K�Q�Q�K�Q�K�Q�K�KtQnQhQbQ\QVQPQJQDQ>Q8Q2Q,Q&Q QQQQQQ�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P~PxPrPlPfP`PZPTPNPHPBP<P6P0P*P$PPPPPPP�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�K�O|OvOpOjOdO^OXOROLOFO@O:O4O.O(O"OOOO
OO�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�NzNtNnNhNbN\NVNPNJNDN>N8N2N,N&N NNNN�K�M�K�K�K�M�M�M�M�M�M�M�M�M�M}MwMqMkM�KLMFM�K�K*M$MMMMMMM�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L|LvLpLjLdL^LXLRLLLFL@L;L6L�R/L�R�R�R�R*L�R%L LL�R�R�R�R�RLxRrRL	LL�KKR�K�K�K�K�K�Q�Q�Q�Q�Q�Q�K�Q�Q�K�Q�K�Q�K�KtQnQhQbQ\QVQPQJQDQ>Q8Q2Q,Q&Q QQQQQQ�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P~PxPrPlPfP`PZPTPNPHPBP<P6P0P*P$PPPPPPP�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O~KgKPK9K"KK�J�JXOROLOFO@O:O4O.O(O"OOOO
OO�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�NzNtNnNhNbN\NVNPNJNDN>N8N2N,N&N NNNN�J�J�J�JyJeJQJ=J�M�M�M�M�M�M�M}MwMqMkM�KLMFM�K�K*M$MMMMMMM�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L�L|LvLpLjLdL^LXLRLLLFL@L8J6L�R/L�R�R�R�R*L�R%L LL�R�R�R�R�RLxRrRL	LL�KKR�K�K�K�K�K�Q�Q�Q�Q�Q�Q�K�Q�Q�K�Q�K�Q�K�KtQnQhQbQ\QVQPQJQDQ>Q8Q2Q,Q&Q QQQQQQ�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P�P~PxPrPlPfP`PZPTPNPHPBP<P6P0P*P$PPPPPPP�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O�O|OvOpOjOdO^OXOROLOFO@O:O4O.O(O"OOOO
OO�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�N�NzNtNnNhNbN\NVNPNJNDN>N8N2N,N&N NNNN�K�M�K�K�K�M�M�M�M�M�M�M�M�M�M}MwMqMkM�KLMFM�K�K*M$MMMMMMM*J�L�L�L�L�L�L�L�L�L�L�L�L�L
J�L�L�L�L�L�L|LvLpLjLdL^LXLRLLL�I�IPV@V6V)VV
V�U�U�U�U�U�U�U�U�U�U�^�^�^�^�^�^�^�^�^�^�^}^x^s^n^i^S^D^3^^�]�]�]�]�]�]�]�]�]�]�]�]�]|]l]^]M]=].]!]]�\�\�\�\�\�\�\�\�\�\�\|\v\p\j\M\�\0\*\$\\\\\�[�[�[�[�[�[�[�[�[z[t[n[h[b[\[@[([
[�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�Z�ZrZlZfZ`ZZZTZNZHZ5Z#ZZZ�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y�Y~YxYrYlYfY`YZYTYNYHYBY<Y6Y0Y*Y$YYYYYYY�X�X�X�X�X�X�X�X�X�X�X�X�X�X�X�X�X�X�X�X�X|XvXpXjXdX^XXXRXLXFX@X:X4X.X(X"XXXX
XX�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�W�WzWtWnWhWbW\WVWPWJWDW>W8W2W,W&W WWWWWW�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V�V~VxVrVlV{_{_z_xks_s_z_�_i_i_z_�d^___&e__|q��skokkkgkdkak\kWk>k>k>k�j�j�j�j�j>k>k>k>k�i�i�i�i����?p/p&pppppppp�op�opppNs>s4s'sss�r�r�r�r�r�r�r�r�rrDay Mon 00 00:00:00 1900
SunMonTueWedThuFriSatJanFebMarAprMayJunJulAugSepOctNovDec/lib/dst         (((((                  H���������������������� ����8�*E�D�D�D�D�P�K��S���g�;���vf�py6��>�1<�7{i�V�g9��"���$h�JG�y��Fr\��K��� P���<d<"�E�Έ&&&(�*�/�1$<6 DD
>�>D>DMDVD];UD�>�D���D���E��J$�P2PV�(Y�`@(c�D���D#�D#���D$�jRD%�D&�D'�D'�D(�D)�D*�D+D,D-n��-D.-x=D/D�JD1JD2PD3TD3W�bD4b��D7�D8�D:�D;���D<�|$D=���D?�DA�DB�DD���DF�DG���D3�DI�DJ
DK�:DL:��DNQ��DOe�kDQkDR�����D#��@"
�@	�@�����d�@��d����b���@(��������4���(8����b8���DT��T���T��$V����2�����(���@(����"�@"
DX���DY�DY�DZ�D[�DY�D\����]���]��$_�2�	��"���Da���Dd�DeDfDg%Dh-�(��1�i1�i2&$k20 P:�(<�Dm4�4Dn4Do<�KDpK�pK>�pLH$rLMLS2DX�(Z�\@(^�`�"d@"
h�(m�o@(	t�DtN�ZDxZDyn�rDzrv�D{�D|���D}�D~�z�D���D������D��D��D����D��~�D����D��D�����@(���@(����D����������$��� D����$�����D����D��D��D� D�$D�F�H��H���I�&��������$�J� D����$������@�D�L�PD�PD�U�D��	���D���D��D��D���D������D��D��D��D��D��D��D��D��D��~�
D�
@�
����!��)$�5 PA�C@D��D�D�EeD�6�=D�=��=J��>V$�>_ DD�C�CD�Ch`D�Km���s�d��\D�\��\y��]�\�`"�`"�`0�`(���^�\�`"�`"�`"�`$�^�\�`�`�`�`�`�`
�`

�`l��`b"��`l$��`$^(\``$`*`l�
.`l�3^<\C`H`,M`,S`Y`_^f��]o�lxdl~�E_�&�&h�����������������������������t�l�p�d�^�J�F�@�;�#���������������� 
��$l2D!�(�$.�5��;�"D!n�nD&nD's?�D)�D*����+�C�+�J\L`"Q`"Y`0b`(f�h^j\l`"q`"v`"|`$^�\�`�`�`�`�`�`
�`

�`l��`b"��`l$��`$�^(�\�`�`�`�`l�
�`l��^\``,`,`!`'^.�+�4+�=d�C�E`�&G ��O�	R�	U ��a�	dv	gn	jd	m_	pX	t$�| D���@��$�@$
�������"�@"	D���D�D�D�D�D�D�D��DD)D ID!R�E	D#���D&�D'��A	D(���D)�D*��=	D+���D,�D-��5	�		�		��b8!��		D1		�(	�	D	D3#	������8 ���@�@�%	�4%	��4&	�\�`"�`"`0`(�^\`"`" `"&`$)^+\7`:`D`M`S`X`
]`

b`l�h`b"�l`l$�q`$w^(�\�`�`�`�`l�
�`l��^�\�`�`,�`,�`�`�^��4&	�4�	�d�	��Ea�&�$�	� D��$����"D�	��	D�	D�	D�	D�	D
D

#�'�0�2�< 6��
�
B�
K\M`"R`"Z`0c`(g�i^k\m`"r`"w`"}`$�^�\�`�`�`�`�`�`
�`

�`l��`b"��`l$��`$�^(�\�`�`�`�`l�
�`l��^\``,`,`"`(^/�
6
Ad
I�Eb�&M$
W Da�h�$n�u��{�"D
�
D
D
D!
DE
Dd
Dk
�������< ���m
�m
��n
�\�`"�`"�`0�`(���^�\�`"�`"�`"�`$�^�\�`�`�`	`	`	`
	`

	`l�	`b"� 	`l$�%	`$+	^(7	\@	`C	`J	`P	`l�
T	`l�Y	^b	\i	`n	`,s	`,y	`	`�	^�	�n
�	p
�	dp
�	�Ec�&�	$p
�	 D�	��	�$�	��	���	�"Dy
�y
Dy
D~
D�
D�
D�
D�
D�
D�
�	D�	��	��	�8 �	�	
@
@

�< ��
�
\ 
`"%
`"-
`06
`(:
�<
^>
\@
`"E
`"J
`"P
`$S
^U
\a
`d
`n
`w
`}
`�
`
�
`

�
`l��
`b"��
`l$��
`$�
^(�
\�
`�
`�
`�
`l�
�
`l��
^�
\�
`�
`,�
`,�
`�
`�
^�
LdL$�Ed�&($	L4 D@�G�$M�T��Z�"^@"DU�YDYD[DdDj�yDybT
D�D�D�D�e6
D�D�D���D �D!�&D"&D#)D#)�/D%/D&9D(Li3
D)]D*gD,zD-�D.�D0�D1�m
��D���D�D6
D7
q�u�~�8 ���@
��b� �d��b!�d�@	��bd!�d�@��h!�
�8
��8
�\�`"�`"�`0�`(���^�\�`"�`"�`"�`$�^�\``
```!`
&`

+`l�1`b"�5`l$�:`$@^(L\U`X`_`e`l�
i`l�n^w\~`�`,�`,�`�`�^��8
�8`
�d`
��Ef�&�$`
� D����$�������"D	i
�i
Di
D�
D�
D�
D�
����
�8 
���
��

��

\
`""
`"*
`03
`(7
�9
^;
\=
`"B
`"G
`"M
`$P
^R
\^
`a
`k
`t
`z
`
`
�
`

�
`l��
`b"��
`l$��
`$�
^(�
\�
`�
`�
`�
`l�
�
`l��
^�
\�
`�
`,�
`,�
`�
`�
^�
��
�
d�
�Ef�&$�
" D*�1�$7�>��D�"D�
��
D�
D�
D�
D�
DD
H(D#K�O�X�Z�< ^��%�%j�&r\t`"y`"�`0�`(���^�\�`"�`"�`"�`$�^�\�`�`�`�`�`�`
�`

�`l��`b"��`l$��`$�^(\
`
```l�
`l�#^,\3`8`,=`,C`I`O^V�&\@fd@m�Eh�&q$@z D����$�������"DI�IDI�iDiD�D�DD
�PD �%D%DDDK��������< ���M�M��N�\�`"�`"�`0�`(���^�\�`"�`"�`"�`$^\```%`+`0`
5`

:`l�@`b"�D`l$�I`$O^([\d`g`n`t`l�
x`l�}^�\�`�`,�`,�`�`�^��N�x�dx��Eh�&�$x� D����$�@$������"@"
D���D�D�D�D�D�D�D�D
D2D=DHDY
�DyD �D!�D!���D"�D$�D%D&�D!D(
D)���D*���'@	,@/@1@3�6�< :�F�@ I�D L�H ���+�O�+�Y\[`"``"h`0q`(u�w^y\{`"�`"�`"�`$�^�\�`�`�`�`�`�`
�`

�`l��`b"��`l$��`$�^(�\�`�`�``l�
`l�
^\``,$`,*`0`6^=�+�E+�Nd�T�Ej�&X&h�\�a��c4f$i!loru�x�|������������������~�x�[�U�N�;�7�3������������ �������\�`"�`"`0
`(�^\`"`"`"$`$'^)\5`8`B`K`Q`V`
[`

``l�f`b"�j`l$�o`$u^(�\�`�`�`�`l�
�`l��^�\�`�`,�`,�`�`�^����@�d@��Ej�&�$@� D�@�$@$
�"��(�",@"	DI�UDUDYD[D`DdDhDj�uDuD�D�D�0]D�D�4KDD8=D0<�@�D�HLPTX)��D�D$�\�`�i�8 m�y@{@���%�}�%��\�`"�`"�`0�`(���^�\�`"�`"�`"�`$�^�\�`�`�`�`�`�`
�`

�`l��`b"��`l$�`$	^(\`!`(`.`l�
2`l�7^@\G`L`,Q`,W`]`c^j�%�p%lydl�Ek�&�$l�l�2D������,�@,Dn�rDrDv��D
�D
�D���D
�D�D��@
�@	�D����$� D����$�@$�������"D'�+D+D0D 2D!UD"xD#D#�D$�D#�D%��@
��(���8 ��< ���&��&�\`"!`")`02`(6�8^:\<`"A`"F`"L`$O^Q\]```j`s`y`~`
�`

�`l��`b"��`l$��`$�^(�\�`�`�`�`l�
�`l��^�\�`�`,�`,�`�`�^��&�&�d��El�&&��"���(&��0��9C</?B$�L DV�]�$c�j��p�"D���D�D�DD%D6D Gt�x�|�����D$���D%���D&�D'��D(D)$�~D*6�XD,R��(����8 ���@��b8"���<"�T�-T��-U�\�`"�`"�`0�`(���^�\�`"�`"�`"�`$�^\
```#`)`.`
3`

8`l�>`b"�B`l$�G`$M^(Y\b`e`l`r`l�
v`l�{^�\�`�`,�`,�`�`�^��-U�-L�dL��Em�&�$L�L�2D���@DN�RDR��D	_�iD
i������D�D���D�D���D
�D
��s��D��kD�i��D�����
$� D'�(+�7�"D�DD#D)D-D1D5D9D =D!AD"ED#ID$MD%iD&nD'�D(�D)�;�?�H@���*�J�*�W$,�c Do�v�$|������"D.���D8�D9�D:�D;�D;���D<��1�.�>�5�9�?D?Z�lD@l�yDAy�DB�DC���	��DE�����DG��D;DI
DI�DJDJDK#DL6DL6DJ6DM6DN?��DPP��DQc�qDIqDSsDTv��DU�DV�DW���DX�DY�DZ���D\���D]�D^�D_���Da��DbDcDd#�fDf=�PDgJ�@,�@
�@	��(����,�L�hL��hM\`"`"`0`(!�#^%\'`",`"1`"7`$:^<\H`K`U`^`d`i`
n`

s`l�y`b"�}`l$��`$�^(�\�`�`�`�`l�
�`l��^�\�`�`,�`,�`�`�^��hM�h��d��En�&	$� D�&�$,�3��9�"D���D�D�DD=�A�J�L�< P��!�!\�"g\i`"n`"v`0`(���^�\�`"�`"�`"�`$�^�\�`�`�`�`�`�`
�`

�`l��`b"��`l$��`$�^(�\�``	``l�
`l�^!\(`-`,2`,8`>`D^K�"S$\d$b�Eo�&f$$o Dx��$�������"D-�-D-�2D2D6�:�<D<DADU�ZDZD�D�D�������������D ����������\�`"�`"�`0�`(���^�\�`"�`"�`"�`$�^�\````!`&`
+`

0`l�6`b"�:`l$�?`$E^(Q\Z`]`d`j`l�
n`l�s^|\�`�`,�`,�`�`�^������d���Ep�&�$�� D����$�������"D���D�D�D�D�D D ���������@ ��! �! �" \`" `"(`01`(5�7^9\;`"@`"E`"K`$N^P\\`_`i`r`x`}`
�`

�`l��`b"��`l$��`$�^(�\�`�`�`�`l�
�`l��^�\�`�`,�`,�`�`�^��" $ d$ �Er�&"$$ , D6�":@">�"D) �- D	- D1 �> D> B� DQ �Z DZ D\ Di Dy D� D� D� D� D� D� D� D� E@
K�"�� �� P�� Z\\`"a`"i`0r`(v�x^z\|`"�`"�`"�`$�^�\�`�`�`�`�`�`
�`

�`l��`b"��`l$��`$�^(�\�`�`�` `l�
 `l� ^ \ `  `,% `,+ `1 `7 ^> �� J � V d� _ �Er�&c $� o  D{ �� �$� �� ��� �"D� �� D� D� D� D� D !D'!� X!D=!DT!� �� �� �8 � �� �< �V!�V!� �W!� \� `"� `"� `0� `(� �� ^� \� `"� `"� `"� `$� ^� \
!`
!`!` !`&!`+!`
0!`

5!`l�;!`b"�?!`l$�D!`$J!^(V!\_!`b!`i!`o!`l�
s!`l�x!^�!\�!`�!`,�!`,�!`�!`�!^�!�W!�!p!�!dp!�!�Es�&�!$p!�!p!�!2D�!��!@�!��!��!@
�!�(�!�
"�"Dy!��!D�!D�!D
�!D�!D�!D�!D�!D�!D�!D�!D�!D�!D�!D�!D"D2"D7""�"��9"�9""�:"$"&��)"��/"�-2"�-6"o-:"P->"3-B"$-F"&�4�K"4��Q"-U"�,Y"�,]"�,a"�,e"�,i"�,m"�,q"�,u"{,y"t,}"m,�"f,�"_,�"X,�"Q,�"&�t��"t��
�"D,�"7,�"2,�"-,�",�",�"�+�"�+�"�+�"�+�"$@:"�" D�"��"�$�"��"���"�"DBC"�C"DOC"#l"��"DR�"#�+DS�"DS�"DT�"	#�+DS�"DU�"DW�"DX�"DY�"
#�+DZ##M+D[#D[#� #D\ ##<+�C#D[C#D_J#DaJ#Dbj#Dcs##*+Dd�##�*De�#De�#��#Df�#!#�*��#De�#Di�#Dk�#%#�*Dl$Dm$Dn$Do9$DpB$DqM$DrR$DsW$)#�*Duf$-#�*Dw~$1#x*Dx�$Dz�$5#f*D{�$D|�$D}�$D~�$D�$D��$D��$D�%D�%D�*%D�?%D�E%D�K%D�R%D�\%D�n%D�w%D��%D��%D��%��%D��%9#O*D��%��%D��%=#7*A#3*E#;*D�(&D�5&D�@&D�^&D�g&D�r&D�w&��&D��&I# *D��&D��&N#*��&D��&D��&S#*D��&D��&X#�)D��&D��&]#�)D�'b#�)�'�'D�'g#�)D�7'D�L'D�N'D�S'l#�)D��'D��'q#�)D��'D��'D��'v#y)D��'D��'{#w)D��'D��'D�(D�*(D�5(�#T)D�M(D�R(�#9)�#E)D�(�#-)D��(�#!)D��(�#)D�)�)D�)�#@,�#@
�#�(�#��#�,�#�< �#��#�@ �#�D �#�H �#�L �)��)�#��	)�#\�#`"�#`"�#`0�#`(�#��#^$\$`"$`"
$`"$`$$^$\$$`'$`1$`:$`@$`E$`
J$`

O$`l�U$`b"�Y$`l$�^$`$d$^(p$\y$`|$`�$`�$`l�
�$`l��$^�$\�$`�$`,�$`,�$`�$`�$^�$��	)�$��-�$d�-�$�Et�&�$$
�-�$ D�$�%@%�%@
%�%�(%�)%�"D�-��-D�-D�-D�-D.D.D.D.D.D#.D-.D1.D5.DQ.DV.Dy.D�.D�.-%�1%�:%@	��.� �.<%� �.H%$"�.S% D^%�e%�$k%@$q%�x%��~%�"�%@"
D$�.��.D,�.D-�.D.�.D0�.D1�.D5�.��.D6�.�%!6D7�.D8�.�%6�/D9/D:/�/�/D=/D>&/D?//D@P/DAV/DBw/�~/DD~/�%�5DE�/��/DG�/�%�5�%�5�%�5DI�/DJ�/�%�5DK�/DL"0�%D��00DM00DM20�;0DN;0�%�5DON0�a0DMa0DQe0�%�5DRp0�%u5DS{0�%[5DT�0�%A5DU�0�%'5DV�0�%5DW�0�%5DX�0�%�4DY�0�%�4DZ�0�%�4D[�0�%�4��0Df�0Dg�0Dh�0Di�0Di�0Dj�0�%D�Di1Dk1Dk1�%1Dl%1Dm@1DnI1DnN1�^1Do^1Dob1Do�1��1Do�1Do�1��1Do�1�%�4Do�1��1Do�1Do�1�2�2Do2Do2�%�P�2Do2Dp2�2Dn2�%2Dk%2Ds;2�G2DtG2Dub2Dvk2Dvp2�|2Dw|2Dw�2Dw�2��2Dw�2Dw�2��2Dw�2Dw�2��2Dw�2Dw3�)3�)3Dw)3Dw,3�%�P�33Dw33Dx33�=3Dv=3�G3D{G3D{K3D{o3�~3D{~3D{�3��3D{�3D{�3��3D{�3D{�3��3��3D{�3D{�3�%�P�4D{4D|4D}4D~44�%�4DA4DE4D�P4D�^4�%�4D~4D��4�%�4D��4&@,	&@(&�&�(&�&@&@#&�,(&�0*&�42&�88&�<>&�@D&�b@�H&�DL&�H��4���4R&���4]&(�D��b&(dD��g&\i&`"n&`"v&`0&`(�&��&^�&\�&`"�&`"�&`"�&`$�&^�&\�&`�&`�&`�&`�&`�&`
�&`

�&`l��&`b"��&`l$��&`$�&^(�&\�&`'`	'`'`l�
'`l�'^!'\('`-'`,2'`,8'`>'`D'^K'���4S'�$6_'d$6h'�Ew�&l'$$6t'$6}'2D�'��'��'@�'�(�'��'�"D-6�16D16D
:6D�6D�6�'��'��'���6��6�'��6�'$�6�' D�'��'�$�'��'���'�"�'@"D�6��6D�6D�6D�6D�6��6D �6��6D!�6D"�6��6��6��6D%�6D&�6D'�6��6D)�6D)�6��6D*�6��6D+�6�'�7�7D-7D. 7D. 7D/"7D0%7�*7D)*7D2,7�07D307�'�7D4?7�D7D6D7D7Y7D9^7D:s7D;w7�'�7D<�7(@
(�(
(�(@	(@"(@%(�b�����7�=�7)(�=�75(\7(`"<(`"D(`0M(`(Q(�S(^U(\W(`"\(`"a(`"g(`$j(^l(\x(`{(`�(`�(`�(`�(`
�(`

�(`l��(`b"��(`l$��(`$�(^(�(\�(`�(`�(`�(`l�
�(`l��(^�(\�(`�(`,)`,)`)`)^)�=�7")=�7,)d�73)�Ew�&7)$�7A) DK)�R)�$X)@$^)�e)��k)�"o)@"
D�7��7D�7D�7D�7D�7D�7D�7D�7D�7D*�7s)�<D-38D.D8D/M8D0m8D1r8D2�8��8D4�8v)j<D5�8��8D7�8z)D�D8�8D9�8D:�8��8D<�8�9D=9�)�;D>9D?9D?9D@ 9DA#9DB'9DC+9DD09DD09DE29�@9DE@9DEI9DES9�)S<�u9�u9DH{9��9DI�9DJ�9DK�9DK�9DM�9�)�:DN�9DN�9DO�9DP�9DQ�9DR�9��9DR�9DR:DR
:�,:�,:�2:DU2:DV<:DWB:DWG:DXK:�)M<DY[:�`:DZ`:�)<D\u:�z:D^z:�)<D_�:�)@	�)@�)@�)@�)��)��)��)��)��)��)��)� �)�$�)�L�)��)�P�)�T��:�`�:�)�`�:*$b�:*2D*�*�*�*@*�*@
*�!*�$*�'*@	**�" Dd�:��:Dh�:Di�:Dj�:Dk�:Dl�:Dm�:Dn�:Do;Dp;Dq;Dr;Ds;Dt&;Du+;Dv5;Dw?;DxI;DyN;DzX;D{b;D|l;D}q;.*�2*�;*�8 ?*���;�~�;K*�~�;Q*$��;X*2D_*�b*�h*�n*�p*@r*�t*@

v*�x*�"D��;��;D��;D��;D��;D��;D��;D��;D��;D��;D��;D��;D��;D��;D��;|*@,	*�(�*��<��<�*��<�*(bD���*\
�*`�*`�*^
�*\�*`"�*`"�*`0�*`(�*��*^�*\�*`"�*`"�*`"�*`$�*^�*\�*`�*`�*`+`+`+`
+`

+`l�+`b"� +`l$�%+`$++^(7+\@+`C+`J+`P+`l�
T+`l�Y+^b+\i+`n+`,s+`,y+`+`�+^�+��<�+��<�+d�<�+�Ez�&�+ ���+%C�+C�+
C�+C�+�B�+�B�+�B�+�B�+�B�+�B�+�B�+�B�+�B�+�B�+�B�+�B�+�B�+�B�+�B�+|B�+vB�+pB,jB,dB	,XB
,RB,LB,FB,@B,:B!,4B%,.B),B-,B1,B5,�A9,�A=,�AA,�AE,�AI,�AM,�AQ,�AU,�AY,�A],�Aa,�Ae,�Ai,�Am,�Aq,�Au,�Ay,�A},�A�,�A�,�A�,~A�,xA�,rA�,lA�,fA�,`A�,ZA�,TA�,NA�,HA�,BA�,<A�,6A�,0A�,*A�,$A�,A�,A�,A�,A�,A�,A�,�@�,�@�,�@�,�@�,�@�,�@�,�@�,�@-�@-�@	-�@
-�@-�@-�@-�@-�@!-�@%-�@)-�@--�@1-�@5-|@:-v@?-p@D-j@I-d@N-^@S-X@X-R@]-L@b-F@g-@@l-:@q-4@v-.@{-(@�-"@�-@�-@�-@�-
@�-@�-�?�-�?�-�?�-�?�-�?�-�?�-�?�-�?�-�?�-�?�-�?�-�?�-�?�-�?�-�?�-�?�-�?�-�?�-�?�-�?.�?.�?.z?.t?.n?.h? .b?%.\?*.V?/.P?4.J?9.D?>.>?C.8?H.2?M.,?R.&?W. ?\.?a.?f.?k.?p.�>u.�>z.�>.�>�.�>�.�>�.�>�.�>�.�>�.�>�.�>�.�>�.�>�.�>�.�>�.�>�.�>�.�>�.z>�.t>�.n>�.h>�.b>�.\>�.V>�.P>�.J>�.D>�.>>/8>/2>/,>/&>/ >/>/>$/>)/>./>3/�=8/�==/�=B/�=G/�=L/�=Q/�=V/�=[/�=`/�=e/�=j/�=o/�=t/�=y/�=~/�=�/�=�/�=�/�=�/�=�/�=�/~=�/x=�/r=�/l=�/f=�/`=�/Z=�/T=�/N=�/H=�/B=�/<=�/6=�/0=�/*=�/$=�/=�/=�/=�/=0=0=
0�<0�<0�<0�<0�<#0�<(0�<-0�<20�<70�<<0�<A0�<F0��<O0,C[0d,Cd0�E{�&h0 ��n0�Iq0�It0�Iw0�Iz0�I}0�I�0�I�0�I�0�I�0�I�0�I�0�I�0�I�0�I�0�I�0�I�0�I�0{I�0uI�0oI�0iI�0cI�0]I�0WI�0QI�0KI�0EI�0?I�09I�03I�0-I�0'I�0!I�0I�0I�0I�0	I�0I�0�H1�H1�H	1�H
1�H1�H1�H1�H1�H!1�H%1�H)1�H-1�H11�H51�H91�H=1�HA1�HE1�HI1�HM1�HQ1HU1yHY1sH]1mHa1gHe1aHi1[Hm1UHq1OHu1IHy1CH}1=H�17H�11H�1+H�1%H�1H�1H�1H�1
H�1H�1H�1�G�1�G�1�G�1�G�1�G�1�G�1�G�1�G�1�G�1�G�1�G�1�G�1�G�1�G�1�G�1�G�1�G�1�G�1�G�1�G�1�G2}G2wG
2qG2kG2eG2_G2YG#2SG(2MG-2GG22AG72;G<25GA2/GF2)GK2#GP2GU2GZ2G_2Gd2Gi2�Fn2�Fs2�Fx2�F}2�F�2�F�2�F�2�F�2�F�2�F�2�F�2�F�2�F�2�F�2�F�2�F�2�F�2�F�2�F�2�F�2�F�2�F�2{F�2uF�2oF�2\F�2VF�2PF�2JF�2DF�2>F38F	32F3,F3&F3 F3F"3
F'3�E,3�E13�E63�E;3�E@3�EE3nEJ3_EO3OET36EY3-E^3Ec3Eh3Em3Er3Ew3E|3�D�3�D�3�D�3�D�3�D�3�D�3�D�3�D�3�D�3�D�3�D�3�D�3�D�3�D�3�D�3�D�3�D�3�D�3�D�3�D�3�D�3|D�3vD�3pD�3jD�3dD�3^D4XD4RD
4LD4FD4@D4:D!44D&4.D+4(D04"D54D:4D?4DD4
DI4DN4�CS4�CX4�C]4�Cb4�Cg4�Cl4�Cq4�Cv4�C{4�C�4�C�4�C�4�C�4�C�4�C�4�C�4�C�4�C�4�C�4�C�4�C�4�C�4zC�4tC�4nC�4hC�4bC�4\C�4VC�4PC�4JC�4DC�4>C�48C�42C�4,C5�,C5�I5d�I$5�E�&(5 ��05�R35�R65�R95�R<5�R?5�RB5�RE5�RH5�RK5�RO5�RS5�RW5�R[5�R_5�Rc5�Rg5�Rk5�Ro5~Rs5xRw5rR{5fR5^R�5VR�5QR�5KR�5@R�50R�5R�5R�5�Q�5�Q�5�Q�5�Q�5�Q�5�Q�5�Q�5�Q�5�Q�5�Q�5�Q�5�Q�5�Q�5zQ�5tQ�5nQ�5hQ�5bQ�5\Q�5VQ�5PQ�5JQ�5DQ�5>Q�58Q62Q6,Q6&Q6 Q6Q6Q6Q6Q#6Q'6�P+6�P/6�P36�P76�P;6�P?6�PC6�PG6�PK6�PO6�PS6�PW6�P[6�P_6�Pc6�Pg6�Pk6�Po6�Ps6�Pw6�P{6~P6xP�6rP�6lP�6fP�6`P�6ZP�6TP�6NP�6HP�6BP�6<P�66P�60P�6*P�6$P�6P�6P�6P�6P�6P�6P�6�O�6�O�6�O�6�O�6�O�6�O�6�O�6�O7�O7�O
7�O7�O7�O7�O!7�O&7�O+7�O07�O57�O:7�O?7�OD7|OI7vON7pOS7jOX7dO]7^Ob7XOg7ROl7LOq7FOv7@O{7:O�74O�7.O�7(O�7"O�7O�7O�7O�7
O�7O�7�N�7�N�7�N�7�N�7�N�7�N�7�N�7�N�7�N�7�N�7�N�7�N�7�N�7�N�7�N�7�N�7�N8�N8�N8�N8�N8�N8zN 8tN%8nN*8hN/8bN48\N98VN>8PNC8JNH8DNM8>NR88NW82N\8,Na8&Nf8 Nk8Np8Nu8Nz8N8�M�8�M�8�M�8�M�8�M�8�M�8�M�8�M�8�M�8�M�8�M�8�M�8�M�8�M�8}M�8wM�8qM�8kM�8RM�8LM�8FM�8=M�80M�8*M�8$M�8M9M9M9M9M9M9�L9�L$9�L)9�L.9�L39�L89�L=9�LB9�LG9�LL9�LQ9�LV9�L[9�L`9�Le9�Lj9�Lo9�Lt9�Ly9�L~9�L�9|L�9vL�9pL�9jL�9dL�9^L�9XL�9RL�9LL�9FL�9@L�9 ���9;L�96L�94L�9/L�9*L�9%L�9 L�9L�9L�9L�9	L�9L�9�K:�K:�K:�K:�K:�K:�K:�K$:�K):�K.:�K3:�K8:�K=:�KB:�KG:�KL:�KQ:�KV:�K[: ��e:~Kj:gKo:PKt:9Ky:"K~:K�:�J�:�J�:�J�:�J�:�J�:�J�:yJ�:eJ�:QJ�:=J�: ���:8J�:*J�:
J�:�I�:�I�:��I�:S�:dS�:�E}�&�:$S; D;�;�$;� ;��&;�"D	S�	SD	SDSDSD5SDXSD_S*;]VDuSD�S-;YVD�S0;�4;�=;�b �A;�80E;�Q;�<0��S��SS;��S^;&���e;���m;PVq;@Vu;6Vy;)V};V�;
V�;�U�;�U�;�U�;�U�;�U�;�U�;�U�;�U�;�U�;�U�;$0�S�; P�;�,�;�"�;�D2�S��SD6�SD7�S��SD:�S�;�UD;�SD=�SD>�SD@�SDATDCTDDT�;iUDE,T�;_UDFSTDGaT�rTDHrT�;RUDI�T��TDK�T�;BUDL�TDM�T��TDN�T�;8UDO&U�4UDQ4U�4U�;�b��4UDS4U�S4U�;�S5U<\<`"
<`"<`0<`(<�!<^#<\%<`"*<`"/<`"5<`$8<^:<\F<`I<`S<`\<`b<`g<`
l<`

q<`l�w<`b"�{<`l$��<`$�<^(�<\�<`�<`�<`�<`l�
�<`l��<^�<\�<`�<`,�<`,�<`�<`�<^�<�S5U�<SlV�<dlV=�E�&= ��=�^=�^=�^=�^=�^ =�^#=�^&=�^)=�^,=�^0=�^4=}^8=x^<=s^@=n^D=i^H=S^L=D^P=3^T=^X=�]\=�]`=�]d=�]h=�]l=�]p=�]t=�]x=�]|=�]�=�]�=�]�=�]�=|]�=l]�=^]�=M]�==]�=.]�=!]�=]�=�\�=�\�=�\�=�\�=�\�=�\�=�\�=�\�=�\�=�\�=�\�=|\�=v\�=p\�=j\�=M\�=0\�=*\�=$\�=\�=\>\>\>�[>�[>�[>�[>�[>�[ >�[$>�[(>�[,>z[0>t[4>n[8>h[<>b[@>\[D>@[H>([L>
[P>�ZT>�ZX>�Z\>�Z`>�Zd>�Zh>�Zl>�Zp>�Zt>�Zx>�Z|>�Z�>�Z�>rZ�>lZ�>fZ�>`Z�>ZZ�>TZ�>NZ�>HZ�>5Z�>#Z�>Z�>Z�>�Y�>�Y�>�Y�>�Y�>�Y�>�Y�>�Y�>�Y�>�Y�>�Y�>�Y�>�Y�>�Y�>�Y?�Y?�Y?~Y?xY?rY?lY ?fY%?`Y*?ZY/?TY4?NY9?HY>?BYC?<YH?6YM?0YR?*YW?$Y\?Ya?Yf?Yk?Yp?Yu?Yz?�X?�X�?�X�?�X�?�X�?�X�?�X�?�X�?�X�?�X�?�X�?�X�?�X�?�X�?�X�?�X�?�X�?�X�?�X�?�X�?�X�?|X�?vX�?pX�?jX�?dX�?^X@XX@RX@LX@FX@@X@:X@4X$@.X)@(X.@"X3@X8@X=@XB@
XG@XL@�WQ@�WV@�W[@�W`@�We@�Wj@�Wo@�Wt@�Wy@�W~@�W�@�W�@�W�@�W�@�W�@�W�@�W�@�W�@�W�@�W�@�W�@�W�@zW�@tW�@nW�@hW�@bW�@\W�@VW�@PW�@JW�@DW�@>W�@8W�@2W�@,WA&WA W
AWAWAWAWAW#A�V(A�V-A�V2A�V7A�V<A�VAA�VFA�VKA�VPA�VUA�VZA�V_A�VdA�ViA�VnA�VsA�VxA�V}A�V�A�V�A�V�A~V�AxV�ArV�AlV�A�lV�A_�Ad_�A�E��&�A&h���A���A���A{_�Az_�As_�Ai_�A^_�A_�A_�A �A��A_�A_�A\�A`"�A`"�A`0B`(B�B^B\B`"B`"B`""B`$%B^'B\3B`6B`@B`IB`OB`TB`
YB`

^B`l�dB`b"�hB`l$�mB`$sB^(B\�B`�B`�B`�B`l�
�B`l��B^�B\�B`�B`,�B`,�B`�B`�B^�B�_�B�_�Bd�_�B�E��&�B$	�_�B DC�C�$C�C��C�"D�_��_D�_D�_D�_D�_D�_D�_C<`D6`"C�&C�/C�8 3C�?C�bD �	FC�bX �NC�\ �8`�8`PC�9`ZC\\C`"aC`"iC`0rC`(vC�xC^zC\|C`"�C`"�C`"�C`$�C^�C\�C`�C`�C`�C`�C`�C`
�C`

�C`l��C`b"��C`l$��C`$�C^(�C\�C`�C`�C`D`l�
D`l�D^D\D` D`,%D`,+D`1D`7D^>D�9`DDp`NDdp`UD�E��&YD&�<�]D<��`DskcDokfDkkiDgklDdkoDaksD\kwDWk{D$p`~Dp`�D2D�D��D�"D
y`�y`Dy`D�`D�`D�`�DEkD�`D�`D�`�D>k�D<k�D?kDaDa�DkD&a�D@�D�(�D��D�8 �D��(a�(a�D�)a�D$*a�D*a�D2D�D��D�"D3a�3aD!3aD"XaD#waD$~a�DkD%�a�D�jD&�a�D�jD'�a�D��D��D�8 �D��D�< ��a�(�aE�(�aE&�\�E\��E�jE�jE�jE�jE�jE$*�a"E�a&E2D)E�-E�"D,�a��aD2�aD3�aD4�aD5b1E�jD6b5EcjD8zb9E#jD:�b=EjD;�bD;�bD<�bD;cD=cAEjD>,cEE@GE�(KE�WE�8 [E��.c�?.cdE�?/cgE$A0clE0crE2DwE�{E�"DC9c�9cDH9cDI^cDJ}cDK�cE�iDM�c�E��E��E�8 �E��E�< ��c�N�c�E�N�c�E&�|��E|���E�i�E�i�E�i�E$P�c�E�c�E2D�E��E�"DR�c��cDX�cDY�cDZdD[d�E�iD\dD\dD]!dD\XdD^\d�E�iD_vd�E�iDa�d�E@�E�(�E��E�8 �E���d�b�d�E�b�d�E$d�dF DF�F�$"F�)F��/F�"3F@"Df�d��dDp�d7FiDq�dDr�dDs�dDt�dDu�dDv�dDw�dDxeDy
eDzeD{"e;F@
�$e�|$e=F�|%eJF$~&eXF DfF�mF�$sF@$yF��F���F�"�F@"
D�/e�7eD�7e�FliD�DeD�Te�FXiD�heD�ye�FHiD��eD��e�F4iD��eD��e�FiD��eD��e�F
i�F	i�FiD�f�F�hD�
fD�fD�#f�PfD�PfD�ofD��fD��fD��fD��fD��fD��fD��fD��fD��fD�g� gD� g�NgD�NgD�mgD��gD��gD��gD��gD��gD��gD��gD��gD�h�hD�h�2hD�2hD�QhD�mhD�rhD��hD��hD��hD��hD��hD��h��hD��h�F��F��F�8 �F��F@	��h���h�F���h�F\�F`"�F`"�F`0�F`(G�G^G\G`"
G`"G`"G`$G^G\)G`,G`6G`?G`EG`JG`
OG`

TG`l�ZG`b"�^G`l$�cG`$iG^(uG\~G`�G`�G`�G`l�
�G`l��G^�G\�G`�G`,�G`,�G`�G`�G^�G���h�G�xk�Gdxk�G�E��&�G$xk�G D�G��G�$H�
H��H�"D�k��kD�kD�kD�kD�kD�kD�kDlDlDlH�lD-lD;lH�lDJlHxlD"ulH�#H�,H�8 0H�<H@>H@
�wl�#wl@H�#xlHH\JH`"OH`"WH`0`H`(dH�fH^hH\jH`"oH`"tH`"zH`$}H^H\�H`�H`�H`�H`�H`�H`
�H`

�H`l��H`b"��H`l$��H`$�H^(�H\�H`�H`�H`�H`l�
�H`l��H^I\	I`I`,I`,I`I`%I^,I�#xl3I#�l<Id�lCI�E��&GI&��JI��NI VI$
�l\I DbI�kI�(oI�xI�}I@�I�(�I��I��I�"D�l��lD�lD�lD�l��lD�l�I]p��lD�lDm�m�mDmD:m�ZmDZm�IPpDjmDwmD �m��mD"�m��mD#�m��mD$�mD%�mD'�m�IDpD(�m��m��m��mD+�m��mD,�mD-�m�nD/n�nD1n�nD2nD3 n�+nD5+n�I��I��-n�6-n�I�6.n�I&����I����I?p�I/p�I&p�Ip�Ip�Ip�I�o�I�o�I$@.n�I D�I��I�(�I��I�J�(J�J@(J�#J�(J�",J@"
DA7n�?nDG?nDICnDKOn�mnDLmnDMsnDN~nDO�n��nDQ�nDR�n��nDS�nDT�nDU�nDV�n��nDW�n�
oDX
o�oDYoDZBoD[doD\ko�ko�ko�koD`koDasoDb~oDc�o0J�oDd�o��oDf�o4J�:J�CJ�EJ�b�KJ�RJ�b�VJ���o�g�o`J�g�oeJ jJ 0vJ\xJ`"}J`"�J`0�J`(�J��J^�J\�J`"�J`"�J`"�J`$�J^�J\�J`�J`�J`�J`�J`�J`
�J`

�J`l��J`b"��J`l$��J`$�J^(K\K`K`K`K`l�
"K`l�'K^0K\7K`<K`,AK`,GK`MK`SK^ZK�g�oaKghplKdhptK�E��&xK$hp�K D�K��K�$�K��K���K�"Dqp�qpDqpDvpDypD�pD�pD�p�K�sD�pD�p�K�s��pD�p�KesD3qDAq�KYsDlq�KWs�yqDyq�K��K��K�8 �K��K�< �{q� {q�K� |q�K&����K����KNs�K>s�K4sL'sLs	Ls
L�rL�rL�rL�rL�r!L�r%L�r)L�r-L�r1Lr5L$6|qBL POL�,TL@,YL�"^L�D8�q��qD;�qD<�q��qD=�qD>�qdLNrD@�qhL;r��q�rDBrlL r�rpL��rDDr�DrvL�Dr�L\�L`"�L`"�L`0�L`(�L��L^�L\�L`"�L`"�L`"�L`$�L^�L\�L`�L`�L`�L`�L`�L`
�L`

�L`l��L`b"��L`l$�M`$M^(M\M`M`%M`+M`l�
/M`l�4M^=M\DM`IM`,NM`,TM`ZM``M^gM�DroMD�s{Md�s�M�E���&�M$�s�M P�M�"�M�"D�s��sD
�sD�s�MtD
�s�M�s��sD�s��s�M��s�M\�M`�M`�M`�M`�M`�M`
�M`

�M`l��M`b"��M`l$��M`$�M^(N\N`N`N`!N`l�
%N`l�*N^3N��s=NtJNdtUN�E���&YN$tbN PkN�,oN@,sN�wN@
{N�"Dt�"tD"tD	.tD
4tD
@tDEtDMtDMtD
OtD
StDjt�N@,	�qtDqt�qt�N�rt�N\�N`�N`�N`�N`�N`�N`
�N`

�N`l��N`b"��N`l$��N`$�N^(�N\�N`�N`�N`�N`l�
O`l�O^O�rtOtt$Odtt-O�E���&1O$tt8O N?O�,CO@,Dvt�ztDztD	}tD
�tD�tD�tGO@
��t�
�tIO�
�tPO\\O`_O`iO`rO`xO`}O`
�O`

�O`l��O`b"��O`l$��O`$�O^(�O\�O`�O`�O`�O`l�
�O`l��O^�O�
�t�O
�t�Od�t�O�E���&�O$�t�O P�O�,�O��O�(�O�D	�t��tD�tD�t��tD�tD�t��tD�tD�tD�tP�vDu�uDuDuDuP�vD)uD-uD/u�4uD4uDAuDeuP�v�uDuD�uD �uP�vD!�uD!�u��uD"�uD"�uD#�uD$vP�vD%v�*vD'*vP�vD':vD(<vP�vD(LvD)NvP�vD)^v�^v�^vD!^vD,fv��vD�vD.�v P�v$P@&P@
)P@	+P@,-P�l � 1P@��vD/�v�/�v9P�/�v<P\>P`"CP`"KP`0TP`(XP�ZP^\P\^P`"cP`"hP`"nP`$qP^sP\P`�P`�P`�P`�P`�P`
�P`

�P`l��P`b"��P`l$��P`$�P^(�P\�P`�P`�P`�P`l�
�P`l��P^�P\�P`Q`,Q`,
Q`Q`Q^ Q�/�v%Q/�v,Qq0w4Q@w<Q�H~DQ�H~KQ�H~TQ���[Q�؁cQ�(�lQ���uQy�}Q�(��QL���Q����Qć�Q�l��Q����Q�܋�Q��Q�(��Q�T��Qd��QL���Q(`��Qp��Q����Qy�R��R���R��� R
�)R,�2R!\�;R!��DR$��NR��XR�P�_R�d�fR���nR��yR-ԓ�R�ܓ�R���R����R��Rfp��R����R���R�(��R����R�R~<�Rr��R.���R����R��R�>S	���S0��Sd�SL�'S+؁.S
��6S�`�BS�(�KSq�vQS$��YS���bS�2mS	y��zS��S���S0��S�,��S�J�Skp
�SIL�S���S"x�Sl`
�SO@�Suhp�S(
T��	T�
T;|q"T��+TW�8T�.n>T�tHT\ttPTF�YT)�l`T�d�eT�P�kT(��rT���yT��T���T��7�TJ� �TN��T�@�Tm:"�T��.�T�6�T�$�T;S�T��U��U��S Uf��)U��.UY�<U�$ GU��tKU���RU��[U���bU���mUn��tU��{Ug�-�Ut��U��s�U&\��U���UW@w�U�ܾ�U����U�xk�U��_�U?�d�U&e�U��U����U!��V�T�
V���V;0wV�`�!V!,�)V	���0V�<�:V�H~GV�l�OV�VV@\waV	TzjV�^�qV��xyVO8{�V����V	����V	
���V�8��V����V�ԓ�V�(��V�ć�V�@��V�h��V�(��V���Vyp��V.���V���W~��W���W܋W�*W�p�0W+8�8W7��AW�h�IW	-��UW���[W��bWX8�iW(�pW	���uW���zW�ܓ�W����W�(��Wpp��W����W���W����W�4��W�u��Wcrt0.oexitscsish.oscsish.crccdev_dev2mainmain_4_parsemainparseparsefp_iobuffp_iobuf_14_function_23_35_50_51_54paraminptrsniiargsbuffn1nccargsthatdev2errparseflook_flookflook1f1f1namenameflookfunctionfunction1namedevptr2f1functionsetdevicesetdeviced2setdevicehelp_helphelpd2d2cmdcmdprec2prec2_78_87_95f1base1helpgen_helpgen_helpniargsiargsncargscargsgen_helpdevs_devs2gen_devgen_devniargsiargsncargscargscargs_112_118_119_124_133d2gen_devscsi_targetscsi_targetnn_139scsi_targetset_sonyset_sony_142cargsiargsset_sony2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufscsish.cge_dev.odev.crccfns_fns1_3_4_5_6_7_8_9_10_11_12_13_14_gen_id_15_16_17_18_19_20_21_22_23_24_25_26_27_28_29_30_31genericdev2_32gen_idgen_idniargsiargsncargscargserr_36gen_id2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufdev.cge_inq.oinq.crccgen_rmb_3_4gen_devtype_5_6_7_8_9_10gen_inqgen_inqniargsniargsiargsiargsncargscargserrerr_24_27_30_33buf_34cmdscsi_cmdretscsi_returningen_inq2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufinq.cge_stop.ostop.crccgen_stopgen_stopniargsiargsncargscargserrcmdscsi_cmdnretscsi_returngen_stop2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufstop.cge_start.ostart.crccgen_startgen_startniargsiargsncargscargserrcmdscsi_cmdnretscsi_returngen_start2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufstart.cge_capacity.ocapacity.crccgen_capacitygen_capacityniargsiargsncargscargserr_8cmdscsi_cmdretscsi_returnnsssngen_capacity2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufcapacity.cge_display.odisplay.crccgen_displaygen_displayniargsiargsncargscargserrerr_8_11_20_25cmdscsi_cmdretscsi_returnivendorproductnrevretvold_idgen_display2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufdisplay.cge_reset.oreset.crccgen_resetgen_resetniargsiargsncargscargserrcmdscsi_cmdretscsi_returngen_reset2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufreset.cge_tur.otur.crccgen_turgen_turniargsiargsncargscargserr_8cmdscsi_cmdnretscsi_returngen_tur2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobuftur.cge_scsi.oscsi.crccgen_scsigen_scsiniargsiargsncargscargserr_8cmdscsi_cmdnretscsi_returngen_scsi2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufscsi.cge_readt.oreadt.crccgen_readtgen_readtniargsiargsiargsncargscargserrerr_11_23_24_18cmdscsi_cmdaddrbsinssretscsi_returnt1t2nsgen_readt2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufreadt.cso_dev.odev.crccfns_fns1_3_4_5_6_7_8_9_10_11_12_13_14_15_16_17_18_19_20_21_22_23_24_25_26_27_28_29_30_31_32_33_34_35sonydev2_36_372nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufdev.cso_inq.oinq.crccsony_inqsony_inqniargsniargsiargsiargsncargscargserrerr_16_19_22_32_33_30_28_27_24_25_23cmdscsi_cmdretscsi_returninsony_inq2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufinq.cso_alt.oalt.crcctable_tabletabledrivetabdatadata_4_9intablesony_altsony_altniargsiargsiargsncargscargserriretscsi_returncmdscsi_cmdnsony_alt2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufalt.cso_config.oconfig.crccmtab_mtabbrdname_brdname_3_4_5sony_confsony_confniargsiargsncargscargserr_13_14_10_11_9_23_24_27_30_31retscsi_returncmdscsi_cmdibufnsony_conf2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufconfig.cso_status.ostatus.crccshelf_shelfshelfii_4_8_9_7_15_18_21_22_23shelfsony_istatussony_istatusretscsi_returnerrcmdscsi_cmdnsony_istatussony_statussony_statusniargsiargsncargscargserr_44_45_39_42_40_38_57_61_60_62_75_76_77_78_81_82_85_86_89_90distartretscsi_returnnsony_status2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufstatus.cso_eject.oeject.crccsony_ejectsony_ejectniargsiargsncargscargserrcmdscsi_cmdnretscsi_returnsony_eject2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufeject.cso_rel.orel.crccsony_relsony_relniargsiargsncargscargserrcmdscsi_cmdijnretscsi_returnsony_rel2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufrel.cso_set.oset.crccsony_setsony_setniargsiargsncargscargserrcmdscsi_cmdinretscsi_returnsony_set2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufset.cso_shelfside.oshelfside.crccshelfsideshelfsideargargerr_8shelfoargshelfside2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufshelfside.cso_diskid.odiskid.crccsony_diskidsony_diskidniargsiargsncargscargserr_8cmdscsi_cmdretscsi_returnnsony_diskid2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufdiskid.cso_internal.ointernal.crccinternal_internalinternalnnb1nbnbretscsi_returnerrcmdscsi_cmdinternalcmds_cmds_9_10_11_12_13_14msg1_msg1_15_16_17_18_19_20_21_22_23_24_25_26_27_28_29_30testn_testn_31_32_33_34_35_36_37_38_39_40sony_internalsony_internalniargsiargsncargscargserr_144_46_51_55_56_61_65_66_71_73_78_79_80_82_96_98_99_97_107_110_113_116_119_120_121_126_127_132_133_137_139_138_140_141_142diretscsi_returndrivecmdscsi_cmdt1t2lowernsony_internal2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufinternal.cso_media.omedia.crccsony_media1sony_media1drivedrivelbnlbnlowerretscsi_returnerrcmdscsi_cmdnsony_media1sony_mediasony_medianiargsiargsiargsncargscargserrerr_17_20_27_29_30_28_36_cmsg_46_47_48_49_50_51_52_53_54_55_56_57_cnts_81newbnewbnewb_128_135_136dfp_iobufretscsi_returnbncurcurbcverbosenlinedrivelowerbuflbncountsony_mediacmsgcnts2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufmedia.cso_readid.oreadid.crccmy_read_my_readmy_readlunblkblkretscsi_returnerrcmdscsi_cmdnmy_readsony_readidsony_readidniargsiargsncargscargserrerr_19_24_27blkretscsi_returnlastbdriveprbufsony_readid2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufreadid.cso_copy.ocopy.crccsony_copysony_copyniargsiargsiargsncargscargserrerr_5_12_good_search_25_copy1_37_40_41sbasewrunwrnnblocksgoosdrdbaset2lowerddrstargetdtargetretscsi_returnnbt1sony_copycopy1copy1stsdsbsbnndtdddbdberrcmdscsi_cmdretscsi_returncopy1searchsearchdrlowersbasennss3errcpretscsi_returnsearchgood3BADGOOD32nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufcopy.cso_i0.tab.oi0.tab.crcci0com_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_17_18_19_20_21_22_23_24_25_26_27_28_29_30_31_32_33_34_35_36_37_38_39_40_41_42_43_44_45_46_47_48_49_50_51_52_53_54_55_56_57_58_59_60_61_62_63_64_65_66_67_68_69_70_71_72_73_74_75_76_77_78_79_80_81_82_83_84_85_86_87_88_89_90_91_92_93_94_95_96_97_98_99_100_101_102_103_104_105_106_107_108_109_110_111_112_113_114_115_116_117_118_119_120_121_122_123_124_125_126_127_128_129_130_131_132_133_134_135_136_137_138_139_140_141_142_143_144_145_146_147_148_149_150_151_152_153_154_155_156_157_158_159_160_161_162_163_164_165_166_167_168_169_170_171_172_173_174_175_176_177_178_179_180_181_182_183_184_185_186_187_188_189_190_191_192_193_194_195_196_197_198_199_200_201_202_203_204_205_206_207_208_209_210_211_212_213_214_215_216_217_218_219_220_221_222_223_224_225_226_227_228_229_230_231_232_233_234_235_236_237_238_239_240_241_242_243_244_245_246_247_248_249_250_251_252_253_254_255_256i0.tab.cso_i1.tab.oi1.tab.crcci1err_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_17_18_19_20_21_22_23_24_25_26_27_28_29_30_31_32_33_34_35_36_37_38_39_40_41_42_43_44_45_46_47_48_49_50_51_52_53_54_55_56_57_58_59_60_61_62_63_64_65_66_67_68_69_70_71_72_73_74_75_76_77_78_79_80_81_82_83_84_85_86_87_88_89_90_91_92_93_94_95_96_97_98_99_100_101_102_103_104_105_106_107_108_109_110_111_112_113_114_115_116_117_118_119_120_121_122_123_124_125_126_127_128_129_130_131_132_133_134_135_136_137_138_139_140_141_142_143_144_145_146_147_148_149_150_151_152_153_154_155_156_157_158_159_160_161_162_163_164_165_166_167_168_169_170_171_172_173_174_175_176_177_178_179_180_181_182_183_184_185_186_187_188_189_190_191_192_193_194_195_196_197_198_199_200_201_202_203_204_205_206_207_208_209_210_211_212_213_214_215_216_217_218_219_220_221_222_223_224_225_226_227_228_229_230_231_232_233_234_235_236_237_238_239_240_241_242_243_244_245_246_247_248_249_250_251_252_253_254_255_256i1.tab.cso_scsi.tab.oscsi.tab.crccscsicmd_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_17_18_19_20_21_22_23_24_25_26_27_28_29_30_31_32_33_34_35_36_37_38_39_40_41_42_43_44_45_46_47_48_49_50_51_52_53_54_55_56_57_58_59_60_61_62_63_64_65_66_67_68_69_70_71_72_73_74_75_76_77_78_79_80_81_82_83_84_85_86_87_88_89_90_91_92_93_94_95_96_97_98_99_100_101_102_103_104_105_106_107_108_109_110_111_112_113_114_115_116_117_118_119_120_121_122_123_124_125_126_127_128_129_130_131_132_133_134_135_136_137_138_139_140_141_142_143_144_145_146_147_148_149_150_151_152_153_154_155_156_157_158_159_160_161_162_163_164_165_166_167_168_169_170_171_172_173_174_175_176_177_178_179_180_181_182_183_184_185_186_187_188_189_190_191_192_193_194_195_196_197_198_199_200_201_202_203_204_205_206_207_208_209_210_211_212_213_214_215_216_217_218_219_220_221_222_223_224_225_226_227_228_229_230_231_232_233_234_235_236_237_238_239_240_241_242_243_244_245_246_247_248_249_250_251_252_253_254busid_255_256_257_258_259_260_261_262_263_264_265_266_267_268_269_270_271_272_273_274_275_276_277_278_279_280_281_282_283_284_285scsiident_286_287_288_289_290_291_292_293_294_295_296_297_298_299_300_301cmesg_302_303_304_305_306scsi.tab.cso_sense.osense.crccsony_sensesony_senseniargsiargsncargscargserr_8_9cmdscsi_cmdbufretscsi_returnnsony_senseexstab_exstab_11_12_13_14_15_16_17_18_19_20_21_22_23_24_25_26sony_extsensesony_extsensedatadestndata_32_37_38_41_42_45bufsony_extsense2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufsense.cso_nesd.tab.onesd.tab.crccnesd_1_2_3_4_5_6_7_8_9_10_11_12_13_14_15_16_17_18_19_20_21_22_23_24_25_26_27_28_29_30_31_32_33_34_35_36_37_38_39_40_41_42_43_44_45_46_47_48_49_50_51_52_53_54_55_56_57_58_59_60_61_62_63_64_65_66_67_68_69_70_71_72_73_74_75_76_77_78_79_80_81_82_83_84_85_86_87_88_89_90_91_92_93_94_95_96_97_98_99_100_101_102_103_104_105_106_107_108_109_110_111_112_113_114_115_116_117_118_119_120_121_122_123_124_125_126_127_128_129_130_131_132_133_134_135_136_137_138_139_140_141_142_143_144_145_146_147_148_149_150_151_152_153_154_155_156_157_158_159_160_161_162_163_164_165_166_167_168_169_170_171_172_173_174_175_176_177_178_179_180_181_182_183_184_185_186_187_188_189_190_191_192_193_194_195_196_197_198_199_200_201_202_203_204_205_206_207_208_209_210_211_212_213_214_215_216_217_218_219_220_221_222_223_224_225_226_227_228_229_230_231_232_233_234_235_236_237_238_239_240_241_242_243_244_245_246_247_248_249_250_251_252_253_254_255nesd.tab.cwr_dev.odev.crccfns_fns1_3_4_5_6_7_8_9wrendev2_10_112nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufdev.cwr_inq.oinq.crccwr_extinqwr_extinqniargsiargsncargscargserr_6cmdscsi_cmdretscsi_returnvendorproductnwr_extinq2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufinq.cwr_mode.omode.crccbit_4_5_6_7_8_9_10_11_12er_ererpcferr_15_21_22_20_26nretscsi_returncmdscsi_cmderdr_drdrpcferr_31_32_33cmdscsi_cmdretscsi_returnndrbit_36_37_38_39_40_41fp_fpfppcferr_44_45_46_47_55nretscsi_returncmdscsi_cmdfpgeom_geomgeompcferr_60cmdscsi_cmdretscsi_returnngeombit_63_64_65_66cc_ccccpcferr_69_77_78nretscsi_returncmdscsi_cmdccwr_modesensewr_modesenseniargsiargsncargscargserrerr_81nwr_modesensewr_modeselectwr_modeselectniargsiargsiargsncargscargserrerr_94_97_100_103_106_110_111_109_115cmdscsi_cmdretscsi_returnnwr_modeselect2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufmode.cwr_diag.odiag.crccwr_diagwr_diagniargsiargsncargscargserr_8_11_12cmdscsi_cmdretscsi_returntnwr_diag2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufdiag.cs_h_io.oh_io.crccfd_fds_ignuass_ioss_iopreservecmdscsi_cmdncmdncmdretscsi_returnnreterr_8_14_22nretvss_iosmsg_smsg_28_29_30_31_32_33_34_35s_ios_iopreservecmdscsi_cmdncmdretscsi_returnretscsi_returnnreterrerr_56mycmdscsi_cmdnioerrstatusbufignoreduas_ios_idss_extsense2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufh_io.cge_sense.osense.crccgen_sensegen_senseniargsiargsncargscargserr_8_11_12_15_16cmdscsi_cmdretscsi_returnngen_senseexstab_exstab_18_19_20_21_22_23_24_25_26_27_28_29_30_31_32_33gen_extsensegen_extsensedatadatadestndata_39_40_41classgen_extsense2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufsense.cs_pperror.opperror.crccpperrorpperrorbufmesg_5_6pperrorscsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmdpperror.cs_fixedstr.ofixedstr.crccfixedstrfixedstrsrcsrclenlendestsfixedstrscsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmdfixedstr.cs_longat.olongat.crcclongatlongatsrcsrcnlongatscsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmdlongat.cs_xd.oxd.crccxdxdpnfp_iobuf_12_13_23_27_39_44_46_47_51indlsbufdidstarxd2nameverboseextsensefns121namehelpparamfn1scsi_returnidscsi_statscsi_msgflagstypereg1reg2sensepaddatanreadscsi_returnscsi_cmdidbus_idflagscmddatascsi_cmd_iobuf_cnt_ptr_base_flag_file_iobufxd.catoi.oclose.octime.octype.odata.oerrlst.oexit.ofgets.ofilbuf.oflsbuf.ofopen.ofprintf.ogetfields.olseek.omalloc.omemcmp.omemcpy.omemset.omin.oonexit.oopen.oprintf.orand.oread.osbrk.osetbuf.osleep.osprintf.ostrcat.ostrchr.ostrcmp.ostrcpy.ostrdup.ostrlen.ostrncmp.ostrncpy.otime.oudiv.owrite.o_cleanup.o_exit.oalarm.ocerror.ocreat.odoprnt.ogetpid.okill.osetjmp.osignal.o_exitstart_main_environ__iob_setbuf_scsi_target_set_sony_s_id_genericdev_printf_fflush_fgets_strchr_getmfields_fprintf_atoi_strlen_strncmp_setdevice_ss_extsense_strcmp_gen_help_sonydev_wrendev_gen_dev_gen_capacity_gen_display_gen_inq_gen_readt_gen_reset_gen_scsi_gen_sense_gen_start_gen_stop_gen_tur_gen_extsense_gen_rmb_gen_devtype_s_io_fixedstr_longat_sprintf_ss_ioudiv_time_srand_nrand_sony_alt_sony_conf_sony_copy_sony_diskid_sony_eject_sony_inq_sony_internal_sony_media_sony_readid_sony_rel_sony_sense_sony_set_sony_status_sony_extsense__flsbuf_min_sony_istatus_shelfside_xd_i0com_scsicmd_i1err_scsiident_busid_cmesg_sony_media1_fopen_pperror_strdup_strncpy_ctime_nesd_strcat_wr_diag_wr_extinq_wr_modesense_wr_modeselect_sleep_memcpy_s_ignua_open_write_close_read_strcpy_errno_sys_nerr_sys_errlist_memcmpcerror_localtime_asctime_ftime_gmtime_dysize__ctype__sibuf__sobuf__lastbuf__cleanup__exit__filbuf_malloc__setcleanup__stdioclean_onexit_fclose_free_creat_lseek__doprnt_setfields_memset_getfields_sbrk_ialloc_realloc_mstats__onexitfns_rand_lrand_frand_Srand_end_brk_alarm_setjmp_signal_getpid_kill_pause_longjmp_snprintf_getppid0707070035050454011006660011710000040000011505010464020224300001100000007344scsish.c#include	<stddef.h>
#include	<stdio.h>
#include	<string.h>
#include	"scsi.h"
#include	"scsish.h"

extern Device genericdev;
static Device *dev = 0;
static Function *function(char *, Device **);
static void parse(FILE *);

main()
{
	setbuf(stdout, (char *)0);
	scsi_target(2);
	set_sony();
	printf("dev=%s, target=%d:\n", dev? dev->name:genericdev.name, s_id);
	parse(stdin);
	exit(0);
}

static void
parse(FILE *fp)
{
	int i, n;
	char *param;
	char buf[4096];
	char *ptrs[100], *cargs[20];
	int iargs[20];
	int nc, ni;
	Function *fn;
	Device *thatdev;
	char err[512];

	for(;;){
		printf("> ");
		fflush(stdout);
		if(fgets(buf, sizeof buf, fp) == NULL)
			break;
		if(param = strchr(buf, '\n'))
			*param = 0;
		n = getmfields(buf, ptrs, sizeof ptrs/sizeof ptrs[0]);
		if(n < 1)
			continue;
		if((fn = function(ptrs[0], &thatdev)) == 0){
			fprintf(stderr, "can't find cmd '%s'\n", ptrs[0]);
			continue;
		}
		ni = nc = 0;
		param = fn->param;
		for(i = 1; i < n; i++){
			switch(*param++)
			{
			case 'I':
				iargs[ni++] = atoi(ptrs[i]);
				break;
			case 'L':
				iargs[ni++] = atoi(ptrs[i]);
				if((iargs[ni-1] < 0) || (iargs[ni-1] > 7)){
					fprintf(stderr, "%s: lun %d out of range\n", ptrs[0], iargs[ni-1]);
					continue;
				}
				break;
			case 'S':
				cargs[nc++] = ptrs[i];
				break;
			default:
				break;
			}
			if(*param == '?')
				param++;
		}
		while(param[0] && param[1] && (param[1] == '?'))
			param += 2;
		if((i == n) != (*param == 0)){
			printf("param mismatch: %s: i=%d/n=%d param='%s'\n",
				ptrs[0], i, n, param);
			printf("device %s: %s\n", thatdev->name, fn->help);
			continue;
		}
		if((*fn->fn)(ni, iargs, nc, cargs, err))
			fprintf(stderr, "error in '%s': %s\n", fn->name, err);
	}
}

static Function *
flook(Function *f, char *name)
{
	for(; f->help; f++)
		if(strncmp(f->name, name, strlen(f->name)) == 0)
			return(f);
	return(0);
}

static Function *
function(char *name, Device **devptr)
{
	Function *f = 0;

	if(dev && dev->fns && (f = flook(dev->fns, name)))
		*devptr = dev;
	else if(f = flook(genericdev.fns, name))
		*devptr = &genericdev;
	return(f);
}

void
setdevice(Device *d)
{
	dev = d;
	ss_extsense = dev->extsense;
}

static
help(Device *d, char *cmd, Device *prec)
{
	Function *f;
	Function *base;

	base = (prec && prec->fns)? prec->fns:0;
	if(cmd == 0){
		printf("device %s(%s):\n", d->name, d->verbose);
		if(f = d->fns)
			while(f->name){
				if((base == 0) || (flook(base, f->name) == 0))
					printf("\t%s\n", f->help);
				f++;
			}
		return(0);
	} else {
		if(f = d->fns)
			while(f->name)
				if(strcmp(f->name, cmd) == 0){
					printf("(%s) %s\n", d->name, f->help);
					return(1);
				} else
					f++;
		return(0);
	}
}

int
gen_help(int niargs, int *iargs, int ncargs, char **cargs)
{
#pragma ref niargs
#pragma ref iargs

	if(dev)
		if(help(dev, ncargs == 0? 0:cargs[0], (Device *)0))
			return(0);
	help(&genericdev, ncargs == 0? 0:cargs[0], dev);
	return(0);
}

extern Device sonydev;
extern Device wrendev;
static Device *devs[] = {
	&genericdev,
	&sonydev,
	&wrendev,
	0
};

int
gen_dev(int niargs, int *iargs, int ncargs, char **cargs)
{
	Device **d;

#pragma ref niargs
#pragma ref iargs

	if(ncargs == 0)
		printf("dev=%s\n", dev? dev->name : genericdev.name);
	else if(strcmp(cargs[0], "?") == 0){
		printf("available devices:\n");
		for(d = devs; *d; d++)
			printf("\t%s(%s)\n", (*d)->name, (*d)->verbose);
	} else {
		for(d = devs; *d; d++)
			if(strcmp(cargs[0], (*d)->name) == 0)
				break;
		if(*d)
			setdevice(*d);
		else
			fprintf(stderr, "device '%s' unknown\n", cargs[0]);
	}
	return(0);
}

void
scsi_target(int n)
{
	if((n < 0) || (n >= 8))
		fprintf(stderr, "%d is an invalid target\n", n);
	else
		s_id = n;
}

set_sony()
{
	int iargs[1];
	char *cargs[1];

	cargs[0] = "sony";
	gen_dev(0, iargs, 1, cargs);
}
0707070035050453651006660011710000040000010451350457563432000001100000001004scsish.htypedef int (*Functionfn)(int, int *, int, char **, char *);

typedef struct
{
	char *name;
	char *help;
	char *param;
	Functionfn fn;
} Function;

typedef struct
{
	char *name;
	char *verbose;
	void (*extsense)(uchar *, char *, int);
	Function *fns;
} Device;
extern void setdevice(Device *);

extern void scsi_target(int);
extern void fixedstr(uchar *src, int len, char *dest);
extern void gen_extsense(uchar *, char *, int);
extern int shelfside(char *arg, char *err);
extern void xd(uchar *base, int, FILE *fp);
0707070035050422071006660011710000040000010273200464713423200000700000000215sgi.mk# config stuff: sgi; system v with moran/droneck /dev/scsi
CC=pcc		# must be ansi
RANLIB=:
LDFLAGS= -lds
IO=md_io
CFLAGS=-g -I../inc
NPROC=4
0707070035050453470407770011710000040000020452060464700560100000500000000000sony0707070035050453461006660011710000040000010031700463122750000001300000001570sony/dev.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

static Function fns[] = {
	{ "alternate", "alternate [lun]", "L?", sony_alt },
	{ "config", "config", "", sony_conf },
	{ "copy", "copy srclun start n destlun dest", "LIILI", sony_copy },
	{ "diskid", "diskid [lun]", "L?", sony_diskid },
	{ "eject", "eject lun", "L", sony_eject },
	{ "inq", "inq [lun]", "L?", sony_inq },
	{ "internal", "internal test [drive]  # internal -1 for list", "II?", sony_internal },
	{ "media", "media lun start count [file]", "LIIS?", sony_media },
	{ "readid", "readid lun [start]", "LI?", sony_readid },
	{ "rel", "rel lun [shelfside]", "LS?", sony_rel },
	{ "sense", "sense [lun=0]", "L?", sony_sense },
	{ "set", "set shelfside lun", "SL", sony_set },
	{ "status", "status", "", sony_status },
	{ 0 }
};

Device sonydev = {
	"sony", "Sony WDA-3000",
	sony_extsense,
	fns
};
0707070035050453451006660011710000040000010452100457563432100001300000001625sony/inq.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

int
sony_inq(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n, i;

#pragma ref ncargs
#pragma ref cargs

	if(niargs == 0)
		for(niargs = 0; niargs < 8; niargs++)
			iargs[niargs] = niargs;
	for(i = 0; i < niargs; i++){
		set6(cmd, 0x12, iargs[i]<<5, 0, 0, 6, 0);
		if(n = s_io(0, &cmd, 0, &ret, 6, err))
			return(n);
		printf("inq(%d,%d): ", s_id, iargs[i]);
		if(ret.data[5]&0x80)
			printf("power off (0x%x)\n", ret.data[5]&0xFF);
		else if(ret.data[5]&0x40)
			printf("empty (0x%x)\n", ret.data[5]&0xFF);
		else
			printf("%s,%s,%s,%s (0x%x)\n",
				(ret.data[5]&0x08)?"write protect":"writable",
				(ret.data[5]&0x04)?"no alternate":"",
				(ret.data[5]&0x02)?"drive error":"",
				(ret.data[5]&0x01)?"ready":"not ready",
				ret.data[5]&0xFF);
	}
	return(0);
}
0707070035050453441006660011710000040000010452120457563432100001300000001423sony/alt.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

static
table(int drive, int tab, uchar *data)
{
	int n, i;

	n = data[6];
	printf("(%d,%d): alternate table %d (%d entries)\n", s_id, drive, tab, n);
	for(data += 0x18, i = 0; i < n; data += 4, i++)
		printf("%ld%c", data[0]+256L*data[1]+256L*256*data[2],
			(i%10 == 9)? '\n':' ');
	if((i%10) && n)
		putchar('\n');
}

int
sony_alt(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n, i;

#pragma ref ncargs
#pragma ref cargs

	if(niargs == 0)
		iargs[0] = 0;
	set6(cmd, 0xC3, iargs[0]<<5, 0, 0, 0, 0);
	if(n = s_io(0, &cmd, 0, &ret, 4096, err))
		return(n);
	for(i = 0; i < 4; i++)
		table(iargs[0], i+1, &ret.data[1024*i]);
	return(0);
}
0707070035050453431006660011710000040000011505140464060013200001600000002236sony/config.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

static char mtab[5][2] =
{
	'0', '0', '1', '1', '1', '2', '2', '2', '?', '?'
};
static char *brdname[] = {
	"no doard", "T.D. Systems Viking", "U.S. Design 1158"
};

int
sony_conf(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n, i;
	char buf[512];

#pragma ref niargs
#pragma ref iargs
#pragma ref ncargs
#pragma ref cargs

	set6(cmd, 0x12, 0, 0, 0, 44, 0);
	if(n = s_io(0, &cmd, 0, &ret, 44, err))
		return(n);
	i = min(ret.data[37], 4);
	fixedstr(&ret.data[8], 28, buf);
	printf("config(%d,%d): %s device, '%s', %c controller%s, %c drive%s\n",
		s_id, 0, (ret.data[0] == 0x4)? "WORM":"Unknown",
		buf, mtab[i][0], (mtab[i][0] == '1')?"":"s",
		mtab[i][1], (mtab[i][1] == '1')?"":"s");
	printf("\tUnibus-SCSI controller=%s\n", brdname[ret.type]);
	printf("\tROMS:");
	if(ret.data[38] != 0xFF)
		printf(" upper controller=0x%x,", ret.data[38]);
	if(ret.data[40] != 0xFF)
		printf(" lower controller=0x%x,", ret.data[40]);
	printf( " IF-129=0x%x, SY-46=0x%x, SS-30=0x%x\n", ret.data[36],
		ret.data[42], ret.data[43]);
	return(0);
}
0707070035050453421006660011710000040000011504400463127760200001600000004127sony/status.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"

static
shelf(int i)
{
	printf(": ");
	if(i&0x80){
		printf("%s,", (i&0x40)? "disk":"temporary");
		if(i&0x10) printf("wait loading,");
		if(i&0x08) printf("wait ejection,");
		if(i&0x20) printf("use shelf instead of drive for LUN %d", i&7);
	} else
		printf("no disk");
	printf("\n");
}

int
sony_istatus(struct scsi_return *ret, char *err)
{
	struct scsi_cmd cmd;
	int n;

	set6(cmd, 0x1D, 0, 0, 0, 10, 0);
	cmd.data[0] = 0xE2;	/* internal status */
	cmd.data[1] = 0;
	cmd.data[2] = 0;
	cmd.data[3] = 0;
	cmd.data[4] = 0;
	cmd.data[5] = 0;
	cmd.data[6] = 0;
	cmd.data[7] = 0;
	cmd.data[8] = 0;
	cmd.data[9] = 0;
	if(n = s_io(0, &cmd, 10, ret, 0, err))
		return(n);
	setdiag(cmd, 0, 128);
	if(n = s_io(0, &cmd, 0, ret, 128, err))
		return(n);
	return(0);
}

int
sony_status(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_return ret;
	int n, i, start;
	uchar *d;

#pragma ref niargs
#pragma ref iargs
#pragma ref ncargs
#pragma ref cargs

	if(n = sony_istatus(&ret, err))
		return(n);
	d = &ret.data[16];
	for(i = 0; i < 8; i++, d += 4){
		printf("drive %d: %sready,%sdisk in LUN,power %s,", i,
			(d[0]&1)?"":"not ", (d[0]&0x40)?"":"no ",
			(d[0]&0x80)?"off":"on");
		if(d[0]&0x40){
			if(d[1]&0x80){
				printf("disk in drive %d", d[1]&0x7f);
				if(d[2]&0x80)
					printf(", return shelf %d%c", (d[2]&0x7F)/2, "ab"[d[2]&1]);
			} else
				printf("disk in shelf %d%c (%d)", (d[1]&0x7f)/2, (d[1]&1)+'a', d[1]&0x7f);
		}
		printf("\n");
	}
	for(i = 0; i < 50;){
		for(start = i; ++i < 50;)
			if(d[i] != d[start])
				break;
		if(i == start+1)
			printf("%d", start);
		else
			printf("%d-%d", start, i-1);
		shelf(d[start]);
	}
	d += 50;
	printf("I/O shelf");
	shelf(*d);
	d++;
	printf("carrier: ");
	i = *d&0x7F;
	if(*d&0x80)
		printf("disk shelf=%d%c (%d)\n", i/2, 'a'+(i&1), i);
	else
		printf("no disk\n");
	d++;
	if(*d&0x80)
		printf("upper drive: disk, LUN=%d\n", *d&7);
	else
		printf("upper drive: no disk\n");
	d++;
	if(*d&0x80)
		printf("lower drive: disk, LUN=%d\n", *d&7);
	else
		printf("lower drive: no disk\n");
	return(0);
}
0707070035050453411006660011710000040000010452160457563432200001300000000754sony/rel.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

int
sony_rel(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n, i, j;

#pragma ref niargs

	if(ncargs == 0){
		i = 0;
		j = 0;		/* its ignored anyway */
	} else {
		i = 1;
		if((j = shelfside(cargs[0], err)) < 0)
			return(1);
	}
	set6(cmd, 0xD7, (iargs[0]<<5)|i, 0, j, 0, 0);
	if(n = s_io(0, &cmd, 0, &ret, 0, err))
		return(n);
	return(0);
}
0707070035050453401006660011710000040000010452170457563432200001300000000642sony/set.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

int
sony_set(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n, i;

#pragma ref niargs
#pragma ref ncargs

	if((i = shelfside(cargs[0], err)) < 0)
		return(1);
	set6(cmd, 0xD6, iargs[0]<<5, 0, i, 0, 0);
	if(n = s_io(0, &cmd, 0, &ret, 0, err))
		return(n);
	return(0);
}
0707070035050453371006660011710000040000010452200457563432200001500000000576sony/eject.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

int
sony_eject(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n;

#pragma ref niargs
#pragma ref ncargs
#pragma ref cargs

	set6(cmd, 0xC0, iargs[0]<<5, 0, 0, 0, 0);
	if(n = s_io(0, &cmd, 0, &ret, 0, err))
		return(n);
	return(0);
}
0707070035050453361006660011710000040000010452210457563432200002100000000754sony/shelfside.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

int
shelfside(char *arg, char *err)
{
	char *oarg = arg;
	int shelf;

	if((*arg < '0') || (*arg > '9')){
usage:
		sprintf(err, "shelfside '%s' must be numa or numb", oarg);
		return(-1);
	}
	shelf = 0;
	while((*arg >= '0') && (*arg <= '9'))
		shelf = 10*shelf + *arg++ - '0';
	shelf <<= 1;
	if(*arg == 'a')
		;
	else if(*arg == 'b')
		shelf |= 1;
	else
		goto usage;
	if(*++arg)
		goto usage;
	return(shelf);
}
0707070035050453351006660011710000040000010452220457563432200001600000000742sony/diskid.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

int
sony_diskid(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n;

#pragma ref ncargs
#pragma ref cargs

	if(niargs == 0)
		iargs[0] = 0;
	set6(cmd, 0xC2, iargs[0]<<5, 0, 0, 0, 0);
	if(n = s_io(0, &cmd, 0, &ret, 1024, err))
		return(n);
	printf("(%d,%d) disk id block:\n", s_id, iargs[0]);
	xd(ret.data, 1024, stdout);
	return(0);
}
0707070035050453341006660011710000040000010332450463123222500002000000011302sony/internal.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

static
internal(int n, int b1, int nb, struct scsi_return *ret, char *err)
{
	struct scsi_cmd cmd;

	set6(cmd, 0x1D, b1, 0, 0, 10, 0);
	cmd.data[0] = n;
	cmd.data[1] = b1>>8;
	cmd.data[2] = 0;
	cmd.data[3] = 0;
	cmd.data[4] = 0;
	cmd.data[5] = 0;
	cmd.data[6] = 0;
	cmd.data[7] = 0;
	cmd.data[8] = 0;
	cmd.data[9] = 0;
	if(n = s_io(0, &cmd, 10, ret, 0, err))
		return(n);
	setdiag(cmd, 0, nb);
	if(n = s_io(0, &cmd, 0, ret, nb, err))
		return(n);
	return(0);
}

static char *cmds[] = {
	"internal command table",
	"error information table",
	"arm controller diagnostics",
	"scsi control board diagnostics",
	"drive controller diagnostics",
	"jukebox status",
	0
};

static char *msg1[16] =
{
	"drive not connected or powered off",
	"drive connected but no disk",
	"diagnostic aborted: write-protect",
	"diagnostic aborted: write area full",
	"urk 4", "urk 5", "urk 6", "urk 7", "urk 8", "urk 9", "urk 10",
	"urk 11", "urk 12", "urk 13", "urk 14", "urk 15"
};

static char *testn[10] =
{
	"drive on/off",
	"read disk id",
	"move",
	"seek",
	"blank sector search",
	"written sector search",
	"search writable area",
	"write",
	"ECC margin check",
	"read data compare"
};

int
sony_internal(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n;
	register unsigned char *d;
	int i, drive, lower;
	long t1, t2;
	extern char *cmesg[];
	extern char *i0com[], *i1err[], *scsicmd[], *busid[], *scsiident[];

#pragma ref ncargs
#pragma ref cargs

	switch(iargs[0])
	{
	case -1:
		printf("available internal commands:\n");
		for(i = 0; cmds[i]; i++)
			printf("\tinternal %d: %s\n", i, cmds[i]);
		break;
	case 0:
		if(internal(0xE5, 0, 256, &ret, err))
			return(1);
		printf("internal 0 (%s):\n", cmds[iargs[0]]);
		printf("Diagnostic #E5: last 16 internal tasks (drive,shelf)\n");
		for(i = 0, d = ret.data; i < 16; i++, d += 16){
			printf("[%d] %s (%d,%d)\n",
				d[0], i0com[d[1]], d[2], d[3]);
		}
		break;
	case 1:
		if(internal(0xE4, 0, 256, &ret, err))
			return(1);
		printf("internal 1 (%s):\n", cmds[iargs[0]]);
		printf("Diagnostic #E4: last 16 errors; initiator[identify] error[sense] (cmd)\n");
		for(i = 0, d = ret.data; i < 16; i++, d += 16){
			printf("%s[%s]: %s[#%x] (%s)\n",
				busid[d[0]], scsiident[d[1]], i1err[d[14]], d[15], scsicmd[d[4]]);
		}
		break;
	case 2:
		printf("internal 2 (%s):\n", cmds[iargs[0]]);
		fflush(stdout);
		time(&t1);
		if(internal(0x90, 0, 8, &ret, err))
			return(1);
		time(&t2);
		d = ret.data;
		if(d[0] == 0)
			printf("\tended normally");
		else
			printf("\tfailed, error codes=#%x, #%x, #%x",
				d[0], d[1], d[2]);
		printf(" (time: %lds)\n", t2-t1);
		break;
	case 3:
		printf("internal 3 (%s):\n", cmds[iargs[0]]);
		fflush(stdout);
		time(&t1);
		if(internal(0xe0, 0, 8, &ret, err))
			return(1);
		time(&t2);
		d = ret.data;
		if(d[0] == 0)
			printf("\tended normally");
		else
			printf("\tfailed, error codes=#%x, #%x, #%x",
				d[0], d[1], d[2]);
		printf(" (time: %lds)\n", t2-t1);
		break;
	case 4:
		if(niargs == 1)
			iargs[1] = 0;		/* zero default */
		drive = iargs[1];
		if(sony_istatus(&ret, err))
			return(1);
		if((ret.data[100]&0x80) && (drive == (ret.data[100]&7)))
			lower = 0x100;
		else if((ret.data[101]&0x80) && (drive == (ret.data[101]&7)))
			lower = 0x200;
		else {
			fprintf(stderr, "drive %d not occupied\n", drive);
			return(1);
		}
		printf("drive %d[%ser]: %s\n", drive, (lower == 0x200)?"low":"upp", cmds[iargs[0]]);
		fflush(stdout);
		time(&t1);
		if(internal(0x18, lower, 256, &ret, err))
			return(1);
		time(&t2);
		d = ret.data;
		if(d[1]&0x80){
			printf("diagnostic result:");
			if((d[1]&0x70) == 0)
				printf(" no faults");
			else {
				if(d[1]&0x10)
					printf(" controller-fault");
				if(d[1]&0x20)
					printf(" drive-fault");
				if(d[1]&0x10)
					printf(" disk-fault");
				printf(" (last error code 0x%2.2ux)", d[4]);
			}
		} else
			printf("diagnostic not performed: %s", msg1[d[1]&0xF]);
		printf(" (time: %lds)\n", t2-t1);
		for(i = 0; i < 10; i++)
			printf("test %d[%s]: %s\n", i, testn[i], cmesg[d[i*8+drive+8]]);
		printf("diagnostic count (drive:avail):");
		for(d += 104, i = 0; i < 8; i++, d += 2)
			printf(" %d:%d", i, d[0]+d[1]*256);
		printf("\n");
		break;
	case 5:
		set10(cmd,  0xD3, 0, 0, 0, 0, 0, 0, 0, 0, 0);
		if(n = s_io(0, &cmd, 0, &ret, 20, err))
			return(n);
		printf("%s: component(fatal err/err/cmds)\n", cmds[iargs[0]]);
		d = ret.data;
#define	ONE(str, x, sep)	printf("%s(%d/%d/%d)%c", str, d[x+3], d[x+2], d[x+1]+256*d[x], sep)
	
		ONE("upper drive", 4, ' ');
		ONE("lower drive", 8, ' ');
		ONE("sys control", 12, ' ');
		printf("backup mem(0/%d/%d)\n", d[19]+256*d[18], d[17]+256*d[16]);
		break;
	}
	return(0);
}
0707070035050453331006660011710000040000010452240457563432200001400000000465sony/i0.tabi0com
00	nop
01	sense result
02	version check
04	recover disk warning
08	sense alternate information
0a	error margin check
18	diagnostics
20	sense drive status
21	recalibrate
22	drive on
23	drive off
24	disk out
30	seek
31	move
32	read
a1	disk check
a2	carrier move
b1	disk set
b2	disk release
b3	disk rotate
0707070035050453321006660011710000040000010452260457563432200001400000000477sony/i1.tabi1err
94	drive error (SONY)
a0	invalid command
a1	invalid LUN
a2	reserved bit nonzero
a3	illegal logical address
a4	illegal shelf number
a5	illegal parameter length
a6	illegal parameter
a7	unacceptable diagnostics parameter
a8	unit attention
a9	drive not ready
aa	medium removal prevented
ab	reserved
ac	no disk in LUN
0707070035050453311006660011710000040000010452270457563432200001600000001777sony/scsi.tabscsicmd
00	test unit ready
01	rezero unit
03	request sense
08	read
0a	write
0b	seek
0c	move
12	inquiry
15	mode select
16	reserve
17	release
18	copy
1a	mode sense
1b	start/stop unit
1c	receive diagnostics
1d	send diagnostics
1e	prevent/allow medium removal
25	read capacity
28	read
2a	write
2c	blank sector search
2d	written sector search
c0	disk eject
c2	read disk id
c3	sense alternate information
c4	recover disk warning
d3	request recovered status
d6	disk set
d7	disk release
busid
01	0
02	1
80	7
scsiident
80	no dis/reconnect-LUN 0
81	no dis/reconnect-LUN 1
82	no dis/reconnect-LUN 2
83	no dis/reconnect-LUN 3
84	no dis/reconnect-LUN 4
85	no dis/reconnect-LUN 5
86	no dis/reconnect-LUN 6
87	no dis/reconnect-LUN 7
c0	dis/reconnect-LUN 0
c1	dis/reconnect-LUN 1
c2	dis/reconnect-LUN 2
c3	dis/reconnect-LUN 3
c4	dis/reconnect-LUN 4
c5	dis/reconnect-LUN 5
c6	dis/reconnect-LUN 6
c7	dis/reconnect-LUN 7
cmesg
0	good
e0	test not done
ee	diagnostic could not be done
fe	drive not ready (no disk)
ff	not connected or power off
0707070035050453301006660011710000040000011504740464014764400001500000005757sony/media.c#include	<stdio.h>
#include	<stddef.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

static int cnts[256];
static char *cmsg[256];

sony_media1(int drive, long lbn, int lower, struct scsi_return *ret, char *err)
{
	struct scsi_cmd cmd;
	int n;

	set6(cmd, 0x1D, drive<<5, 0, 0, 10, 0);
	cmd.data[0] = 0x0A;	/* error margin check */
	cmd.data[1] = lower? 2:1;
	cmd.data[2] = 0;
	cmd.data[3] = 0;
	cmd.data[4] = drive;
	cmd.data[5] = lbn;
	cmd.data[6] = lbn>>8;
	cmd.data[7] = lbn>>16;
	cmd.data[8] = 0;
	cmd.data[9] = 0;
	if(n = s_io(0, &cmd, 10, ret, 0, err))
		return(n);
	setdiag(cmd, drive, 256);
	if(n = s_io(0, &cmd, 0, ret, 256, err))
		return(n);
	return(0);
}

int
sony_media(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_return ret;
	uchar *d;
	int bn, c;
	char buf[256];
	int lower;
	int nline;
	int cur, curb;
	int drive = iargs[0];
	long lbn = iargs[1];
	int count = iargs[2];
	extern char *strdup(char *);
	int verbose = 0;
	FILE *fp = 0;

#pragma ref niargs

	if(ncargs == 1){
		if(strcmp(cargs[0], "-v") == 0)
			verbose = 1;
		else if((fp = fopen(cargs[0], "w")) == NULL){
			pperror(err, cargs[0]);
			return(1);
		}
	}
	if(sony_istatus(&ret, err))
		return(1);
	if((ret.data[100]&0x80) && (drive == (ret.data[100]&7)))
		lower = 0;
	else if((ret.data[101]&0x80) && (drive == (ret.data[101]&7)))
		lower = 1;
	else {
		sprintf(err, "drive %d not occupied and ready\n", drive);
		return(1);
	}
	printf("media margin check for %d blocks [%d-%d] on %s drive (%d,%d):",
		count, lbn, lbn+count-1, lower? "lower":"upper", s_id, drive);
	if(fp)
		printf(" stored in '%s'", cargs[0]);
	putchar('\n');
	if(cmsg[0] == 0){
		for(bn = 0; bn < 256; bn++){
			sprintf(buf, "rare error 0x%x", bn);
			cmsg[bn] = strdup(buf);
		}
		cmsg[0] = "good";
		cmsg[0x40] = "seek error 1 (alternated)";
		cmsg[0x41] = "seek error 2 (alternated)";
		cmsg[0x42] = "seek error 3 (alternated)";
		cmsg[0x44] = "read error 1 (alternated)";
		cmsg[0x45] = "unwritten";
		cmsg[0x46] = "read error 3 (alternated)";
		cmsg[0x81] = "<50% burst";
		cmsg[0x82] = "50-96% burst (alternated)";
		cmsg[0x83] = ">96% burst (alternated)";
		cmsg[0x84] = "uncorrectable (alternated)";
	}
#define	DO(ch,cp) if(fp) putc(ch,fp); else if(ch != cur){\
			int newb = bn+cp-ret.data;\
			if(verbose && (curb>=0)){\
				printf("%d %s@%d, ", newb-curb, cmsg[cur], curb);\
				if(++nline == 5){nline = 0; putchar('\n');}\
			}\
			cur = ch;\
			curb = newb;\
		}
	cur = 256;
	curb = -1;
	nline = 0;
	for(bn = 0; bn < 256; bn++)
		cnts[bn] = 0;
	for(bn = lbn, c = count; c >= 256; c -= 256, bn += 256){
		if(sony_media1(drive, bn, lower, &ret, err))
			return(1);
		for(d = ret.data; d < &ret.data[256];){
			DO(*d, d);
			cnts[*d++]++;
		}
	}
	if(c){
		if(sony_media1(drive, bn, lower, &ret, err))
			return(1);
		for(d = ret.data; c; c--){
			DO(*d, d);
			cnts[*d++]++;
		}
	}
	DO(256, d);
	if(nline)
		putchar('\n');
	printf("\t");
	for(c = 0; c < 256; c++)
		if(cnts[c])
			printf("%d %s, ", cnts[c], cmsg[c]);
	printf("\n");
	return(0);
}
0707070035050453271006660011710000040000011504660464215423500001600000002140sony/readid.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

static int
my_read(int lun, long blk, struct scsi_return *ret, char *err)
{
	struct scsi_cmd cmd;
	int n;

	cmd.bus_id = s_id;
	set10(cmd, 0x28, lun<<5, blk>>24, blk>>16, blk>>8, blk, 0, 0, 1, 0);
	n = ss_io(0, &cmd, 0, ret, 1024, err);
	return(n);
}

int
sony_readid(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_return ret;
	char buf[128];
	int drive = iargs[0];
	long blk, lastb;
	int pr = 0;

#pragma ref ncargs
#pragma ref cargs

	buf[0] = 0;
	if(niargs == 2){
		if((blk = iargs[1]) < 0){
			blk = -blk;
			pr = 1;
		}
	} else {
		if(my_read(drive, 0L, &ret, err) == 0)
			goto done;
		blk = 1;
	}
	for(lastb = -1;;){
		if(pr){
			printf("%d: ", blk);
		}
		if(my_read(drive, blk, &ret, err))
			break;
		lastb = blk;
		blk = ((long *)ret.data)[9];
	}
	if(lastb < 0){
		printf("read(blk=%d) failed\n", blk);
		return(1);
	}
	if(my_read(drive, lastb, &ret, err) != 0)
		return(1);
done:
	strncpy(buf, (char *)&ret.data[42], 128);
	buf[127] = 0;
	printf("(%d,%d): '%s'\n", s_id, drive, buf);
	return(0);
}
0707070035050453261006660011710000040000011504720464014762400001400000006207sony/copy.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

#define	PROGRESS	\
		if(sbase/TALK != goo){\
			goo = sbase/TALK;\
			time(&t2);\
			printf("\tdoing block %ld at %s", goo*TALK, ctime(&t2));\
		}

static char good[256];	/* by default, all BAD */
typedef enum { BAD = 0, GOOD } Searchtype;
static int copy1(int, int, int, int, int, int, int, char *);
static int search(int, int, int, int, Searchtype, char *);

int
sony_copy(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	int n;
	int sdr = iargs[0];
	int sbase = iargs[1];
	int nblocks = iargs[2];
	int ddr = iargs[3];
	int dbase = iargs[4];
	int starget = s_id;
	int dtarget = s_id;
	int wr, unwr;
	long nb = nblocks;
	long t1, t2;
	long goo;
	int lower;
	struct scsi_return ret;
#define		TALK		10000
	extern char *ctime();

#pragma ref niargs
#pragma ref ncargs
#pragma ref cargs

	printf("copying drive (%d,%d)[%d-%d] to drive (%d,%d)[%d-%d]\n",
		starget, sdr, sbase, sbase+nblocks-1,
		dtarget, ddr, dbase, dbase+nblocks-1);
	if(sony_istatus(&ret, err))
		return(1);
	if((ret.data[100]&0x80) && (sdr == (ret.data[100]&7)))
		lower = 0;
	else if((ret.data[101]&0x80) && (sdr == (ret.data[101]&7)))
		lower = 1;
	else {
		sprintf(err, "drive %d not occupied\n", sdr);
		return(1);
	}
	good[0] = good[0x81] = good[0x82] = good[0x83] = GOOD;
	time(&t1);
	goo = -1;
	while(nblocks > 0){
		/* search for a block to copy */
		while(n = min(256, nblocks)){
			wr = search(sdr, lower, sbase, n, GOOD, err);
			if(wr < 0)
				break;
			sbase += wr;
			dbase += wr;
			nblocks -= wr;
			if(wr < n)
				break;
			PROGRESS
		}
		/* now copy until the first bad block */
		while(n = min(256, nblocks)){
			unwr = search(sdr, lower, sbase, n, BAD, err);
			if(unwr < 0)
				break;
			/*printf("writing %d-%d\n", sbase, sbase+unwr-1);/**/
			if(copy1(starget, sdr, sbase, unwr, dtarget, ddr, dbase, err))
				break;
			sbase += unwr;
			dbase += unwr;
			nblocks -= unwr;
			PROGRESS
		}
	}
	time(&t2);
	t2 -= t1;
	if(t2 == 0) t2 = 1;
	printf("%ds: ", t2);
	if(nblocks){
		printf("copy buggered up: sbase=%d nblks=%d dbase=%d\n",
			sbase, nblocks, dbase);
		return(1);
	}
	printf("%d blocks at %.1fKB/s\n", nb, nb/(float)t2);
	return(0);
}

static int
copy1(int st, int sd, int sb, int n, int dt, int dd, int db, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;

	set6(cmd, 0x18, sd<<5, 0, 0, 20, 0);
	cmd.data[0] = 0x10;	/* copy */
	cmd.data[1] = 0;
	cmd.data[2] = 0;
	cmd.data[3] = 0;
	cmd.data[4] = (st<<5)|sd;
	cmd.data[5] = (dt<<5)|dd;
	cmd.data[6] = 0;
	cmd.data[7] = 0;
	cmd.data[8] = n>>24;
	cmd.data[9] = n>>16;
	cmd.data[10] = n>>8;
	cmd.data[11] = n;
	cmd.data[12] = sb>>24;
	cmd.data[13] = sb>>16;
	cmd.data[14] = sb>>8;
	cmd.data[15] = sb;
	cmd.data[16] = db>>24;
	cmd.data[17] = db>>16;
	cmd.data[18] = db>>8;
	cmd.data[19] = db;
	return(s_io(0, &cmd, 20, &ret, 0, err));
}

static int
search(int dr, int lower, int sbase, int n, Searchtype s, char *err)
{
	uchar *cp;
	struct scsi_return ret;

	if(n <= 0)
		return(0);
	if(n > 256)
		n = 256;
	if(sony_media1(dr, sbase, lower, &ret, err))
		return(-1);
	for(cp = ret.data; n-- > 0; cp++)
		if(good[*cp] != s)
			break;
	return(cp-ret.data);
}
0707070035050453251006660011710000040000010452330457563432300001300000001477sony/fns.hextern int sony_inq(int, int *, int, char **, char *);
extern int sony_alt(int, int *, int, char **, char *);
extern int sony_conf(int, int *, int, char **, char *);
extern int sony_status(int, int *, int, char **, char *);
extern int sony_set(int, int *, int, char **, char *);
extern int sony_rel(int, int *, int, char **, char *);
extern int sony_eject(int, int *, int, char **, char *);
extern int sony_diskid(int, int *, int, char **, char *);
extern int sony_internal(int, int *, int, char **, char *);
extern int sony_media(int, int *, int, char **, char *);
extern int sony_readid(int, int *, int, char **, char *);
extern int sony_copy(int, int *, int, char **, char *);
extern int sony_sense(int, int *, int, char **, char *);
extern void sony_extsense(uchar *, char *, int);

extern int shelfside(char *arg, char *err);
0707070035050453241006660011710000040000010452340457563432300001500000003205sony/sense.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

int
sony_sense(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n;
	char buf[4096];

#pragma ref ncargs
#pragma ref cargs

	if(niargs == 0)
		iargs[0] = 0;
	set6(cmd, 0x03, iargs[0]<<5, 0, 0, 32, 0);
	if(n = s_io(0, &cmd, 0, &ret, -32, err))
		return(n);
	printf("sense(%d,%d): ", s_id, iargs[0]);
	sony_extsense(ret.data, buf, sizeof buf);
	printf("%s\n", buf);
	return(0);
}

static char *exstab[16] =
{
	"no sense",
	"recovered error",
	"not ready",
	"medium error",
	"hardware error",
	"illegal request",
	"unit attention",
	"data protect",
	"blank check",
	"key #9",
	"copy aborted",
	"aborted command",
	"key #c",
	"volume overflow",
	"miscompare",
	"key #f",
};

void
sony_extsense(uchar *data, char *dest, int ndata)
{
	char buf[4096];
	extern char *nesd[];

	dest[0] = 0;
	switch(data[2])
	{
	case 0:
		sprintf(dest, "no error");
		break;
	case 0x1:	/* recovered error */
		sprintf(dest, "recovered error");
		break;
	case 0xA:	/* recovered error */
		sprintf(dest, "recovered error");
		break;
	default:
		if(data[7] != 4)
			sprintf((char *)data, "warning: extra data is %d, not 4! ", data[7]);
		sprintf(buf, "sense: %s", nesd[data[8]&0x7f]);
		strcat(dest, buf);
		if(data[8]&0x80){
			sprintf(buf, " at addr #%x", data[11]+256L*data[10]+256L*256*data[9]);
			strcat(dest, buf);
		}
		sprintf(buf, ", ext sense: %s", exstab[data[2]]);
		strcat(dest, buf);
		if(data[0]&0x80){
			sprintf(buf, " info=#%x", data[6]+256L*data[5]+256L*256L*data[4]+256L*256L*256L*data[3]);
			strcat(dest, buf);
		}
		break;
	}
}
0707070035050453231006660011710000040000010452350457563432300001600000002251sony/nesd.tabnesd
00	no sense
01	invalid command
02	recovered error
03	illegal request
06	unit attention
07	parity error
08	message reject error
0a	copy aborted
10	ecc trouible occurred
11	time out error
12	controller error
13	SONY I/F II hardware/firmware error
14	scsi hardware/firmware error
20	command not terminated
21	drive interface parity error
22	loading trouble
23	focus trouble
24	tracking trouble
25	spindle trouble
26	slide trouible
27	skew trouble
28	head lead out
29	write modulation trouble
2a	under laser power
2b	over laser power
2f	drive error
30	drive power off
31	no disk in drive
32	drive not ready
38	disk already exists in drive
39	no disk in drive
3a	disk already exists in shelf
40	write warning
41	write error
42	disk error
43	cannot read disk id
44	write protect error 1
45	write protect error 2
46	disk warning
47	alternation trouble
50	specified address not found
51	address block not found
52	all address could not be read
53	data could not be read
54	uncorrectable read error
55	tracking error
60	no data in specified address
68	z-axis servo error
69	roter servo error
6a	hook servo error
6b	i/o shelf error
6c	drive 0 error
6d	drive 1 error
6e	shelf error
6f	carrier error
0707070035050453711006660011710000040000010450560457563431600001100000002145unload.c#include	<stdio.h>
#include	<stddef.h>
#include	<string.h>
#include	"scsi.h"
#include	"juke.h"

j_unload(char *vol_id, char *buf)
{
	Side side;
	int i, sh, dr;
	char disk_to_unload[256];

	if(j_rdshelves(buf))	/* read in shelf names */
		return(-1);
	if(j_getstatus(buf))	/* get the jukebox status */
		return(-1);
	/* now check which side we want */

	strcpy(disk_to_unload, vol_id);
	side = SIDEA;
	sh = j_shelfof(disk_to_unload);
	if(sh < 0){
		sprintf(buf, "can not find vol_id %s", disk_to_unload);
		return(-1);
	}
	dr = -1;
	for(i = 0; i < NLUN; i++){
		printf("dr:.. %d  ", i);
		printf(" rtsh: %d\n", j_status.lun[i].retshelf);

 		/* is sh = retshelf? */

		if( (j_status.lun[i].retshelf>>1 == sh) ||
                                       (j_status.lun[i].retshelf == sh*2+1) ){   					dr = i; 
				break;
		} }
	printf("dr: %d, sh: %d, side: %d, i: %d\n", dr, sh, side, i);
	if (dr == -1){
		sprintf(buf, "no drive has vol_id %s", disk_to_unload);
		return(-1);
	}
	/* put vol_id in it's shelf*/	
	if (j_drive_to_shelf(dr, sh, side, buf) >= 0){
		sprintf(buf,"/dev/worm%d\n", dr);
		return(0);
	}
	return(-1);	
}
0707070035050446201006660011710000040000010447410457563430700000700000001357warm.c#include	<stddef.h>
#include	<stdio.h>
#include	<string.h>
#include	"scsi.h"
#include	"juke.h"

warm_inv(char *buf)
{
	Side side;
	int drive, sh;
	char vol_id[512];
	
	if(j_rdshelves(buf))	/* read in shelf names */
		return(-1);
	side = SIDEA;
	drive = min(nlun+1, NLUN-1);
	for(;;){
		if(j_getstatus(buf))	/* get the jukebox status */
			return(-1);
		for(sh = 0; sh < NSHELF; sh++)
			if(j_status.shelf[sh]&0x10) break;
		if(sh >= NSHELF)
			break;
		if(getvol(127, drive, vol_id, &side)){
			strcpy(buf, vol_id);
			return(-1);
		}
		for(sh = 0; j_shelf[sh]; sh++)
			;
		printf("%s -> %d\n", vol_id, sh);
		if(j_drive_to_shelf(drive, sh, side, buf) < 0)
			return(-1);
		j_wrshelf = 1;
		j_shelf[sh] = strdup(vol_id);
		sleep(1);
	}
	return(0);
}
0707070035050453210407770011710000040000020452370464700560500000500000000000wren0707070035050453201006660011710000040000010452400457563432300001300000000637wren/dev.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

static Function fns[] = {
	{ "diag", "diag", "", wr_diag },
	{ "extinq", "extinq", "", wr_extinq },
	{ "modesense", "modesense", "", wr_modesense },
	{ "modeselect", "modeselect er-param er-retries read-recon write-recon cache-enable", "IIIII", wr_modeselect },
	{ 0 }
};
Device wrendev = {
	"wren", "Wren VI",
	gen_extsense,
	fns
};
0707070035050453171006660011710000040000011471660464666727400001300000001326wren/inq.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

extern char *gen_rmb[2];
extern char *gen_devtype[256];

int
wr_extinq(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n;
	char vendor[9], product[17];

#pragma ref niargs
#pragma ref iargs
#pragma ref ncargs
#pragma ref cargs

	set6(cmd, 0x12, 0, 0, 0, 96, 0);
	if(n = s_io(0, &cmd, 0, &ret, 96, err))
		return(n);
	fixedstr(&ret.data[8], 8, vendor);
	fixedstr(&ret.data[16], 16, product);
	printf("inq(%d,%d): %s %s, %s/%s rev=%0.4s serial=%0.8s\n",
		s_id, 0, gen_rmb[ret.data[1]>>7], gen_devtype[ret.data[0]],
		vendor, product, &ret.data[32], &ret.data[36]);
	return(0);
}
0707070035050453161006660011710000040000010452420457563432300001400000011721wren/mode.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

#define	SHORT(n)	((ret.data[n]<<8)|(ret.data[n+1]))

static int
er(int pcf, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n;
	static char *bit[8] = { "DCR", "DTE", "PER", "EEC", "RC", "TB", "ARRE", "AWRE" };

	set6(cmd, 0x1A, 0, (pcf<<6)|0x01, 0, 20, 0);
	if(n = s_io(0, &cmd, 0, &ret, 20, err))
		return(n);
	printf("error recovery:\n\t");
	for(n = 7; n >= 0; n--)
		printf(" %s%s", (ret.data[14]&(1<<n))? "":"~", bit[n]);
	printf("\n\t%d retries, max ecc span=%d\n", ret.data[15], ret.data[16]);
	return(0);
}

static int
dr(int pcf, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n;

	set6(cmd, 0x1A, 0, (pcf<<6)|0x02, 0, 24, 0);
	if(n = s_io(0, &cmd, 0, &ret, 24, err))
		return(n);
	printf("disconnect/reconnect:\n");
	printf("\tread reconnect=%d/256,", ret.data[14]);
	printf(" write reconnect=%d/256\n", ret.data[15]);
	return(0);
}

static int
fp(int pcf, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n;
	static char *bit[8] = { "", "", "", "INS", "SURF", "Remove", "HardSec", "SoftSec" };

	set6(cmd, 0x1A, 0, (pcf<<6)|0x03, 0, 36, 0);
	if(n = s_io(0, &cmd, 0, &ret, 36, err))
		return(n);
	printf("format parameters:\n");
	printf("\tsec=%dB, trk=%d secs, interleave=%d trk skew=%d cyl skew=%d\n",
		SHORT(24), SHORT(22), SHORT(26), SHORT(28), SHORT(30));
	printf("\t%d alt sec/%d alt trk per zone(=%d trks), %d alt trks per vol\n",
		SHORT(16), SHORT(18), SHORT(14), SHORT(20));
	printf("\tdrive type:");
	for(n = 7; n >= 3; n--)
		printf(" %s%s", (ret.data[32]&(1<<n))? "":"~", bit[n]);
	printf("\n");
	return(0);
}

static int
geom(int pcf, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n;

	set6(cmd, 0x1A, 0, (pcf<<6)|0x04, 0, 32, 0);
	if(n = s_io(0, &cmd, 0, &ret, 32, err))
		return(n);
	printf("drive geometry:\n\t%d cyls, %d heads\n",
		(ret.data[14]<<16)|SHORT(15), ret.data[17]);
	return(0);
}

static int
cc(int pcf, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n;
	static char *bit[8] = { "", "", "", "", "CacheEnable", "RSVD", "WIE", "RSVD" };

	set6(cmd, 0x1A, 0, (pcf<<6)|0x38, 0, 28, 0);
	if(n = s_io(0, &cmd, 0, &ret, 28, err))
		return(n);
	printf("cache control:\n\t");
	for(n = 7; n >= 4; n--)
		printf(" %s%s", (ret.data[14]&(1<<n))? "":"~", bit[n]);
	printf(", cache size=%d\n", ret.data[14]&0xF);
	printf("\tprefetch: thr=%d max=%dx%d min=%dx%d\n",
		ret.data[15], ret.data[16], ret.data[17], ret.data[18], ret.data[19]);
	return(0);
}

int
wr_modesense(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	int n;

#pragma ref ncargs
#pragma ref cargs
#pragma ref niargs
#pragma ref iargs

#define	PCF	0	/* current values */

	printf("mode sense(%d,0):\n", s_id);
	if(n = er(PCF, err))
		return(n);
	if(n = dr(PCF, err))
		return(n);
	if(n = fp(PCF, err))
		return(n);
	if(n = geom(PCF, err))
		return(n);
	if(n = cc(PCF, err))
		return(n);
	return(0);
}

int
wr_modeselect(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n;

#pragma ref niargs
#pragma ref ncargs
#pragma ref cargs

	printf("changing modes to ");
	if((iargs[0] < 256) && (iargs[0] >= 0))
		printf("er-param=%d(=#%x), ", iargs[0], iargs[0]);
	if((iargs[1] < 256) && (iargs[1] >= 0))
		printf("er-retries=%d, ", iargs[1]);
	if((iargs[2] < 256) && (iargs[2] >= 0))
		printf("read-recon=%d/256, ", iargs[2]);
	if((iargs[3] < 256) && (iargs[3] >= 0))
		printf("write-recon=%d/256, ", iargs[3]);
	if((iargs[4] < 256) && (iargs[4] >= 0))
		printf("cache %sable, ", iargs[4]?"en":"dis");
	printf("\nsleep(10); kill me if you disagree\n");
	fflush(stdout);
	sleep(10);
	/* do error recovery */
	if(((iargs[0] < 256) && (iargs[0] >= 0)) || ((iargs[1] < 256) && (iargs[1] >= 0))){
		set6(cmd, 0x1A, 0, (0<<6)|0x01, 0, 20, 0);
		if(n = s_io(0, &cmd, 0, &ret, 20, err))
			return(n);
		memcpy(cmd.data, ret.data, 20);
		cmd.data[14] &= ~0x10;
		if((iargs[0] < 256) && (iargs[0] >= 0))
			cmd.data[14] = iargs[0];
		if((iargs[1] < 256) && (iargs[1] >= 0))
			cmd.data[15] = iargs[1];
		set6(cmd, 0x15, 0x11, 0, 0, 20, 0);
		if(n = s_io(0, &cmd, 20, &ret, 0, err))
			return(n);
	}
	/* reconnect */
	if(((iargs[2] < 256) && (iargs[2] >= 0)) || ((iargs[3] < 256) && (iargs[3] >= 0))){
		set6(cmd, 0x1A, 0, (0<<6)|0x02, 0, 24, 0);
		if(n = s_io(0, &cmd, 0, &ret, 24, err))
			return(n);
		memcpy(cmd.data, ret.data, 24);
		if((iargs[3] < 256) && (iargs[3] >= 0))
			cmd.data[14] = iargs[3];
		if((iargs[4] < 256) && (iargs[4] >= 0))
			cmd.data[15] = iargs[4];
		set6(cmd, 0x15, 0x11, 0, 0, 24, 0);
		if(n = s_io(0, &cmd, 24, &ret, 0, err))
			return(n);
	}
	/* do cache control */
	if((iargs[4] < 256) && (iargs[4] >= 0)){
		set6(cmd, 0x1A, 0, (0<<6)|0x38, 0, 28, 0);
		if(n = s_io(0, &cmd, 0, &ret, 28, err))
			return(n);
		memcpy(cmd.data, ret.data, 28);
		cmd.data[14] &= ~0x10;
		if(iargs[4])
			cmd.data[14] |= 0x10;
		set6(cmd, 0x15, 0x11, 0, 0, 28, 0);
		if(n = s_io(0, &cmd, 28, &ret, 0, err))
			return(n);
	}
	return(0);
}
0707070035050453151006660011710000040000010452430457563432400001400000001427wren/diag.c#include	<stdio.h>
#include	"../scsi.h"
#include	"../scsish.h"
#include	"fns.h"

int
wr_diag(int niargs, int *iargs, int ncargs, char **cargs, char *err)
{
	struct scsi_cmd cmd;
	struct scsi_return ret;
	int n;
	long t;

#pragma ref niargs
#pragma ref iargs
#pragma ref ncargs
#pragma ref cargs

	t = time((long *)0);
	set6(cmd, 0x1D, 0x04, 0, 0, 0, 0);
	if(n = s_io(0, &cmd, 0, &ret, 0, err))
		return(n);
	set6(cmd, 0x1C, 0, 0, 0, 8, 0);
	if(n = s_io(0, &cmd, 0, &ret, 8, err))
		return(n);
	t = time((long *)0)-t;
	printf("selftest diagnostic (%ds)\n", t);
	if((ret.data[7] == 0) && (ret.data[2] == 0))
		printf("\tno errors\n");
	else
		printf("\terror==#%x,#%x FRU=(#%x,#%x,#%x,#%x)\n",
			ret.data[6], ret.data[7], ret.data[2],
			ret.data[3], ret.data[4], ret.data[5]);
	return(0);
}
0707070035050453141006660011710000040000010452450457563432400001300000000345wren/fns.hextern int wr_extinq(int, int *, int, char **, char *);
extern int wr_modesense(int, int *, int, char **, char *);
extern int wr_modeselect(int, int *, int, char **, char *);
extern int wr_diag(int, int *, int, char **, char *);
0707070035050453141006660011710000040000010452450457563432400001300000000000TRAILER!!!ret.data[3], ret.data[4], ret.data[5]);
	return(0);
}
0

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.