File ziptool-1.4.0.patch of Package ziptool

--- ziptool.c	2002-08-28 05:07:36.000000000 +0200
+++ ziptool.c.new	2003-07-24 16:39:35.000000000 +0200
@@ -44,19 +44,51 @@
 
 #include <sys/ioctl.h>
 
-#include <linux/fs.h>
 #include <linux/major.h>
 
 #include <scsi/scsi.h>
 #include <scsi/scsi_ioctl.h>
 
+#include <sys/types.h>
+#include <sys/wait.h>
 
 #ifndef PROG_VERSION
 # define PROG_VERSION			"1.4.0"
 #endif
 
+#ifndef SCSI_REMOVAL_PREVENT
+#define SCSI_REMOVAL_PREVENT   1
+#endif
+#ifndef SCSI_REMOVAL_ALLOW
+#define SCSI_REMOVAL_ALLOW     0
+#endif
+
+#ifndef MAJOR
+#define MAJOR(dev)      ((dev)>>8)
+#endif
+#ifndef MINOR
+#define MINOR(dev)      ((dev) & 0xff)
+#endif
 #ifndef MNTTYPE_AUTO
-# define MNTTYPE_AUTO			"auto"
+#define MNTTYPE_AUTO                   "auto"
+#endif
+#ifndef MNTTYPE_PROC
+#define MNTTYPE_PROC                   "proc"
+#endif
+#ifndef MNTTYPE_PTS
+#define MNTTYPE_PTS                    "devpts"
+#endif
+#ifndef MNTTYPE_AUTOFS
+#define MNTTYPE_AUTOFS                 "autofs"
+#endif
+#ifndef MNTTYPE_SHM
+#define MNTTYPE_SHM                    "shm"
+#endif
+#ifndef MNTTYPE_USBDEVFS
+#define MNTTYPE_USBDEVFS               "usbdevfs"
+#endif
+#ifndef MNTTYPE_NONE
+#define MNTTYPE_NONE                   "none"
 #endif
 
 /* Patched kernels will have IOMEGA_*_PROT_MODE defined. */
@@ -90,13 +122,14 @@
  *	insensitive.
  */
 static char *jaz_models[] = {
-	"iomega  jaz 1gb",
-	"iomega  jaz 2gb",	/* ams */
+	"iomega  JAZ 1GB",
+	"iomega  JAZ 2GB",	/* correct values */
 	NULL
 };
 
 static char *zip_models[] = {
 	"Iomega  ZIP 100",
+	"Iomega  ZIP 250",
 	NULL
 };
 
@@ -161,9 +194,7 @@
 )
 {
 	int result;
-	char cmd[255];
-
-	*cmd = '\0';
+	char *a[3];
 
 	/* Generate command for mounting or unmounting. */
 	switch(oper)
@@ -180,9 +211,11 @@
 			strncat(cmd, " ", 1);
 			strncat(cmd, mnt, strlen(mnt) + 1);
  */
-                        strncpy(cmd, MOUNT_CMD, strlen(MOUNT_CMD) + 1);
-			strncat(cmd, " ", 1);
-                        strncat(cmd, mnt, strlen(mnt) + 1);
+			a[0] = MOUNT_CMD;
+			a[1] = mnt;
+			a[2] = NULL;
+			if( !fork() )
+				execve(*a, a, NULL);
 			break;
 		
 		case UMOUNT_DISK:	
@@ -193,19 +226,26 @@
 			strncat(cmd, dev, strlen(dev));
  */
 			/* Note that mnt may be NULL in this case. */
-                        strncpy(cmd, UMOUNT_CMD, strlen(UMOUNT_CMD) + 1);
-                        strncat(cmd, " ", 1);
-                        strncat(cmd, dev, strlen(dev));
+			a[0] = MOUNT_CMD;
+                        a[1] = dev;
+                        a[2] = NULL;
+                        if( !fork() )
+                                execve(*a, a, NULL);
 			break;
 	}
 
 	/* Execute mount or unmount command. */
-	result = system(cmd);
-	if(result == 0)
+	wait(&result);
+
+	if( WIFEXITED(result) )
 	{
-		if(oper == MOUNT_DISK)
+		if( !(result = WEXITSTATUS(result)) && oper == MOUNT_DISK )
 			jazip_ctrldoor(jazipfd, SCSI_REMOVAL_PREVENT);
 	}
+	else
+	{
+		result = -1;
+	}
 
 	return(result);
 }
