home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.cdrom.com/pub/cdrom/
/
cdrom.tar
/
cdrom
/
source
/
setreclen.c
< prev
next >
Wrap
Text File
|
1993-03-02
|
4KB
|
157 lines
Article 8282 (28 more) in alt.cd-rom:
From: kkaempf@didymus.rmi.de (Klaus Kaempf)
Subject: Re: Sun/Solaris & Standard CD ROM Drives
Message-ID: <C31xBC.LHt@didymus.rmi.de>
Organization: Klaus Kaempf Softwareentwicklung
References: <1m196oINNls2@usenet.INS.CWRU.Edu> <1me3h4INNj73@meaddata.meaddata.com>
Date: Fri, 26 Feb 1993 10:33:11 GMT
Lines: 147
Hi folks !
This debate about CDROM drives and Suns is as old as this newsgroup.
There is a cheap solution (at least for SunOS 4.x, don't know about
Solaris 2 yet) and source is included below.
You still can't boot with the drive since the *stupid* OpenProm Boot
code doesn't set the record lenght to 512bytes. But what you can do
is compile the following program (it expects /dev/rsr0 as the drive,
change line 22 if it's something else) and put it in your 'rc.local'.
Ttttttthats all folks !
Klaus
------------->--cut here--<----------------
/*
* setreclen.c
*
* set record length of CDROM to 512bytes
*
* This came along the net a while ago
* I cleaned it up and added some debug code
* Have fun !
* Klaus Kaempf, kkaempf@didymus.rmi.de
*
*/
# include <sys/types.h>
# include <sys/buf.h>
# include <sun/dkio.h>
# include <scsi/targets/srdef.h>
# include <scsi/impl/uscsi.h>
# include <strings.h>
# include <stdio.h>
char cdrom[] = "/dev/rsr0";
extern char * cdrom_status();
/* group 0 commands */
#define TEST 0x00
#define REZERO 0x01
#define SENSEREQ 0x03
#define READ 0x08
#define SEEK 0x0b
#define NOP 0x0d
#define INQ 0x12
#define MODESEL 0x15
#define RESERVE 0x16
#define RELEASE 0x17
#define MODESENSE 0x1a
#define STARTSTOP 0x1b
#define DIAGRCV 0x1c
#define DIAGSND 0x1d
#define MEDIUMLOCK 0x1e
/* group 1 commands */
#define READCAP 0x25
#define READEXT 0x28
#define SEEKEXT 0x2b
/* group 6 commands */
#define AUDIOTRACK 0xc0
#define AUDIOPLAY 0xc1
#define AUDIOSTILL 0xc2
#define AUDIOSTOP 0xc3
#define EJECT 0xc4
#define CLOSE 0xc5
#define AUDIOSUB 0xc6
#define AUDIODISK 0xc7
#define ROMMODE 0xc8
/***/
#define CMDLEN(cmd) ((cmd >= 0x20) ? 10 : 6)
/***/
#define UBUFLEN 4096
static void showhex(why, what, len)
char *why;
unsigned char *what;
int len;
{
fprintf(stderr,"Showhex %s\n", why);
while (len > 0) {
fprintf(stderr,"%02x ", *what++);
len--;
}
fprintf(stderr,"\n");
return;
}
main() {
int fd;
int i;
struct uscsi_cmd ucmd;
char * s_command;
char * s_buffer;
if ((fd = open(cdrom, 0)) == -1) {
fprintf(stderr, "open: ");
perror(cdrom);
exit(1);
}
s_command = (char *) malloc(10);
if (s_command == NULL) {
printf("malloc error (command)\n");
exit(-1);
}
bzero(s_command, 10);
s_buffer = (char *) malloc(UBUFLEN);
if (s_buffer == NULL) {
printf("malloc error (buffer)\n");
exit(-1);
}
bzero(s_buffer, UBUFLEN);
s_command[0] = MODESEL;
s_command[1] = 0x10;
s_command[4] = 12;
s_buffer[3] = 0x08;
s_buffer[10] = 0x02;
ucmd.uscsi_cdb = s_command;
ucmd.uscsi_cdblen = 6;
ucmd.uscsi_bufaddr = s_buffer;
ucmd.uscsi_buflen = UBUFLEN;
ucmd.uscsi_flags = USCSI_WRITE;
i = ioctl(fd, USCSICMD, ucmd);
#if 1
showhex("ucmd", &ucmd, sizeof ucmd);
showhex("s_buffer", s_buffer, 256);
#endif
close(fd);
exit(i);
}
-------->--and here --<---------------
--
Klaus Kaempf E-Mail: kkaempf@didymus.rmi.de
Jakobstr. 181 Fax: 0241-403407
D-5100 Aachen Voice: 0241-403446