V10/cmd/oworm/scsi/readid.c

#include	"scsi.h"

static
myread(drive, block, o)
	long block;
	struct scsi_o *o;
{
	struct scsi_i input;

	input.bus_id = scsi_id;
	input.cmd[0] = 0x28;
	input.cmd[1] = drive<<5;
	input.cmd[2] = block>>24;
	input.cmd[3] = block>>16;
	input.cmd[4] = block>>8;
	input.cmd[5] = block;
	input.cmd[6] = 0;
	input.cmd[7] = 0;
	input.cmd[8] = 1;
	input.cmd[9] = 0;
	if(scsiio(&input, 0, o, 1024, "readid") < 0)
		return(1);
	if(CHECK(*o))
		return(1);
	return(0);
}

/*
	return label, UNLABELLED or "" (error)
*/

s_readid(drive, buf)
	char *buf;
{
	struct scsi_i input;
	struct scsi_o output;
	long b, lastb;

	buf[0] = 0;
	scsi_shush = 1;
	if(myread(drive, 0L, &output) == 0)
		goto done;
	for(b = 1, lastb = -1;;){
		if(myread(drive, b, &output))
			break;
		lastb = b;
		b = ((long *)output.data)[9];
	}
	scsi_shush = 0;
	if(lastb < 0){
		s_sense(drive, 1);
		strcpy(buf, UNLABELLED);
		return;
	}
	myread(drive, lastb, &output);
done:
	strncpy(buf, (char *)&output.data[42], 128);
	buf[127] = 0;
}