Looking for the RIOS CD player program

Rich Coe/65536 rhcoe at violin.austin.ibm.com
Tue May 1 23:26:39 AEST 1990


/*
 *                         PLAY PROGRAM
 *  This program is executed from the comamnd line by:
 *
 *          "play /dev/rcd? track#"
 *
 *  where /dev/rcd? is the special file name of the cdrom and track number
 *  is the track where play is to begin.  This program will exit and leave
 *  the cdrom playing.
 */

#include <stdio.h>
#include "fcntl.h"
#include <sys/ioctl.h>
#include <sys/cdrom.h>

int fd,rc;
extern errno;
uchar track;

int getdecnum(strg)
char *strg;
{
        int r = 0;
        char ic;

        ic = *strg++;
        while (ic != '\0') {
            if (ic < '0' || ic > '9')
                return(-1);
            else {
                r *= 10;
                r += ic - '0';
            }
            ic = *(strg++);
        }
	if (r > 9) r+=6;
        return(r);
}

int pass_thru(track)
uchar track;
{
        struct sc_iocmd         pt;
        char                    menuopt;
        int                     i, rc;

        /* Issue 2 test unit ready's */
        for (i=0 ; i<2 ; i++) {
                pt.command_length = 0x06;
                pt.scsi_cdb[0] = 0x00;
                pt.scsi_cdb[1] = 0x00;
                pt.scsi_cdb[2] = 0x00;
                pt.scsi_cdb[3] = 0x00;
                pt.scsi_cdb[4] = 0x00;
                pt.scsi_cdb[5] = 0x00;
                pt.flags              = 0x00;
                pt.buffer             = 0x00;
                pt.data_length        = 0x00;
                pt.timeout_value      = 0x05;
                pt.status_validity    = 0x00;
                pt.scsi_bus_status    = 0x00;
                pt.adapter_status     = 0x00;
                rc = ioctl(fd, CDIOCMD, &pt);
        }
        if (rc == -1) {
                printf("\nioctl failed.  errno = %d", errno);
                printf("\n\nstatus_validity = %.2X",pt.status_validity);
                printf("\nscsi_bus_status = %.2X", pt.scsi_bus_status);
                printf("\nadapter_status = %.2X", pt.adapter_status);
                return(rc);
        }
        /* issue the play command */
        pt.command_length = 0x0A;
        pt.scsi_cdb[0] = 0xC0;
        pt.scsi_cdb[1] = 0x01;
        pt.scsi_cdb[2] = track;
        for (i = 3 ; i < 9 ; i ++) {
                pt.scsi_cdb[i] = 0x00;
        }
        pt.scsi_cdb[9] = 0x80;
        pt.flags              = SC_ASYNC;
        pt.buffer             = 0x00;
        pt.data_length        = 0x00;
        pt.timeout_value      = 0x05;
        pt.status_validity    = 0x00;
        pt.scsi_bus_status    = 0x00;
        pt.adapter_status     = 0x00;
        rc = ioctl(fd, CDIOCMD, &pt);
        if (rc == -1) {
                printf("\nioctl failed.  errno = %d", errno);
                printf("\n\nstatus_validity = %.2X",pt.status_validity);
                printf("\nscsi_bus_status = %.2X", pt.scsi_bus_status);
                printf("\nadapter_status = %.2X", pt.adapter_status);
        }
        return(rc);
}

main(argc,argv)
int argc;
char * argv[];
{
        if (argc != 3) {
              printf("\nIncorrect number of paramaters.\n");
              printf("Format:  play special_file_name track_number\n");
        }
        else {
              if ( (fd = openx(argv[1], O_RDONLY, NULL, SC_DIAGNOSTIC)) < 0) {
                    return(99); }
              track = getdecnum(argv[2]);
	      if (track > 9) track+=6;
              if (track != -1) {
                    rc = pass_thru(track);
              }
              else
                    printf("\nError in track number.\n");
        }
}



More information about the Comp.unix.aix mailing list