These should have been part of 15767 too.
[oweals/busybox.git] / miscutils / eject.c
1 /* vi: set sw=4 ts=4: */
2 /*
3  * eject implementation for busybox
4  *
5  * Copyright (C) 2004  Peter Willis <psyphreak@phreaker.net>
6  * Copyright (C) 2005  Tito Ragusa <farmatito@tiscali.it>
7  *
8  * Licensed under the GPL v2 or later, see the file LICENSE in this tarball.
9  */
10
11 /*
12  * This is a simple hack of eject based on something Erik posted in #uclibc.
13  * Most of the dirty work blatantly ripped off from cat.c =)
14  */
15
16 #include "busybox.h"
17 #include <mntent.h>
18
19 /* various defines swiped from linux/cdrom.h */
20 #define CDROMCLOSETRAY            0x5319  /* pendant of CDROMEJECT  */
21 #define CDROMEJECT                0x5309  /* Ejects the cdrom media */
22 #define DEFAULT_CDROM             "/dev/cdrom"
23
24 int eject_main(int argc, char **argv)
25 {
26         unsigned long flags;
27         char *device;
28         struct mntent *m;
29
30         flags = bb_getopt_ulflags(argc, argv, "t");
31         device = argv[optind] ? : DEFAULT_CDROM;
32
33         if ((m = find_mount_point(device, bb_path_mtab_file))) {
34                 if (umount(m->mnt_dir)) {
35                         bb_error_msg_and_die("Can't umount");
36                 } else if (ENABLE_FEATURE_MTAB_SUPPORT) {
37                         erase_mtab(m->mnt_fsname);
38                 }
39         }
40         if (ioctl(xopen(device, (O_RDONLY | O_NONBLOCK)),
41                                 (flags ? CDROMCLOSETRAY : CDROMEJECT))) {
42                 bb_perror_msg_and_die("%s", device);
43         }
44         return (EXIT_SUCCESS);
45 }