134 lines
3.5 KiB
C
134 lines
3.5 KiB
C
#pragma src "/sys/src/libdisk"
|
|
#pragma lib "libdisk.a"
|
|
|
|
/* SCSI interface */
|
|
typedef struct Scsi Scsi;
|
|
struct Scsi {
|
|
QLock ql;
|
|
char* inquire;
|
|
int rawfd;
|
|
int nchange;
|
|
uint32_t changetime;
|
|
};
|
|
|
|
enum {
|
|
Sread = 0,
|
|
Swrite,
|
|
Snone,
|
|
};
|
|
|
|
char* scsierror(int, int);
|
|
int scsicmd(Scsi*, uint8_t*, int, void*, int, int);
|
|
int scsi(Scsi*, uint8_t*, int, void*, int, int);
|
|
Scsi* openscsi(char*);
|
|
void closescsi(Scsi*);
|
|
int scsiready(Scsi*);
|
|
|
|
extern int scsiverbose;
|
|
|
|
/* disk partition interface */
|
|
typedef struct Disk Disk;
|
|
struct Disk {
|
|
char *prefix;
|
|
char *part;
|
|
int fd;
|
|
int wfd;
|
|
int ctlfd;
|
|
int rdonly;
|
|
int type;
|
|
|
|
int64_t secs;
|
|
int64_t secsize;
|
|
int64_t size;
|
|
int64_t offset; /* within larger disk, perhaps */
|
|
int width; /* of disk size in bytes as decimal string */
|
|
int psecsize;
|
|
int physalign;
|
|
int c;
|
|
int h;
|
|
int s;
|
|
int chssrc;
|
|
};
|
|
|
|
Disk* opendisk(char*, int, int);
|
|
|
|
enum {
|
|
Tfile = 0,
|
|
Tsd,
|
|
Tfloppy,
|
|
|
|
Gpart = 0, /* partition info source */
|
|
Gdisk,
|
|
Gguess,
|
|
};
|
|
enum { /* SCSI command codes */
|
|
ScmdTur = 0x00, /* test unit ready */
|
|
ScmdRewind = 0x01, /* rezero/rewind */
|
|
ScmdRsense = 0x03, /* request sense */
|
|
ScmdFormat = 0x04, /* format unit */
|
|
ScmdRblimits = 0x05, /* read block limits */
|
|
ScmdRead = 0x08, /* read */
|
|
ScmdWrite = 0x0A, /* write */
|
|
ScmdSeek = 0x0B, /* seek */
|
|
ScmdFmark = 0x10, /* write filemarks */
|
|
ScmdSpace = 0x11, /* space forward/backward */
|
|
ScmdInq = 0x12, /* inquiry */
|
|
ScmdMselect6 = 0x15, /* mode select */
|
|
ScmdMselect10 = 0x55, /* mode select */
|
|
ScmdMsense6 = 0x1A, /* mode sense */
|
|
ScmdMsense10 = 0x5A, /* mode sense */
|
|
ScmdStart = 0x1B, /* start/stop unit */
|
|
ScmdRcapacity = 0x25, /* read capacity */
|
|
ScmdRcapacity16 = 0x9e, /* long read capacity */
|
|
ScmdRformatcap = 0x23, /* read format capacity */
|
|
ScmdExtread = 0x28, /* extended read (10 bytes) */
|
|
ScmdRead16 = 0x88, /* long read (16 bytes) */
|
|
ScmdExtwrite = 0x2A, /* extended write (10 bytes) */
|
|
ScmdExtwritever = 0x2E, /* extended write and verify (10) */
|
|
ScmdWrite16 = 0x8A, /* long write (16 bytes) */
|
|
ScmdExtseek = 0x2B, /* extended seek */
|
|
|
|
ScmdSynccache = 0x35, /* flush cache */
|
|
ScmdRTOC = 0x43, /* read TOC data */
|
|
ScmdRdiscinfo = 0x51, /* read disc information */
|
|
ScmdRtrackinfo = 0x52, /* read track information */
|
|
ScmdReserve = 0x53, /* reserve track */
|
|
ScmdBlank = 0xA1, /* blank *-RW media */
|
|
|
|
ScmdCDpause = 0x4B, /* pause/resume */
|
|
ScmdCDstop = 0x4E, /* stop play/scan */
|
|
ScmdCDplay = 0xA5, /* play audio */
|
|
ScmdCDload = 0xA6, /* load/unload */
|
|
ScmdCDscan = 0xBA, /* fast forward/reverse */
|
|
ScmdCDstatus = 0xBD, /* mechanism status */
|
|
Scmdgetconf = 0x46, /* get configuration */
|
|
|
|
ScmdEInitialise = 0x07, /* initialise element status */
|
|
ScmdMMove = 0xA5, /* move medium */
|
|
ScmdEStatus = 0xB8, /* read element status */
|
|
ScmdMExchange = 0xA6, /* exchange medium */
|
|
ScmdEposition = 0x2B, /* position to element */
|
|
|
|
ScmdReadDVD = 0xAD, /* read dvd structure */
|
|
ScmdReportKey = 0xA4, /* read dvd key */
|
|
ScmdSendKey = 0xA3, /* write dvd key */
|
|
|
|
ScmdClosetracksess= 0x5B,
|
|
ScmdRead12 = 0xA8,
|
|
ScmdSetcdspeed = 0xBB,
|
|
ScmdReadcd = 0xBE,
|
|
|
|
/* vendor-specific */
|
|
ScmdFwaddr = 0xE2, /* first writeable address */
|
|
ScmdTreserve = 0xE4, /* reserve track */
|
|
ScmdTinfo = 0xE5, /* read track info */
|
|
ScmdTwrite = 0xE6, /* write track */
|
|
ScmdMload = 0xE7, /* medium load/unload */
|
|
ScmdFixation = 0xE9, /* fixation */
|
|
};
|
|
|
|
/* proto file parsing */
|
|
typedef void Protoenum(char *new, char *old, Dir *d, void *a);
|
|
typedef void Protowarn(char *msg, void *a);
|
|
int rdproto(char*, char*, Protoenum*, Protowarn*, void*);
|