Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 20 Jan 2002 21:05:47 -0500
From:      Alan Eldridge <alane@geeksrus.net>
To:        Miguel Mendez <flynn@energyhq.homeip.net>
Cc:        ports@FreeBSD.ORG
Subject:   Re: Port in progress...
Message-ID:  <20020121020547.GA81588@wwweasel.geeksrus.net>
In-Reply-To: <20020120201209.E12D23FC1F@energyhq.homeip.net>
References:  <20020120201209.E12D23FC1F@energyhq.homeip.net>

next in thread | previous in thread | raw e-mail | index | archive | help
On Sun, Jan 20, 2002 at 09:11:50PM +0100, Miguel Mendez wrote:
>Hi porters,
>
>I'm currently working on the port of disc-cover 
>(http://www.liacs.nl/~jvhemert/disc-cover/) , which happens to depend on 
>FreeDB.pm which I've alreayd ported, well, almost. This perl module has some 

OK, here's the correct files/patch-FreeDB.pm ... :)

I'm not a perl d00d3, so the code is kinda rough, but, hey, it works.
It should be enough to send back to the author so he can patch his code
to work on both Linux and FreeBSD.

I'm sure there's a Right Way to do what I did, but this'll do in a pinch.

---8<-snip---8<-snip---8<-snip---8<-snip---8<-snip---8<-snip---8<---
--- FreeDB.pm.orig	Wed Dec  8 08:46:32 1999
+++ FreeDB.pm	Sun Jan 20 21:00:40 2002
@@ -49,6 +49,21 @@
 
 $VERSION = '1.1.2';
 
+my ($os, $CDIOREADTOCHEADER, $CDIOREADTOCENTRY);
+
+sub BEGIN {
+    $os = `uname`;
+    if ($os =~ m/FreeBSD/) {
+	$CDIOREADTOCHEADER = 0x40046304;
+	$CDIOREADTOCENTRY  = 0xc00c6306;
+    } elsif ($os =~ m/Linux/) {
+	$CDIOREADTOCHEADER = 0x5305;
+	$CDIOREADTOCENTRY  = 0x5306;
+    } else {
+	die "FIXME: $os not supported";
+    }
+}
+
 # Preloaded methods go here.
 
 sub new {
@@ -576,7 +591,10 @@
 		my ($trackno, $ttitle) = split('=', $i);
 		$tracks[$trackno] .= $ttitle;
 	}
-	return 0 if (@tracks[1] eq "");
+
+# was @tracks[1]
+
+	return 0 if ($tracks[1] eq "");
 	my (@offsets) = ($tmp =~ /^\#\s+(\d+)/mg);
 	my ($disclength) = ($tmp =~ /^\#\s*Disc length:\s*(\d+)/mg);
 	
@@ -624,38 +642,68 @@
 # Sets:    {discid} and _server_string()
 sub _get_disc_info {
    my $self = shift @_;
-	my ($result, $start, $end, $discid, $tracknumber);
+   my ($result, $start, $end, $discid, $tracknumber, $chdr);
    my ($track, $adr_ctrl, $format, $frame, $minute, $second);
-   my $chdr = "";
    my @tracks = ();
 
 	open (cdrom_fd, "$self->{'cdrom_device'}") or croak "Error: could not open device: \"$self->{'cdrom_device'}\"\n\nSolution: login as root and make a new group 'cdrom' in /etc/group\nthen issue these commands:\n  chgrp cdrom $self->{'cdrom_device'}\n  cdmod g+r $self->{'cdrom_device'}\n  adduser <username> cdrom\nNow logout and login as the user again.\n\n";
 
+   my $hdrfmt;
+   if ($os =~ m/Linux/) {
+       $hdrfmt = 'CC';
+   } elsif ($os =~ m/FreeBSD/) {
+       $hdrfmt = 'xxCC';
+   }
 	# Get start and end track number
-   $result = ioctl(cdrom_fd, 0x5305, $chdr);
+   $chdr = pack($hdrfmt, 0, 0);
+   $result = ioctl(cdrom_fd, $CDIOREADTOCHEADER, $chdr);
    $result or croak "CD reading ioctl failed.\n";
    $self->debug(2,"RESULT IS: $result\n");
-	($start, $end) = unpack('CC', $chdr);
-
+   ($start, $end) = unpack($hdrfmt, $chdr);
 	# Get info for each track
 	for ($tracknumber = $start; $tracknumber <= $end; $tracknumber++) {
-		my $tocentry = pack('C8', $tracknumber, 0, 2, 0, 0, 0, 0, 0);
+		my $tocentry;
+
+		if ($os =~ m/Linux/) {
+		    $tocentry = pack('C8', $tracknumber, 0, 2, 0, 0, 0, 0, 0);
+		} elsif ($os =~ m/FreeBSD/) {
+		    $tocentry = pack('CCx10', 2, $tracknumber);
+		}
 
-		if( ioctl(cdrom_fd, 0x5306, $tocentry) < 0 ) {
+		if( ioctl(cdrom_fd, $CDIOREADTOCENTRY, $tocentry) < 0 ) {
 			croak "Error: problems during cdrom tracks read in\n\nSolution: sorry no solution\n";
 		}
-		($track, $adr_ctrl, $format, $frame, $minute, $second) = unpack('C*', $tocentry);
+		if ($os =~ m/Linux/) {
+		    ($track, $adr_ctrl, $format, $frame, $minute, $second) 
+			= unpack('C*', $tocentry);
+		} elsif ($os =~ m/FreeBSD/) {
+		    ($format, $track, $minute, $second, $frame) 
+			= unpack('CCx7CCC', $tocentry);
+		}
 		$tracks[$tracknumber] = (60 * $minute + $second);
-
 	}
 
 	# Get info for leadout
-	my $tocentry = pack('C8', 0xAA, 0, 2, 0, 0, 0, 0 ,0);
-	if( ioctl(cdrom_fd, 0x5306, $tocentry) < 0 )
+        my $tocentry;
+
+        if ($os =~ m/Linux/) {
+	    $tocentry = pack('C8', 0xAA, 0, 2, 0, 0, 0, 0 ,0);
+	} elsif ($os =~ m/FreeBSD/) {
+	    $tocentry = pack('CCx10', 2, 0xAA);
+	}
+
+	if( ioctl(cdrom_fd, $CDIOREADTOCENTRY, $tocentry) < 0 )
 	{
 		croak "Error: problems during cdrom tracks read in\n\nSolution: sorry no solution\n";
 	}
-	($track, $adr_ctrl, $format, $frame, $minute, $second) = unpack('C*', $tocentry);
+
+        if ($os =~ m/Linux/) {
+	    ($track, $adr_ctrl, $format, $frame, $minute, $second) 
+		= unpack('C*', $tocentry);
+	} elsif ($os =~ m/FreeBSD/) {
+	    ($format, $track, $minute, $second, $frame) 
+		= unpack('CCx7CCC', $tocentry);
+	}
 	$tracks[$end + 1] = (60 * $minute + $second);
 
 	# Calculate cddb sum for all tracks and for total
---8<-snip---8<-snip---8<-snip---8<-snip---8<-snip---8<-snip---8<---

-- 
Alan Eldridge
Pmmfmffmmfmp mmmpppppffmpmfpmpppff PmpMpmMpp ppfppp MpfpffmppmppMmpFmmMpm 
mfpmmmmmfpmpmpppff.

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-ports" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20020121020547.GA81588>