Package: eject
Version: 2.0.13deb-13
Severity: important
Tags: patch

The attached patch allows eject to build (and work) on GNU/kFreeBSD.

Please could you forward it to upstream?

-- System Information:
Debian Release: testing/unstable
Architecture: kfreebsd-i386 (i686)
Shell:  /bin/sh linked to /bin/bash
Kernel: GNU/kFreeBSD 5.3-1
Locale: LANG=en_US, LC_CTYPE=en_US (charmap=ANSI_X3.4-1968) (ignored: LC_ALL 
set to C)

Versions of packages eject depends on:
ii  libc0.1                    2.3-1+kbsd.11 GNU C Library: Shared libraries an

eject recommends no packages.

-- no debconf information
diff -u eject-2.0.13deb/eject.c eject-2.0.13deb/eject.c
--- eject-2.0.13deb/eject.c
+++ eject-2.0.13deb/eject.c
@@ -36,12 +36,6 @@
 #error DEFAULTDEVICE not set, check Makefile
 #endif
 
-#include <linux/version.h>
-/* handy macro found in 2.1 kernels, but not in older ones */
-#ifndef KERNEL_VERSION
-#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
-#endif
-
 #include <unistd.h>
 #include <stdlib.h>
 #include <stdio.h>
@@ -59,17 +53,33 @@
 #include <sys/ioctl.h>
 #include <sys/wait.h>
 #include <sys/mtio.h>
+#include <sys/mount.h>
+
+#if defined(__linux__)
+#include <linux/version.h>
+/* handy macro found in 2.1 kernels, but not in older ones */
+#ifndef KERNEL_VERSION
+#define KERNEL_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
+#endif
 #include <linux/types.h>
 #include <linux/cdrom.h>
 #if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,0)
 #include <linux/ucdrom.h>
 #endif
 #include <linux/fd.h>
-#include <sys/mount.h>
 #include <scsi/scsi.h>
 #include <scsi/sg.h>
 #include <scsi/scsi_ioctl.h>
 
+#define HAVE_EJECT_SCSI
+#define HAVE_EJECT_FLOPPY
+#define HAVE_EJECT_TAPE
+
+#elif defined(__FreeBSD_kernel__)
+#include <sys/cdio.h>
+#endif
+
+
 #define CLOSE(fd) if (close(fd)==-1) { \
     perror(programName); \
     exit(1); \
@@ -137,9 +147,15 @@
 "  -v\t-- enable verbose output\n"
 "  -n\t-- don't eject, just show device found\n"
 "  -r\t-- eject CD-ROM\n"
+#ifdef HAVE_EJECT_SCSI
 "  -s\t-- eject SCSI device\n"
+#endif
+#ifdef HAVE_EJECT_FLOPPY
 "  -f\t-- eject floppy\n"
+#endif
+#ifdef HAVE_EJECT_TAPE
 "  -q\t-- eject tape\n"
+#endif
 "  -p\t-- use /proc/mounts instead of /etc/mtab\n"
 "  -m\t-- do not unmount device even if it is mounted\n"
 )
@@ -149,8 +165,18 @@
 "Long options:\n"
 "  -h --help   -v --verbose	 -d --default\n"
 "  -a --auto   -c --changerslot  -t --trayclose  -x --cdspeed\n"
