144 lines
3.4 KiB
C++
144 lines
3.4 KiB
C++
#include "transport.hxx"
|
|
|
|
int main (int argc,char *argv[])
|
|
{ Scsi_Command cmd;
|
|
unsigned char buf[128],erb=0;
|
|
int err,i,rdonly=0;
|
|
const char *dev=NULL;
|
|
|
|
for (i=1;i<argc;i++)
|
|
{ if (!strncmp (argv[i],"-arre",4)) erb|=0x40;
|
|
else if (!strncmp (argv[i],"-awre",4)) erb|=0x80;
|
|
else if (!strncmp (argv[i],"-rdonly",4)) rdonly=1;
|
|
else if (!strncmp (argv[i],"-rdwr",4)) rdonly=-1;
|
|
else if (!strncmp (argv[i],"-rw",3)) rdonly=-1;
|
|
else if (!strncmp (argv[i],"-wronly",3)) rdonly=-1;
|
|
else dev=argv[i];
|
|
}
|
|
|
|
if (!(dev && (erb || rdonly)))
|
|
{ fprintf (stderr,"usage: %s [-arre] [-awre] [-rdonly|-rdwr] /dev/dvd\n",
|
|
argv[0]);
|
|
return 1;
|
|
}
|
|
|
|
if (!cmd.associate (dev))
|
|
{ fprintf (stderr,"%s: unable to open: ",dev), perror (NULL);
|
|
return 1;
|
|
}
|
|
|
|
cmd[0] = 0x12; // INQUIRY
|
|
cmd[4] = 36;
|
|
cmd[5] = 0;
|
|
if ((err=cmd.transport(READ,buf,36)))
|
|
{ sperror ("INQUIRY",err);
|
|
return 1;
|
|
}
|
|
|
|
if ((buf[0]&0x1F) != 5)
|
|
{ fprintf (stderr,":-( not an MMC unit!\n");
|
|
return 1;
|
|
}
|
|
|
|
#if 0
|
|
cmd[0]=0x46; // GET CONFIGURATION
|
|
cmd[1]=1;
|
|
cmd[8]=8;
|
|
cmd[9]=0;
|
|
if ((err=cmd.transport(READ,buf,8)))
|
|
{ sperror ("GET CONFIGURATION",err);
|
|
return 1;
|
|
}
|
|
|
|
if ((buf[6]<<8|buf[7]) != 0x12)
|
|
{ fprintf (stderr,":-( not DVD-RAM!\n");
|
|
return 1;
|
|
}
|
|
#endif
|
|
|
|
if (erb) do
|
|
{ unsigned char page01[8+12];
|
|
|
|
cmd[0]=0x5A; // MODE SENSE
|
|
cmd[1]=0x08; // "Disable Block Descriptors"
|
|
cmd[2]=1; // Page 01
|
|
cmd[8]=sizeof(page01);
|
|
if ((err=cmd.transport(READ,page01,sizeof(page01))))
|
|
{ sperror("MODE SENSE",err); return 1; }
|
|
|
|
if ((page01[8+2]&erb) == erb)
|
|
{ printf ("A[RW]RE bit is set already.\n");
|
|
break;
|
|
}
|
|
|
|
memset (page01,0,8);
|
|
page01[8+2]|=erb; // A[WR]RE on
|
|
|
|
cmd[0]=0x55; // MODE SELECT
|
|
cmd[1]=0x10; // conformant
|
|
cmd[8]=sizeof(page01);
|
|
cmd[9]=0;
|
|
if ((err=cmd.transport(WRITE,page01,sizeof(page01))))
|
|
{ sperror("MODE SELECT",err); return 1; }
|
|
|
|
// Verify settings...
|
|
cmd[0]=0x5A; // MODE SENSE
|
|
cmd[1]=0x08; // "Disable Block Descriptors"
|
|
cmd[2]=1; // Page 01
|
|
cmd[8]=sizeof(page01);
|
|
if ((err=cmd.transport(READ,page01,sizeof(page01))))
|
|
{ sperror("MODE SENSE",err); return 1; }
|
|
|
|
if ((page01[8+2]&erb) != erb)
|
|
{ fprintf (stderr,":-( failed to set A[RW]RE bit.\n");
|
|
return 1;
|
|
}
|
|
} while (0);
|
|
|
|
if (rdonly) do
|
|
{ unsigned char dvd_C0[8];
|
|
|
|
cmd[0]=0xAD; // READ DVD STRUCTURE
|
|
cmd[7]=0xC0;
|
|
cmd[9]=sizeof(dvd_C0);
|
|
cmd[11]=0;
|
|
if ((err=cmd.transport(READ,dvd_C0,sizeof(dvd_C0))))
|
|
{ sperror("READ DVD STRUCTURE#C0",err); return 1; }
|
|
|
|
if (rdonly>0 && (dvd_C0[4]&0x02))
|
|
{ printf ("The disc is write protected already.\n");
|
|
break;
|
|
}
|
|
else if (rdonly<0 && !(dvd_C0[4]&0x02))
|
|
{ printf ("The disc is unprotected already.\n");
|
|
break;
|
|
}
|
|
|
|
memset (dvd_C0,0,sizeof(dvd_C0));
|
|
dvd_C0[1]=6;
|
|
if (rdonly>0) dvd_C0[4]|=2; // "PWP" on
|
|
else dvd_C0[4]&=~2; // "PWP" off
|
|
|
|
cmd[0]=0xBF; // SEND DVD STRUCTURE
|
|
cmd[7]=0xC0;
|
|
cmd[9]=sizeof(dvd_C0);
|
|
cmd[11]=0;
|
|
if ((err=cmd.transport(WRITE,dvd_C0,sizeof(dvd_C0))))
|
|
{ sperror("SEND DVD STRUCTURE#C0",err); return 1; }
|
|
|
|
// Verify...
|
|
cmd[0]=0xAD; // READ DVD STRUCTURE
|
|
cmd[7]=0xC0;
|
|
cmd[9]=sizeof(dvd_C0);
|
|
cmd[11]=0;
|
|
if ((err=cmd.transport(READ,dvd_C0,sizeof(dvd_C0))))
|
|
{ sperror("READ DVD STRUCTURE#C0",err); return 1; }
|
|
|
|
printf ("Persistent Write Protection is %s\n",
|
|
dvd_C0[4]&0x02 ? "on" : "off");
|
|
|
|
} while (0);
|
|
|
|
return 0;
|
|
}
|