@@ -221,31 +261,90 @@
  */
 static int jazip_check_dev(char *dev)
 {
-	FILE		*mtab_fp;
-	char		mounts[255];
+	FILE		*mtab;
 	char		**model;
 	char		scsi_signature[25];
 	int		i, jazipfd;
+        struct stat     st_dev, st_mnt;
+        struct mntent   *mnt;
 
-	/* Check to see if the device is mounted by reading
-	 * /etc/mtab
-	 */
-	if(!(mtab_fp = fopen("/etc/mtab", "r")))
-	{
-		perror("Opening /etc/mtab");
-		exit(1);
-	}
 
-	while(!feof(mtab_fp))
-	{
-		fgets(mounts, 254, mtab_fp);
-		if(strstr(mounts, dev))
-		{
-			mounted = 1;
-		}
-	}
-	fclose(mtab_fp);
+/*
+ * Get file info and check, if we have a raw SCSI disk. Conditions:
+ * -> Blockdevice
+ * -> Major is SCSI_DISK_MAJOR
+ * -> Minor is a multiple of 16 (or 0)
+ */
+        if (stat (dev, &st_dev)) {
+                (void) fprintf (stderr, "%s: stat(%s) failed: %s.\n",
+                        progname, dev, strerror (errno));
+                return (-1);
+        }
+
+        if (!S_ISBLK (st_dev.st_mode)
+#if defined SCSI_DISK0_MAJOR
+        ||  MAJOR (st_dev.st_rdev) != SCSI_DISK0_MAJOR
+#else
+        ||  MAJOR (st_dev.st_rdev) != SCSI_DISK_MAJOR
+#endif
+        ||  MINOR (st_dev.st_rdev) % 16 != 0) {
+                (void) fprintf (stderr, "%s: %s (%02d/%02d) is no raw scsi device.\n",
+                        progname, dev, (int) MAJOR (st_dev.st_rdev), (int) MINOR (st_dev.st_rdev));
+                return (-1);
+        }
+
+
+
+/*
+ * Now check if any partition of this device is already mounted (this
+ * includes checking if the device is mounted under a different name).
+ */
+        if ((mtab = setmntent (MOUNTED, "r")) == NULL) {
+                (void) fprintf (stderr, "%s: can't open %s.\n",
+                        progname, MOUNTED);
+                return (-1);
+        }
+
+        while (mnt = getmntent (mtab)) {
+                if (!strcmp (mnt->mnt_type, MNTTYPE_NFS)
+                ||  !strcmp (mnt->mnt_type, MNTTYPE_PROC)
+                ||  !strcmp (mnt->mnt_type, MNTTYPE_AUTO)
+                ||  !strcmp (mnt->mnt_type, MNTTYPE_PTS)
+                ||  !strcmp (mnt->mnt_type, MNTTYPE_AUTOFS)
+                ||  !strcmp (mnt->mnt_type, MNTTYPE_SHM)
+                ||  !strcmp (mnt->mnt_type, MNTTYPE_USBDEVFS)
+                ||  !strcmp (mnt->mnt_type, MNTTYPE_NONE)
+                ||  !strcmp (mnt->mnt_type, MNTTYPE_IGNORE))
+                        continue;
+
+                if (stat (mnt->mnt_fsname, &st_mnt)) {
+                        (void) fprintf (stderr, "%s: stat(%s) failed: %s.\n",
+                                progname, mnt->mnt_fsname, strerror (errno));
+                        (void) endmntent (mtab);
+                        return (-1);
+                }
+
+
+                if (S_ISBLK (st_mnt.st_mode)) {
+#if defined SCSI_DISK0_MAJOR
+                        if (MAJOR (st_mnt.st_rdev) == SCSI_DISK0_MAJOR
+#else
+                        if (MAJOR (st_mnt.st_rdev) == SCSI_DISK_MAJOR
+#endif
+                        &&  MINOR (st_mnt.st_rdev) >= MINOR (st_dev.st_rdev)
+                        &&  MINOR (st_mnt.st_rdev) <= MINOR (st_dev.st_rdev) + 15) {
+                                (void) fprintf (stderr, "%s: %s%d (%02d/%02d) is "
+                                        "mounted on %s.\n", progname, dev,
+                                        (int) (MINOR (st_mnt.st_rdev) - MINOR (st_dev.st_rdev)),
+                                        (int) MAJOR (st_dev.st_rdev),  (int) MINOR (st_dev.st_rdev),
+                                        mnt->mnt_dir);
+                                (void) endmntent (mtab);
+                                return (-1);
+                        }
+                }
+        }
 
+        (void) endmntent (mtab);
 
 	/* Now open the device and read its model signature. Check if
 	 * it is the one that we expect.
@@ -881,7 +980,15 @@
 	/* Got atleast 2 arguments? */
 	if(argc >= 3)
 	{
-		if((jazipfd = jazip_check_dev(argv[2])) >= 0)
+		if(!strcmp(argv[1], "-u"))
+			{
+				result = jazip_ctrlmount(
+				    0, UMOUNT_DISK,
+				    argv[2],
+				    (argc >= 4) ? argv[3] : NULL
+				);
+			}
+		else if((jazipfd = jazip_check_dev(argv[2])) >= 0)
 		{
 			if(!strcmp(argv[1], "-e"))
 			{
@@ -947,14 +1054,6 @@
 				    argv[2], argv[3]
 				);
 			}
-			else if((!strcmp(argv[1], "-u")) && (argc >= 3))
-			{
-				result = jazip_ctrlmount(
-				    jazipfd, UMOUNT_DISK,
-				    argv[2],
-				    (argc >= 4) ? argv[3] : NULL
-				);
-			}
 			else
 			{
 				jazip_usage (progname);