diff -c ../tosha-0.05/Makefile ./Makefile
*** ../tosha-0.05/Makefile	Tue May 20 17:57:17 1997
--- ./Makefile	Mon Jul  6 16:26:50 1998
***************
*** 19,24 ****
--- 19,31 ----
  CFLAGS=-O2 -Wall -ansi
  # CFLAGS=-g -Wall -ansi -pedantic
  
+ .if (exists(/usr/include/camlib.h))
+ CFLAGS+=-DCAM
+ LDFLAGS=-lcam
+ .else
+ LDFLAGS=-lscsi
+ .endif
+ 
  all:	tosha pcmplay pcmfade
  
  utils.o:	utils.c utils.h
***************
*** 28,34 ****
  pcmfade.o:	pcmfade.c utils.h
  
  tosha:	tosha.o utils.o getlopt.o
! 	$(CC) $(CFLAGS) -o tosha -lscsi tosha.o utils.o getlopt.o
  
  pcmplay:	pcmplay.o utils.o getlopt.o
  	$(CC) $(CFLAGS) -o pcmplay pcmplay.o utils.o getlopt.o
--- 35,41 ----
  pcmfade.o:	pcmfade.c utils.h
  
  tosha:	tosha.o utils.o getlopt.o
! 	$(CC) $(CFLAGS) -o tosha $(LDFLAGS) tosha.o utils.o getlopt.o
  
  pcmplay:	pcmplay.o utils.o getlopt.o
  	$(CC) $(CFLAGS) -o pcmplay pcmplay.o utils.o getlopt.o
diff -c ../tosha-0.05/tosha.c ./tosha.c
*** ../tosha-0.05/tosha.c	Tue May 20 18:11:49 1997
--- ./tosha.c	Wed Sep 16 18:46:26 1998
***************
*** 47,55 ****
  #include <fcntl.h>
  #include <sys/types.h>
  #include <sys/uio.h>
- #include <sys/scsiio.h>
  #include <unistd.h>
  #include <scsi.h>
  extern int errno;
  
  /*
--- 47,65 ----
  #include <fcntl.h>
  #include <sys/types.h>
  #include <sys/uio.h>
  #include <unistd.h>
+ #ifdef CAM
+ #include <cam/cam.h>
+ #include <cam/cam_ccb.h>
+ #include <cam/scsi/scsi_all.h>
+ #include <cam/scsi/scsi_da.h>
+ #include <cam/scsi/scsi_pass.h>
+ #include <cam/scsi/scsi_message.h>
+ #include <camlib.h>
+ #else /* !CAM */
+ #include <sys/scsiio.h>
  #include <scsi.h>
+ #endif /* !CAM  */
  extern int errno;
  
  /*
***************
*** 74,79 ****
--- 84,90 ----
   *   wasn't able to find a better solution.
   */
  
+ #ifndef CAM
  #undef SCSIREQ_ERROR
  #define SCSIREQ_ERROR(SR) (\
  0 \
***************
*** 81,86 ****
--- 92,98 ----
  || SR->retsts      	/* SCSI transfer status */ \
  || SR->error       	/* copy of errno */ \
  )
+ #endif
  
  /*
   *   Uncommenting this define will cause a LOT of output.
***************
*** 95,102 ****
--- 107,119 ----
  typedef unsigned char byte;
  typedef unsigned long ulong;
  
+ #ifdef CAM
+ union ccb *ccb;
+ struct cam_device *cam_dev;
+ #else /* !CAM */
  struct scsireq *sreq;	/* SCSI device request structure */
  int scsifd;		/* SCSI device file descriptor */
+ #endif /* !CAM */
  int readcmd = 0x28;	/* read command to use for DA reading */
  int byteswap = FALSE;	/* do we have to swap byte order? */
  
