Tito pointed out I'd broken -t (argv[optind] can't be before getulflags),
authorRob Landley <rob@landley.net>
Sun, 15 May 2005 01:32:47 +0000 (01:32 -0000)
committerRob Landley <rob@landley.net>
Sun, 15 May 2005 01:32:47 +0000 (01:32 -0000)
and replaced the use of system() (and resulting security implications).

miscutils/eject.c

index df275d74bb1502f9d22d3ba5e747e2b11b7b1fdf..8864687e45d6303ce3daf0e7e568e5b3b16d5f76 100644 (file)
@@ -26,8 +26,9 @@
 
 #include <fcntl.h>
 #include <sys/ioctl.h>
-#include <stdlib.h>
 #include <unistd.h>
+#include <sys/mount.h>
+#include <mntent.h> 
 #include "busybox.h"
 
 /* various defines swiped from linux/cdrom.h */
 #define CDROMEJECT                0x5309  /* Ejects the cdrom media */
 #define DEFAULT_CDROM             "/dev/cdrom"
 
-#ifdef CONFIG_FEATURE_MTAB_SUPPORT
-#define MTAB  CONFIG_FEATURE_MTAB_FILENAME
-#else
-#define MTAB  "/proc/mounts"
-#endif
-
 extern int eject_main(int argc, char **argv)
 {
        unsigned long flags;
-       char * command; 
-       char *device=argv[optind] ? : DEFAULT_CDROM;
+       char *device;
+       struct mntent *m;
        
        flags = bb_getopt_ulflags(argc, argv, "t");
-       bb_xasprintf(&command, "umount '%s'", device);
-       
-       /* validate input before calling system */
-       if(find_mount_point(device, MTAB))
-               system(command);
+       device=argv[optind] ? : DEFAULT_CDROM;
        
+       if((m = find_mount_point(device, bb_path_mtab_file))) {
+               if(umount(m->mnt_dir))
+                       bb_error_msg_and_die("Can't umount");
+#ifdef CONFIG_FEATURE_MTAB_SUPPORT
+               else
+                       erase_mtab(m->mnt_fsname);      
+#endif
+       }
        if (ioctl(bb_xopen( device, 
                           (O_RDONLY | O_NONBLOCK)), 
                  ( flags ? CDROMCLOSETRAY : CDROMEJECT)))
        {
                bb_perror_msg_and_die(device);
        }
-#ifdef CONFIG_FEATURE_CLEAN_UP 
-       free(command);
-#endif
        return(EXIT_SUCCESS);
 }