-"  -r --cdrom  -s --scsi	 -f --floppy\n"
-"  -q --tape   -n --noop	 -V --version\n"
+"  -r --cdrom"
+#ifdef HAVE_EJECT_SCSI
+"  -s --scsi"
+#endif
+#ifdef HAVE_EJECT_FLOPPY
+"  -f --floppy"
+#endif
+#ifdef HAVE_EJECT_TAPE
+"  -q --tape"
+#endif
+"\n"
+"-n --noop	 -V --version\n"
 "  -p --proc   -m --no-unmount\n"));
 #endif /* GETOPTLONG */
 	fprintf(stderr,_(
@@ -404,9 +430,13 @@
 /* Set or clear auto-eject mode. */
 static void AutoEject(int fd, int onOff)
 {
-	int status;
+	int status = -1;
 
+#ifdef CDROMEJECT_SW
 	status = ioctl(fd, CDROMEJECT_SW, onOff);
+#else
+	errno = ENOSYS;
+#endif
 	if (status != 0) {
 		fprintf(stderr, _("%s: CD-ROM auto-eject command failed: %s\n"), programName, strerror(errno));
 		exit(1);
@@ -447,8 +477,12 @@
 {
 	int status;
 
-#ifdef CDROMCLOSETRAY
+#if defined(CDROMCLOSETRAY) || defined(CDIOCCLOSE)
+#if defined(CDROMCLOSETRAY)
 	status = ioctl(fd, CDROMCLOSETRAY);
+#elif defined(CDIOCCLOSE)
+	status = ioctl(fd, CDIOCCLOSE);
+#endif
 	if (status != 0) {
 		fprintf(stderr, _("%s: CD-ROM tray close command failed: %s\n"), programName, strerror(errno));
 		exit(1);
@@ -485,12 +519,21 @@
  */
 static int EjectCdrom(int fd)
 {
-	int status;
+	int status = -1;
 
+#if defined(CDROMEJECT)
 	status = ioctl(fd, CDROMEJECT);
+#elif defined(CDIOCEJECT)
+	status = ioctl(fd, CDIOCEJECT);
+#else
+/* Some kernels implement cdrom-eject only, but I don't think any kernel in the
+   world would implement eject only for non-cdrom drives.  Let's die. */
+# error
+#endif
 	return (status == 0);
 }
 
+#ifdef HAVE_EJECT_SCSI
 /*
  * Eject using SCSI SG_IO commands. Return 1 if successful, 0 otherwise.
  */
@@ -538,8 +581,10 @@
 	status = ioctl(fd, BLKRRPART);
 	return 1;
 }
+#endif
 
 
+#ifdef HAVE_EJECT_FLOPPY
 /*
  * Eject using FDEJECT ioctl. Return 1 if successful, 0 otherwise.
  */
@@ -550,8 +595,10 @@
 	status = ioctl(fd, FDEJECT);
 	return (status >= 0);
 }
+#endif
 
 
+#ifdef HAVE_EJECT_TAPE
 /*
  * Eject using tape ioctl. Return 1 if successful, 0 otherwise.
  */
@@ -565,6 +612,7 @@
 	status = ioctl(fd, MTIOCTOP, &op);
 	return (status >= 0);
 }
+#endif
 
 
 /* Unmount a device. */
@@ -576,10 +624,10 @@
 	  case 0: /* child */
 		  setuid(getuid()); /* reduce likelyhood of security holes when running setuid */
 		  if(p_option)
-			  execl("/bin/umount", "/bin/umount", fullName, "-n", NULL);
+			  execlp("umount", "umount", fullName, "-n", NULL);
 		  else
-			  execl("/bin/umount", "/bin/umount", fullName, NULL);
-		  fprintf(stderr, _("%s: unable to exec /bin/umount of `%s': %s\n"),
+			  execlp("umount", "umount", fullName, NULL);
+		  fprintf(stderr, _("%s: unable to exec umount of `%s': %s\n"),
 				  programName, fullName, strerror(errno));
 		  exit(1);
 		  break;
@@ -624,7 +672,7 @@
 	if (min) *min = -1;
 	if (stat(name, &sstat) == -1)
 		return -1;
-	if (! S_ISBLK(sstat.st_mode))
+	if (! S_ISBLK(sstat.st_mode) && ! S_ISCHR(sstat.st_mode))
 		return -1;
 	if (maj) *maj = major(sstat.st_rdev);
 	if (min) *min = minor(sstat.st_rdev);
@@ -1042,6 +1090,7 @@
 		}
 	}
 
+#ifdef HAVE_EJECT_SCSI
 	if (s_option && !worked) {
 		if (v_option)
 			printf(_("%s: trying to eject `%s' using SCSI commands\n"), programName, deviceName);
@@ -1053,7 +1102,9 @@
 				printf(_("%s: SCSI eject failed\n"), programName);
 		}
 	}
+#endif
 
+#ifdef HAVE_EJECT_FLOPPY
 	if (f_option && !worked) {
 		if (v_option)
 			printf(_("%s: trying to eject `%s' using floppy eject command\n"), programName, deviceName);
@@ -1065,7 +1116,9 @@
 				printf(_("%s: floppy eject command failed\n"), programName);
 		}
 	}
+#endif
 
+#ifdef HAVE_EJECT_TAPE
 	if (q_option && !worked) {
 		if (v_option)
 			printf(_("%s: trying to eject `%s' using tape offline command\n"), programName, deviceName);
@@ -1077,6 +1130,7 @@
 				printf(_("%s: tape offline command failed\n"), programName);
 		}
 	}
+#endif
 
 	if (!worked) {
 		fprintf(stderr, _("%s: unable to eject, last error: %s\n"), programName, strerror(errno));
diff -u eject-2.0.13deb/debian/rules eject-2.0.13deb/debian/rules
--- eject-2.0.13deb/debian/rules
+++ eject-2.0.13deb/debian/rules
@@ -17,13 +17,21 @@
 CFLAGS += -Os -fomit-frame-pointer
 endif
 
+DEB_HOST_ARCH_OS	?= $(shell dpkg-architecture -qDEB_HOST_ARCH_OS)
+DEB_HOST_GNU_TYPE	?= $(shell dpkg-architecture -qDEB_HOST_GNU_TYPE)
+DEB_BUILD_GNU_TYPE	?= $(shell dpkg-architecture -qDEB_BUILD_GNU_TYPE)
+
+ifeq ($(DEB_HOST_ARCH_OS), kfreebsd)
+cdrom		=	--enable-default-device=acd0
+endif
+
 deb_dir		=	debian/eject
 udeb_dir	=	debian/eject-udeb
 build_dirs	=	$(deb_dir) $(udeb_dir)
 
 build:
 	dh_testdir
-	./configure --prefix=/usr
+	./configure --prefix=/usr --host=$(DEB_HOST_GNU_TYPE) --build=$(DEB_BUILD_GNU_TYPE) $(cdrom)
 	$(MAKE) AM_CFLAGS= CFLAGS="$(CFLAGS)"
 	touch build
 

Reply via email to