ftp.nice.ch/pub/next/tools/cdrom/mCD.971026.s.tar.gz#/mCD/scsi_cd.subproj/cd_cmdsint.h

This is cd_cmdsint.h in view mode; [Download] [Up]

/*
 * cd_cmds.h: structs and other declarations which are internal
 *            to cd_commands.c (cd_commands.h only describes what
 *            it is making available to other source files).
 *
 * Garance Alistair Drosehn/March 1994.
 *
 */

#define	GET_4BYTE_UINT(x)	\
		(((x##_4b1)<<24)|((x##_4b2)<<16)|((x##_4b3)<<8)|(x##_4b4))
#define	GET_3BYTE_UINT(x)	\
		(((x##_3b1)<<16)|((x##_3b2)<<8)|(x##_3b3))
#define	GET_2BYTE_UINT(x)	\
		(((x##_2b1)<<8)|(x##_2b2))

#define	SET_4BYTE_UINT(x,newvalue)	\
		x##_4b1 = (newvalue>>24) & 0x000000FF; \
		x##_4b2 = (newvalue>>16) & 0x000000FF; \
		x##_4b3 = (newvalue>>8) & 0x000000FF; \
		x##_4b4 = newvalue & 0x000000FF
#define	SET_3BYTE_UINT(x,newvalue)	\
		x##_3b1 = (newvalue>>16) & 0x000000FF; \
		x##_3b2 = (newvalue>>8) & 0x000000FF; \
		x##_3b3 = newvalue & 0x000000FF
#define	SET_2BYTE_UINT(x,newvalue)	\
		x##_2b1 = (newvalue>>8) & 0x000000FF; \
		x##_2b2 = newvalue & 0x000000FF

/* formats used to indicate the current position on the CD */
struct msf_addr_fmt {
    u_char              hour:8;	/* will probably always be zero */
    u_char              min:8;	/* note this will have values > 60 */
    u_char              sec:8;
    u_char              frame:8;
};

struct lba_addr_fmt {
    u_char              lblock_4b1:8,	/* use GET_4BYTE_UINT(lblock) */
                        lblock_4b2:8,	/* to pick up this value */
                        lblock_4b3:8,
                        lblock_4b4:8;
};

union cd_addr_fmt {
    struct msf_addr_fmt msf;	/* MSF = minutes, seconds, frame */
    struct lba_addr_fmt lba;	/* LBA = logical block address */
};


/**************************************************************************
 * start/stop command
 */
struct start_stop_1B_cmd {
#if	__BIG_ENDIAN__
    u_char              ssc_opcode:8;	/* C6OP_STARTSTOP: x'1B' */
    u_char              ssc_lun:3,
                        ssc_reserved1:4,
                        ssc_imm:1;
    u_char              ssc_reserved2[2];
    u_char              ssc_reserved3:6,
                        ssc_loej:1,
                        ssc_start:1;
    u_char              ssc_control:8;
#elif	__LITTLE_ENDIAN__
    u_char              ssc_opcode:8;	/* C6OP_STARTSTOP: x'1B' */
    u_char              ssc_imm:1,
                        ssc_reserved1:4,
                        ssc_lun:3;
    u_char              ssc_reserved2[2];
    u_char              ssc_start:1,
                        ssc_loej:1,
                        ssc_reserved3:6;
    u_char              ssc_control:8;
#else
#error	SCSI command / data structures are compiler sensitive
#endif
};


/**************************************************************************
 * rezero unit command (other devices call this "rewind" = C6OP_REWIND)
 */
#define C6OP_REZEROUNIT_01 0x01	/* 6-byte SCSI cmd */
struct rezero_unit_01_cmd {
#if	__BIG_ENDIAN__
    u_char              rzu_opcode:8;	/* C6OP_REZEROUNIT: x'01' */
    u_char              rzu_lun:3,
                        rzu_reserved1:5;
    u_char              rzu_reserved2[3];
    u_char              rzu_control:8;
#elif	__LITTLE_ENDIAN__
    u_char              rzu_opcode:8;	/* C6OP_REZEROUNIT: x'01' */
    u_char              rzu_reserved1:5,
                        rzu_lun:3;
    u_char              rzu_reserved2[3];
    u_char              rzu_control:8;
#else
#error	SCSI command / data structures are compiler sensitive
#endif
};


/**************************************************************************
 * pause/resume command
 */
#define C10OP_PAUSE_4B 0x4b	/* 10-byte SCSI cmd */
struct pause_4b_cmd {
#if	__BIG_ENDIAN__
    u_char              p_op_code:8;	/* C10OP_PAUSE: x'4B' */
    u_char              p_lun:3,
                        p_reserved1:5;
    u_char              p_reserved2[6];
    u_char              p_reserved3:7,
                        p_resume:1;	/* 0 = pause, 1 = resume */
    u_char              p_control:8;
#elif	__LITTLE_ENDIAN__
    u_char              p_op_code:8;	/* C10OP_PAUSE: x'4B' */
    u_char              p_reserved1:5,
                        p_lun:3;
    u_char              p_reserved2[6];
    u_char              p_resume:1,	/* 0 = pause, 1 = resume */
                        p_reserved3:7;
    u_char              p_control:8;
#else
#error	SCSI command / data structures are compiler sensitive
#endif
};


/**************************************************************************
 * pause command (this opcode probably Sony-specific)
 */
#define C10OP_PAUSE_C5 0xc5	/* 10-byte SCSI cmd */
struct pause_c5_cmd {
#if	__BIG_ENDIAN__
    u_char              p_op_code:8;	/* C10OP_PAUSE: x'C5' */
    u_char              p_lun:3,
                        p_pause:1,	/* 0 = resume, 1 = pause */
                        p_reserved1:4;
    u_char              p_reserved2[7];
    u_char              p_control:8;
#elif	__LITTLE_ENDIAN__
    u_char              p_op_code:8;	/* C10OP_PAUSE: x'C5' */
    u_char              p_reserved1:4,
                        p_pause:1,	/* 0 = resume, 1 = pause */
                        p_lun:3;
    u_char              p_reserved2[7];
    u_char              p_control:8;
#else
#error	SCSI command / data structures are compiler sensitive
#endif
};


/**************************************************************************
 * playaudio command (this opcode probably Sony-specific)
 */
#define C6OP_PLAYAUDIO_C8 0xc8	/* 6-byte SCSI cmd */
struct playaudio_c8_cmd {
#if	__BIG_ENDIAN__
    u_char              pa_op_code:8;	/* C6OP_PLAYAUDIO: x'C8' */
    u_char              pa_lun:3,
                        pa_reserved1:5;
    u_char              pa_lba_4b1:8,	/* LBA to start playing */
                        pa_lba_4b2:8,	/* use GET_4BYTE_UINT(pa_lba) */
                        pa_lba_4b3:8,	/* to pick up this value */
                        pa_lba_4b4:8;
    u_char              pa_reserved2:8;
    u_char              pa_length_2b1:8,	/* GET_2BYTE_UINT(pa_length) */
                        pa_length_2b2:8;	/* will get this value */
    u_char              pa_control:8;
#elif	__LITTLE_ENDIAN__
    u_char              pa_op_code:8;	/* C6OP_PLAYAUDIO: x'C8' */
    u_char              pa_reserved1:5,
                        pa_lun:3;
    u_char              pa_lba_4b1:8,	/* LBA to start playing */
                        pa_lba_4b2:8,	/* use GET_4BYTE_UINT(pa_lba) */
                        pa_lba_4b3:8,	/* to pick up this value */
                        pa_lba_4b4:8;
    u_char              pa_reserved2:8;
    u_char              pa_length_2b1:8,	/* GET_2BYTE_UINT(pa_length) */
                        pa_length_2b2:8;	/* will get this value */
    u_char              pa_control:8;
#else
#error	SCSI command / data structures are compiler sensitive
#endif
};

/**************************************************************************
 * play audio command
 */
#define C10OP_PLAYAUDIO_MSF_47 0x47	/* 10-byte SCSI cmd */
struct playaudio_msf_47_cmd {
#if	__BIG_ENDIAN__
    u_char              pam_op_code:8;	/* C10OP_PLAYAUDIO_MSF: x'47' */
    u_char              pam_lun:3,
                        pam_reserved1:5;
    u_char              pam_reserved2:8;
    u_char              pam_start_min:8;
    u_char              pam_start_sec:8;
    u_char              pam_start_frame:8;
    u_char              pam_end_min:8;
    u_char              pam_end_sec:8;
    u_char              pam_end_frame:8;
    u_char              pam_control:8;
#elif	__LITTLE_ENDIAN__
    u_char              pam_op_code:8;	/* C10OP_PLAYAUDIO_MSF: x'47' */
    u_char              pam_reserved1:5,
                        pam_lun:3;
    u_char              pam_reserved2:8;
    u_char              pam_start_min:8;
    u_char              pam_start_sec:8;
    u_char              pam_start_frame:8;
    u_char              pam_end_min:8;
    u_char              pam_end_sec:8;
    u_char              pam_end_frame:8;
    u_char              pam_control:8;
#else
#error	SCSI command / data structures are compiler sensitive
#endif
};

/**************************************************************************
 * read subchannel command
 */
#define C10OP_READSUBCHANNEL_42 0x42	/* 10-byte SCSI cmd */
struct read_subchannel_42_cmd {
#if	__BIG_ENDIAN__
    u_char              rsc_op_code:8;	/* C10OP_READSUBCHANNEL: x'42' */
    u_char              rsc_lun:3,
                        rsc_reserved1:3,
                        rsc_msf:1,
                        rsc_reserved2:1;
    u_char              rsc_reserved3:1,
                        rsc_subq:1,	/* sub-channel data (vs header-only) */
                        rsc_reserved4:6;
    u_char              rsc_dformat:8;
    u_char              rsc_reserved5[2];
    u_char              rsc_track:8;
 /*
  * use SET_2BYTE_UINT(rsc_length,newvalue) to set the following two-byte
  * integer value 
  */
    u_char              rsc_length_2b1:8,	/* GET_2BYTE_UINT(rsc_length) */
                        rsc_length_2b2:8;	/* will get this value */
    u_char              rsc_control:8;
#elif	__LITTLE_ENDIAN__
    u_char              rsc_op_code:8;	/* C10OP_READSUBCHANNEL: x'42' */
    u_char              rsc_reserved2:1,
                        rsc_msf:1,
                        rsc_reserved1:3,
                        rsc_lun:3;
    u_char              rsc_reserved4:6;
    u_char              rsc_subq:1,	/* sub-channel data (vs header-only) */
                        rsc_reserved3:1;
    u_char              rsc_dformat:8;
    u_char              rsc_reserved5[2];
    u_char              rsc_track:8;
 /*
  * use SET_2BYTE_UINT(rsc_length,newvalue) to set the following two-byte
  * integer value 
  */
    u_char              rsc_length_2b1:8,	/* GET_2BYTE_UINT(rsc_length) */
                        rsc_length_2b2:8;	/* will get this value */
    u_char              rsc_control:8;
#else
#error	SCSI command / data structures are compiler sensitive
#endif
};

/* sub-channel data header */
struct sc_header {
    u_char              sch_reserved1:8;
    u_char              sch_astatus:8;	/* audio status */
 /*
  * use SET_2BYTE_UINT(sch_length,newvalue) to set the following two-byte
  * integer value 
  */
    u_char              sch_length_2b1:8,	/* GET_2BYTE_UINT(sch_length) */
                        sch_length_2b2:8;	/* will get this value */
};

/* sub-channel data format page 1:
 *     CD-ROM current position data block
 */
struct sc_cur_pos {
#if	__BIG_ENDIAN__
    u_char              sc1_data_code:8;
    u_char              sc1_reserved1:4,
                        sc1_control:4;
    u_char              sc1_track:8;
    u_char              sc1_index:8;
    union cd_addr_fmt   sc1_abs_addr;	/* 4 bytes */
    union cd_addr_fmt   sc1_rel_addr;	/* 4 bytes */
#elif	__LITTLE_ENDIAN__
    u_char              sc1_data_code:8;
    u_char              sc1_control:4,
                        sc1_reserved1:4;
    u_char              sc1_track:8;
    u_char              sc1_index:8;
    union cd_addr_fmt   sc1_abs_addr;	/* 4 bytes */
    union cd_addr_fmt   sc1_rel_addr;	/* 4 bytes */
#else
#error	SCSI command / data structures are compiler sensitive
#endif
};

/* sub-channel data format page 2:
 *     Media Catalog Number Data Format
 */
struct sc_med_cat {
#if	__BIG_ENDIAN__
    u_char              sc2_data_code:8;
    u_char              sc2_reserved1[3];
    u_char              sc2_mcval:1,
                        sc2_reserved2:7;
    u_char              sc2_med_cat[15];
#elif	__LITTLE_ENDIAN__
    u_char              sc2_data_code:8;
    u_char              sc2_reserved1[3];
    u_char              sc2_reserved2:7,
                        sc2_mcval:1;
    u_char              sc2_med_cat[15];
#else
#error	SCSI command / data structures are compiler sensitive
#endif
};

/* sub-channel data format page 3:
 *     Track International Standard Recording Data Format
 */
struct sc_isrc {
#if	__BIG_ENDIAN__
    u_char              sc3_data_code:8;
    u_char              sc3_reserved1:8;
    u_char              sc3_track:8;
    u_char              sc3_reserved2:8;
    u_char              sc3_tcval:1,
                        sc3_reserved3:7;
    u_char              sc3_isrc[15];
#elif	__LITTLE_ENDIAN__
    u_char              sc3_data_code:8;
    u_char              sc3_reserved1:8;
    u_char              sc3_track:8;
    u_char              sc3_reserved2:8;
    u_char              sc3_reserved3:7,
                        sc3_tcval:1;
    u_char              sc3_isrc[15];
#else
#error	SCSI command / data structures are compiler sensitive
#endif
};

/* ----------------------------------------- */
/* sub-channel reply, the union of all pages */
/* ----------------------------------------- */
struct sc_reply {
    struct sc_header    scr_header;
    union {
	struct sc_cur_pos   u_scr_cur_pos;
	struct sc_med_cat   u_scr_med_cat;
	struct sc_isrc      u_scr_isrc;
    }                   u;
};

/* the routine almost no one calls: */
int
do_readsubchannel_42(int fd, int msf, int subq, int page, int track,
		     struct sc_reply * scrp, struct esense_reply * erp);


/**************************************************************************
 * read Table-Of-Contents command
 */
#define C10OP_READTOC_43 0x43	/* 10-byte SCSI cmd */
struct readtoc_43_cmd {
#if	__BIG_ENDIAN__
    u_char              rt_op_code:8;	/* C10OP_READTOC: x'43' */
    u_char              rt_lun:3,
                        rt_reserved1:3,
                        rt_msf:1,
                        rt_reserved2:1;
    u_char              rt_reserved3[4];
    u_char              rt_starttrack:8;
 /*
  * use SET_2BYTE_UINT(rt_length,newvalue) to set the following two-byte
  * integer value 
  */
    u_char              rt_length_2b1:8,	/* GET_2BYTE_UINT(rt_length) */
                        rt_length_2b2:8;	/* will get this value */
    u_char              rt_control:8;
#elif	__LITTLE_ENDIAN__
    u_char              rt_op_code:8;	/* C10OP_READTOC: x'43' */
    u_char              rt_reserved2:1,
                        rt_msf:1,
                        rt_reserved1:3,
                        rt_lun:3;
    u_char              rt_reserved3[4];
    u_char              rt_starttrack:8;
 /*
  * use SET_2BYTE_UINT(rt_length,newvalue) to set the following two-byte
  * integer value 
  */
    u_char              rt_length_2b1:8,	/* GET_2BYTE_UINT(rt_length) */
                        rt_length_2b2:8;	/* will get this value */
    u_char              rt_control:8;
#else
#error	SCSI command / data structures are compiler sensitive
#endif
};

/* read toc reply header */
struct rtr_header {
    u_char              rtr_datalen_2b1,	/* GET_2BYTE_UINT(rtr_datalen)
						 * */
                        rtr_datalen_2b2;	/* will pick up this value */
    u_char              rtr_firsttrack;
    u_char              rtr_lasttrack;
};

/* read toc reply descriptor */
struct rtr_desc {
#if	__BIG_ENDIAN__
    u_char              rtrd_reserved1:8;
    u_char              rtrd_reserved2:4,
                        rtrd_control:4;
    u_char              rtrd_track:8,
                        rtrd_reserved3:8;
    union cd_addr_fmt   rtrd_addr;	/* 4 bytes */
#elif	__LITTLE_ENDIAN__
    u_char              rtrd_reserved1:8;
    u_char              rtrd_control:4,
                        rtrd_reserved2:4;
    u_char              rtrd_track:8,
                        rtrd_reserved3:8;
    union cd_addr_fmt   rtrd_addr;	/* 4 bytes */
#else
#error	SCSI command / data structures are compiler sensitive
#endif
};

/* read toc reply with one descriptor, to read more than 1 descriptor
   blocks at a time, one must allocate
   sizeof(struct rtr_desc)*num_descriptrs+sizeof(struct rtr_header) bytes,
   and then traverse through the memory */

struct readtoc_43_reply {
    struct rtr_header   h;
    struct rtr_desc     d[101];	/* array of descriptor block's */
};


/**************************************************************************
 * declarations for playback-status and playback-control cmds
 *              (both probably Sony-specific)
 */
#define C10OP_PLAYBACKSTATUS_C4  0xc4	/* 10-byte SCSI cmd */
#define C10OP_PLAYBACKCONTROL_C9 0xc9	/* 10-byte SCSI cmd */
struct playback_statuscontrol_cmd {
#if	__BIG_ENDIAN__
    u_char              pb_opcode:8;	/* C10OP_PLAYBACKSTATUS: x'C4' or
					 * C10OP_PLAYBACKCONTROL: x'C9' */
    u_char              pb_lun:3,
                        pb_reserved1:5;
    u_char              pb_reserved2[5];
 /*
  * use SET_2BYTE_UINT(pb_length,newvalue) to set the following two-byte
  * integer value 
  */
    u_char              pb_length_2b1:8,	/* GET_2BYTE_UINT(pb_length) */
                        pb_length_2b2:8;	/* will get this value */
    u_char              pb_control:8;
#elif	__LITTLE_ENDIAN__
    u_char              pb_opcode:8;	/* C10OP_PLAYBACKSTATUS: x'C4' or
					 * C10OP_PLAYBACKCONTROL: x'C9' */
    u_char              pb_reserved1:5,
                        pb_lun:3;
    u_char              pb_reserved2[5];
 /*
  * use SET_2BYTE_UINT(pb_length,newvalue) to set the following two-byte
  * integer value 
  */
    u_char              pb_length_2b1:8,	/* GET_2BYTE_UINT(pb_length) */
                        pb_length_2b2:8;	/* will get this value */
    u_char              pb_control:8;
#else
#error	SCSI command / data structures are compiler sensitive
#endif
};

struct playback_c4c9_data {
#if	__BIG_ENDIAN__
    u_char              pbd_reserved1:8;
    u_char              pbd_reserved2:7,
                        pbd_lbamsf:1;
    u_char              pbd_astatDataLength_2b1:8,	/* GET_2BYTE_UINT(pbd_ast
							 * atDataLength) */
                        pbd_astatDataLength_2b2:8;	/* will get this value */
    u_char              pbd_audio_status:8;
    u_char              pbd_reserved3:4,
                        pbd_control:4;
    union cd_addr_fmt   pbd_cd_addr;	/* 4 bytes */
    u_char              pbd_reserved4:4,
                        pbd_ch0_sel:4;
    u_char              pbd_ch0_vol:8;
    u_char              pbd_reserved5:4,
                        pbd_ch1_sel:4;
    u_char              pbd_ch1_vol:8;
    u_char              pbd_reserved6:4,
                        pbd_ch2_sel:4;
    u_char              pbd_ch2_vol:8;
    u_char              pbd_reserved7:4,
                        pbd_ch3_sel:4;
    u_char              pbd_ch3_vol:8;
#elif	__LITTLE_ENDIAN__
    u_char              pbd_reserved1:8;
    u_char              pbd_lbamsf:1,
                        pbd_reserved2:7;
    u_char              pbd_astatDataLength_2b1:8,	/* GET_2BYTE_UINT(pbd_ast
							 * atDataLength) */
                        pbd_astatDataLength_2b2:8;	/* will get this value */
    u_char              pbd_audio_status:8;
    u_char              pbd_control:4,
                        pbd_reserved3:4;
    union cd_addr_fmt   pbd_cd_addr;	/* 4 bytes */
    u_char              pbd_ch0_sel:4,
                        pbd_reserved4:4;
    u_char              pbd_ch0_vol:8;
    u_char              pbd_ch1_sel:4,
                        pbd_reserved5:4;
    u_char              pbd_ch1_vol:8;
    u_char              pbd_ch2_sel:4,
                        pbd_reserved6:4;
    u_char              pbd_ch2_vol:8;
    u_char              pbd_ch3_sel:4,
                        pbd_reserved7:4;
    u_char              pbd_ch3_vol:8;
#else
#error	SCSI command / data structures are compiler sensitive
#endif
};


/**************************************************************************
 * declarations for mode-sense and mode-select cmds
 */
struct mode_sense_select_cmd {
#if	__BIG_ENDIAN__
    u_char              msc_opcode;	/* C6OP_MODESELECT: x'15' or
					 * C6OP_MODESENSE: x'1A' */
    u_char              msc_lun:3,
                        msc_pf:1,	/* only used by MODESELECT */
                        msc_reserved1:3,
                        msc_sp:1;	/* only used by MODESELECT */
    u_char              msc_pcf:2,	/* only used by MODESENSE */
                        msc_page:6;	/* only used by MODESENSE */
    u_char              msc_reserved2:8;
    u_char              msc_len;
    u_char              msc_control;
#elif	__LITTLE_ENDIAN__
    u_char              msc_opcode;	/* C6OP_MODESELECT: x'15' or
					 * C6OP_MODESENSE: x'1A' */
    u_char              msc_sp:1,	/* only used by MODESELECT */
                        msc_reserved1:3,
                        msc_pf:1,	/* only used by MODESELECT */
                        msc_lun:3;
    u_char              msc_page:6,	/* only used by MODESENSE */
                        msc_pcf:2;	/* only used by MODESENSE */
    u_char              msc_reserved2:8;
    u_char              msc_len;
    u_char              msc_control;
#else
#error	SCSI command / data structures are compiler sensitive
#endif
};

struct mode_sense_param_list_header {
    u_char              plh_snslen;	/* only used by MODESENSE */
    u_char              plh_medium;
    u_char              plh_reserved;
    u_char              plh_blkdesclen;	/* either 0 or 8, usually 8 */
};

struct mode_sense_block_descriptor {
    u_char              bd_density;
    u_char              bd_nblk_3b1,	/* use GET_3BYTE_UINT(bd_nblk) */
                        bd_nblk_3b2,	/* to pick up this value */
                        bd_nblk_3b3;	/* # of blocks, in 3 bytes */
    u_char              bd_reserved;
    u_char              bd_blklen_3b1,	/* use GET_3BYTE_UINT(bd_blklen) */
                        bd_blklen_3b2,	/* to pick up this value */
                        bd_blklen_3b3;	/* block-length, in 3 bytes */
};

struct mode_sense_pagecode_E {
#if	__BIG_ENDIAN__
    u_char              pce_reserved1:2,
                        pce_pagecode:6;	/* page code x'0E' */
    u_char              pce_parlen;	/* length, always x'0E' */
    u_char              pce_reserved2:5,
                        pce_immd:1,
                        pce_reserved3:2;
    u_char              pce_reserved4[5];	/* skip over a few bytes */
    u_char              pce_reserved5:4,
                        pce_ch0_sel:4;
    u_char              pce_ch0_vol;
    u_char              pce_reserved6:4,
                        pce_ch1_sel:4;
    u_char              pce_ch1_vol;
    u_char              pce_reserved7:4,
                        pce_ch2_sel:4;
    u_char              pce_ch2_vol;
    u_char              pce_reserved8:4,
                        pce_ch3_sel:4;
    u_char              pce_ch3_vol;
#elif	__LITTLE_ENDIAN__
    u_char              pce_pagecode:6,	/* page code x'0E' */
                        pce_reserved1:2;
    u_char              pce_parlen;	/* length, always x'0E' */
    u_char              pce_reserved3:2,
                        pce_immd:1,
                        pce_reserved2:5;
    u_char              pce_reserved4[5];	/* skip over a few bytes */
    u_char              pce_ch0_sel:4,
                        pce_reserved5:4;
    u_char              pce_ch0_vol;
    u_char              pce_ch1_sel:4,
                        pce_reserved6:4;
    u_char              pce_ch1_vol;
    u_char              pce_ch2_sel:4,
                        pce_reserved7:4;
    u_char              pce_ch2_vol;
    u_char              pce_ch3_sel:4,
                        pce_reserved8:4;
    u_char              pce_ch3_vol;
#else
#error	SCSI command / data structures are compiler sensitive
#endif
};

struct mode_sense_select_reply {
    struct mode_sense_param_list_header msr_plh;
    struct mode_sense_block_descriptor msr_bd;
 /*
  * the following really should be declared as a union that included all the
  * structs used by any page-code 
  */
    union {
	struct mode_sense_pagecode_E u_msr_pcE;
    }                   u;
};

struct mode_select_alt_reply {	/* sans block descriptor */
    struct mode_sense_param_list_header msar_plh;
 /*
  * the following really should be declared as a union that included all the
  * structs used by any page-code 
  */
    union {
	struct mode_sense_pagecode_E u_msar_pcE;
    }                   u;
};


/**************************************************************************
 * prevent/allow medium removal command
 */
#define C6OP_PREVENT_REMOVAL_1E 0x1E	/* 6-byte command */
struct prevent_removal_1e_cmd {
#if	__BIG_ENDIAN__
    u_char              par_op_code;	/* C6OP_PREVENT_REMOVAL: x'1E' */
    u_char              par_lun:3,
                        par_reserved1:5;
    u_char              par_reserved2[2];
    u_char              par_reserved3:7,
                        par_prevent:1;	/* 0 = allow, 1 = prevent */
    u_char              par_control;
#elif	__LITTLE_ENDIAN__
    u_char              par_op_code;	/* C6OP_PREVENT_REMOVAL: x'1E' */
    u_char              par_reserved1:5,
                        par_lun:3;
    u_char              par_reserved2[2];
    u_char              par_prevent:1,	/* 0 = allow, 1 = prevent */
                        par_reserved3:7;
    u_char              par_control;
#else
#error	SCSI command / data structures are compiler sensitive
#endif
};

These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.