***************
*** 126,131 ****
--- 143,176 ----
  {
  	int result;
  
+ #ifdef CAM
+ 	bzero(&(&ccb->ccb_h)[1], sizeof(struct ccb_scsiio));
+ 	csio_build(&ccb->csio,
+ 		   /* data_ptr */ (u_int8_t *)buf,
+ 		   /* dxfer_len */ size,
+ 		   /* flags */ flags,
+ 		   /* retry_count */ 1,
+ 		   /* timeout */ 10000,
+ 		   /* cmd_spec */ cmd);
+ 
+ 	if ((result = cam_send_ccb(cam_dev, ccb)) < 0) {
+ 		perror("error sending SCSI command");
+ 		cam_freeccb(ccb);
+ 		cam_close_device(cam_dev);
+ 		exit(1);
+ 	}
+ 	if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
+ 		fprintf(stderr, "error returned from SCSI command:\n");
+ 		if ((ccb->ccb_h.status & CAM_STATUS_MASK) ==
+ 		     CAM_SCSI_STATUS_ERROR)
+ 			scsi_sense_print(cam_dev, &ccb->csio, stderr);
+ 		else
+ 			fprintf(stderr, "ccb->ccb_h.status == %d\n",
+ 				ccb->ccb_h.status);
+ 
+ 		exit(1);
+ 	}
+ #else /* !CAM */
  	scsireq_reset (sreq);
  	sreq->timeout = 10000;
  	scsireq_build (sreq, size, (char *) buf, flags, cmd);
***************
*** 134,139 ****
--- 179,185 ----
  	if (SCSIREQ_ERROR (sreq))
  #endif
  		scsi_debug (stderr, result, sreq);
+ #endif /* !CAM */
  	return (result);
  }
  
***************
*** 144,150 ****
--- 190,200 ----
  
  void get_density (int *density, int *secsize)
  {
+ #ifdef CAM
+ 	simple_request (12, CAM_DIR_IN | CAM_DEV_QFRZDIS, "1A 0 1 0 C 0");
+ #else /* !CAM */
  	simple_request (12, SCCMD_READ, "1A 0 1 0 C 0");
+ #endif /* !CAM */
  	*density = buf[4];
  	*secsize = buf[10] << 8 | buf[11];
  }
***************
*** 161,167 ****
--- 211,221 ----
  	buf[4] = density;
  	buf[10] = secsize >> 8;
  	buf[11] = secsize & 0xff;
+ #ifdef CAM
+ 	simple_request (12, CAM_DIR_OUT | CAM_DEV_QFRZDIS, "15 10 0 0 C 0");
+ #else /* !CAM */
  	simple_request (12, SCCMD_WRITE, "15 10 0 0 C 0");
+ #endif /* !CAM */
  }
  
  /*
***************
*** 386,391 ****
--- 440,487 ----
  	for (sec = start; sec < endpp; sec += secread) {
  		if ((secread = framesperbuf) > endpp - sec)
  			secread = endpp - sec;
+ 
+ #ifdef CAM
+ 		if (readcmd == 0xd8)
+ 			csio_build(&ccb->csio,
+ 				   /* data_ptr */ (u_int8_t *)buf,
+ 				   /* dxfer_len */ FRAMESIZE * secread,
+ 				   /* flags */ CAM_DIR_IN,
+ 				   /* retries */ 1,
+ 				   /* timeout */ 10000,
+ 				   /* cmd_spec */ "v 0 0 v:i3 0 0 0 v 0 0",
+ 				   readcmd, sec, secread);
+ 		else
+ 			csio_build(&ccb->csio,
+ 				   /* data_ptr */ (u_int8_t *)buf,
+ 				   /* dxfer_len */ FRAMESIZE * secread,
+ 				   /* flags */ CAM_DIR_IN,
+ 				   /* retries */ 1,
+ 				   /* timeout */ 10000,
+ 				   /* cmd_spec */ "v 0 0 v:i3 0 0 v 0",
+ 				   readcmd, sec, secread );
+ 
+ 		if ((result = cam_send_ccb(cam_dev, ccb)) < 0) {
+ 			perror("error sending CD-DA read command");
+ 			cam_freeccb(ccb);
+ 			cam_close_device(cam_dev);
+ 			exit(1);
+ 		}
+ 
+ 		if ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) {
+ 			fprintf(stderr, "error returned from CD-DA"
+ 				" read command:\n");
+ 			if ((ccb->ccb_h.status & CAM_STATUS_MASK) ==
+ 			     CAM_SCSI_STATUS_ERROR)
+ 				scsi_sense_print(cam_dev, &ccb->csio, stderr);
+ 			else
+ 				fprintf(stderr, "ccb->ccb_h.status == %d\n",
+ 					ccb->ccb_h.status);
+ 
+ 			exit(1);
+ 		}
+ #else /* !CAM */
+ 
  		scsireq_reset (sreq);
  		sreq->timeout = 10000;
  		if (readcmd == 0xd8)
