--- cdromlow.c	Thu May 11 14:12:51 2000
+++ cdromlow.c.new	Mon May 15 23:56:27 2000
@@ -7,8 +7,14 @@
 #include <sys/ioctl.h>
 #include <fcntl.h>
 #include <signal.h>
-#include <linux/cdrom.h>
 #include <unistd.h>
+#ifndef __FreeBSD__
+#include <linux/cdrom.h>
+#else
+#include <sys/cdio.h>
+#include <sys/param.h>
+#include <sys/mount.h>
+#endif
 
 #include "piping.h"
 #include "cdromlow.h"
@@ -19,13 +25,31 @@
 /* uncomment for debugging */
 /* #define DEBUG */
 
+/* Needed by FreeBSD */
+#ifdef __FreeBSD__
+#define CDROM_DATA_TRACK 4
+#define CDROM_LEADOUT 0xaa
+#define CD_FRAMESIZE 2048
+#define CD_FRAMESIZE_RAW 2352
+#define CDROM_LBA CD_LBA_FORMAT
+#define CDROMREADTOCHDR CDIOREADTOCHEADER
+#define CDROMREADTOCENTRY CDIOREADTOCENTRY
+#endif
+
 /* reimplemented using direct cdrom access:
  * does the current cd have one or more data tracks ? */
 int cdromlow_hasdatatrack(char *device)
 {
 	int cdrom;
+/* unfortunately, the data members of cdrom_tochdr / ioc_toc_header, etc.
+ * are not compatible so we have to use #ifndef on each section. :-(  */
+#ifndef __FreeBSD__
 	struct cdrom_tochdr header;
 	struct cdrom_tocentry entry;
+#else
+	struct ioc_toc_header header;
+	struct ioc_read_toc_single_entry entry;
+#endif
 	int x;
 	int hasdatatrack=0;	
 	
@@ -33,12 +57,25 @@
 	if (cdrom!=-1)
 	  {		  
 		  ioctl(cdrom,CDROMREADTOCHDR,&header);	
+#ifndef __FreeBSD__
 		  for (x=header.cdth_trk0;x<=header.cdth_trk1;x++)
+#else
+		  for (x = header.starting_track;x <= header.ending_track;x++)
+#endif
 		    {		  
+#ifndef __FreeBSD__
 			    entry.cdte_track=x;
 			    entry.cdte_format=CDROM_LBA;
+#else
+			    entry.track = x;
+			    entry.address_format = CDROM_LBA;
+#endif
 			    ioctl(cdrom,CDROMREADTOCENTRY,&entry);
+#ifndef __FreeBSD__
 			    if (entry.cdte_ctrl&CDROM_DATA_TRACK)
+#else
+			    if (entry.entry.control & CDROM_DATA_TRACK)
+#endif
 				hasdatatrack=1;
 		    }
 		  ;
@@ -53,7 +90,11 @@
 int cdromlow_tracks(char *device)
 {
 	int cdrom;
+#ifndef __FreeBSD__
 	struct cdrom_tochdr header;
+#else
+	struct ioc_toc_header header;
+#endif
 	int tracknum;
 	
 	tracknum=0;
@@ -61,7 +102,11 @@
 	if (cdrom!=-1)
 	  {		  
 		  if (ioctl(cdrom,CDROMREADTOCHDR,&header)!=-1)
-		      tracknum=1+header.cdth_trk1-header.cdth_trk0;	
+#ifndef __FreeBSD__
+		      tracknum=1+header.cdth_trk1-header.cdth_trk0;
+#else
+		      tracknum = 1 + header.ending_track - header.starting_track;
+#endif
 		  else
 		      tracknum=0;
 		  close(cdrom);
@@ -75,19 +120,32 @@
 int cdromlow_trackoffset(char *device,int num)
 {
    int cdrom;
+#ifndef __FreeBSD__
    struct cdrom_tocentry track;
+#else
+   struct ioc_read_toc_single_entry track;
+#endif
    int offset=-1;
    
    cdrom=open(device,O_RDONLY|O_NONBLOCK);
    if (cdrom!=-1)
      {		         
+#ifndef __FreeBSD__
 	track.cdte_track=num;
 	track.cdte_format=CDROM_LBA;
+#else
+	track.track = num;
+	track.address_format = CDROM_LBA;
+#endif
 	ioctl(cdrom,CDROMREADTOCENTRY,&track);
 		  		
 	close(cdrom);
 		
+#ifndef __FreeBSD__
 	offset=track.cdte_addr.lba;
+#else
+	offset = track.entry.addr.lba;
+#endif
 #ifdef DEBUG
 	printf ("cdromlow_trackoffset: offset #%i is %i\n",
 		num,offset);
@@ -102,26 +160,48 @@
 int cdromlow_tracksize_sectors(char *device,int num)
 {
 	int cdrom;
+#ifndef __FreeBSD__
 	struct cdrom_tocentry track,tracknext;
+#else
+	struct ioc_read_toc_single_entry track, tracknext;
+#endif
 	int tracksize;
 
 	tracksize=0;
 	cdrom=open(device,O_RDONLY|O_NONBLOCK);
 	if (cdrom!=-1)
 	  {		         
+#ifndef __FreeBSD__
 		  track.cdte_track=num;
 		  track.cdte_format=CDROM_LBA;
+#else
+		  track.track = num;
+		  track.address_format = CDROM_LBA;
+#endif
 		  ioctl(cdrom,CDROMREADTOCENTRY,&track);
 		  
 		  if (num==cdromlow_tracks(device))
+#ifndef __FreeBSD__
 		      tracknext.cdte_track=CDROM_LEADOUT;
+#else
+		      tracknext.track = CDROM_LEADOUT;
+#endif
 		  else
+#ifndef __FreeBSD__
 		      tracknext.cdte_track=num+1;
 		  tracknext.cdte_format=CDROM_LBA;
+#else
+		      tracknext.track = num + 1;
+		  tracknext.address_format = CDROM_LBA;
+#endif
 		  ioctl(cdrom,CDROMREADTOCENTRY,&tracknext);
 		
 		  close(cdrom);
+#ifndef __FreeBSD__
 		  tracksize=(tracknext.cdte_addr.lba-track.cdte_addr.lba);
+#else
+		  tracksize = tracknext.entry.addr.lba - track.entry.addr.lba;
+#endif
 	  }
 	;	
 	return tracksize;
@@ -146,39 +226,74 @@
 int cdromlow_cddbnumber(char *device)
 {
 	int cdrom;
+#ifndef __FreeBSD__
+	int info = 0;
 	struct cdrom_tochdr header;
 	struct cdrom_tocentry entry;
+#else
+	struct ioc_toc_header header;
+	struct ioc_read_toc_single_entry entry;
+#endif
 	int x,secs;	
 	int cddbnum=0;
-        int info=0;
 
 	cddbnum=0;
 	cdrom=open(device,O_RDONLY|O_NONBLOCK);
 	if (cdrom!=-1)
 	  {
-	     /* check cdrom status before building cddb code */
+	     /* check cdrom status before building cddb code
+	      * internally supported by FreeBSD, so we don't need it there */
+#ifndef __FreeBSD__
 	     ioctl(cdrom,CDROM_DRIVE_STATUS,&info);
 	     if ((info==CDS_DISC_OK)||(info==CDS_NO_INFO))
+#endif
 	       if (ioctl(cdrom,CDROMREADTOCHDR,&header)!=-1)
 		 {		  	
+#ifndef __FreeBSD__
 		    entry.cdte_track=CDROM_LEADOUT;
 		    entry.cdte_format=CDROM_LBA;
+#else
+		    entry.track = CDROM_LEADOUT;
+		    entry.address_format = CDROM_LBA;
+#endif
 		    ioctl(cdrom,CDROMREADTOCENTRY,&entry);
+#ifndef __FreeBSD__
 		    secs=(entry.cdte_addr.lba/75);
+#else
+		    secs = entry.entry.addr.lba / 75;
+#endif
 		    
+#ifndef __FreeBSD__
 		    for (x=header.cdth_trk0;x<=header.cdth_trk1;x++)
+#else
+		    for (x = header.starting_track;x <= header.ending_track;x++)
+#endif
 		      {		  
+#ifndef __FreeBSD__
 			 entry.cdte_track=x;
 			 entry.cdte_format=CDROM_LBA;
+#else
+			 entry.track = x;
+			 entry.address_format = CDROM_LBA;
+#endif
 			 ioctl(cdrom,CDROMREADTOCENTRY,&entry);
+#ifndef __FreeBSD__
 			 cddbnum+=helpings_dsum((entry.cdte_addr.lba/75)+2);
 			 if (x==header.cdth_trk0) secs-=(entry.cdte_addr.lba/75);
+#else
+			 cddbnum += helpings_dsum((entry.entry.addr.lba / 75) + 2);
+			 if (x == header.starting_track) secs -= entry.entry.addr.lba / 75;
+#endif
 		      }
 		    ;
 		    
 		    cddbnum<<=24;
 		    cddbnum|=(secs<<8);
+#ifndef __FreeBSD__
 		    cddbnum|=(1+header.cdth_trk1-header.cdth_trk0);
+#else
+		    cddbnum |= (1 + header.ending_track - header.starting_track);
+#endif
 		 }
 	     ;
 	     close(cdrom);