***************
*** 403,408 ****
--- 499,505 ----
  		if (SCSIREQ_ERROR (sreq))
  #endif
  			scsi_debug (stderr, result, sreq);
+ #endif /* !CAM */
  		if (byteswap) {
  			int j, num = FRAMESIZE * secread;
  			byte t;
***************
*** 497,514 ****
  	 *   Open SCSI device and initialize SCSI request structure.
  	 */
  
  	if ((scsifd = scsi_open(device, O_RDWR)) == -1)
  		die (device);
  	if (!(sreq = scsireq_new())) {
  		fprintf (stderr, "%s: scsireq_new(): Out of memory.\n", me);
  		exit (1);
  	}
! 
  	/*
  	 *   Get vendor & product IDs.
  	 */
  
  	simple_request (64, SCCMD_READ, "12 0 0 0 40 0");
  	vendor = justify(strndup((char *) buf+8, 8));
  	product = justify(strndup((char *) buf+16, 16));
  	versid = justify(strndup((char *) buf+32, 4));
--- 594,625 ----
  	 *   Open SCSI device and initialize SCSI request structure.
  	 */
  
+ #ifdef CAM
+ 	if ((cam_dev = cam_open_device(device, O_RDWR)) == NULL) {
+ 		fprintf(stderr, "%s: %s\n", me, cam_errbuf);
+ 		exit(1);
+ 	}
+ 	if ((ccb = cam_getccb(cam_dev)) == NULL) {
+ 		fprintf(stderr, "%s: couldn't allocate CCB\n", me);
+ 		exit(1);
+ 	}
+ #else /* !CAM */
  	if ((scsifd = scsi_open(device, O_RDWR)) == -1)
  		die (device);
  	if (!(sreq = scsireq_new())) {
  		fprintf (stderr, "%s: scsireq_new(): Out of memory.\n", me);
  		exit (1);
  	}
! #endif /* !CAM */
  	/*
  	 *   Get vendor & product IDs.
  	 */
  
+ #ifdef CAM
+ 	simple_request(64, CAM_DIR_IN | CAM_DEV_QFRZDIS, "12 0 0 0 40 0");
+ #else /* !CAM */
  	simple_request (64, SCCMD_READ, "12 0 0 0 40 0");
+ #endif /* !CAM */
  	vendor = justify(strndup((char *) buf+8, 8));
  	product = justify(strndup((char *) buf+16, 16));
  	versid = justify(strndup((char *) buf+32, 4));
***************
*** 571,577 ****
--- 682,693 ----
  	 *   Get table of contents.
  	 */
  
+ #ifdef CAM
+ 	if (simple_request (2048, CAM_DIR_IN | CAM_DEV_QFRZDIS,
+ 			    "43 0 0 0 0 0 1 8 0 0")) {
+ #else /* !CAM */
  	if (simple_request (2048, SCCMD_READ, "43 0 0 0 0 0 1 8 0 0")) {
+ #endif /* !CAM */
  		fprintf (stderr, "%s: Can't read table of contents.\n", me);
  		exit (1);
  	}
***************
*** 690,696 ****
--- 806,816 ----
  
  	set_density (density, sectorsize);
  
+ #ifdef CAM 
+ 	cam_close_device(cam_dev);
+ #else /* !CAM */
  	close (scsifd);
+ #endif /* !CAM */
  	exit (0);
  }
  
