eject: add --manualeject from fedora

Signed-off-by: Karel Zak <kzak@redhat.com>
This commit is contained in:
Karel Zak 2012-03-27 17:09:12 +02:00
parent 7ec1eca8b9
commit 0bcfb4891b
2 changed files with 51 additions and 1 deletions

View File

@ -17,6 +17,8 @@ eject [\-vn] \-a on|off|1|0 [<name>]
.br
eject [\-vn] \-c slot [<name>]
.br
eject [\-vn] \-i on|off|1|0 [<name>]
.br
eject [\-vn] \-t [<name>]
.br
eject [-vn] -T [<name>]
@ -80,6 +82,13 @@ CD-ROM drive can not be in use (mounted data CD or playing a music CD)
for a change request to work. Please also note that the first slot of
the changer is referred to as 0, not 1.
.TP 0.5i
.B \-i on|1|off|0
This option controls locking of the hardware eject button. When
enabled, the drive will not be ejected when the button is pressed.
This is useful when you are carrying a laptop in a bag or case and
don't want it to eject if the button is inadvertently pressed.
.TP 0.5i
.B \-t
With this option the drive is given a CD-ROM tray close command. Not

View File

@ -75,7 +75,9 @@ static int v_option;
static int x_option;
static int p_option;
static int m_option;
static int i_option;
static int a_arg;
static int i_arg;
static long int c_arg;
static long int x_arg;
@ -136,6 +138,7 @@ static void __attribute__ ((__noreturn__)) usage(FILE * out)
" -d, --default display default device\n"
" -a, --auto turn auto-eject feature on or off\n"
" -c, --changerslot switch discs on a CD-ROM changer\n"
" -i, --manualeject <on|off> toggle manual eject protection on/off\n"
" -t, --trayclose close tray\n"
" -T, --traytoggle toggle tray\n"
" -x, --cdspeed set CD-ROM max speed\n"
@ -166,6 +169,7 @@ static void parse_args(int argc, char **argv, char **device)
{"default", no_argument, NULL, 'd'},
{"auto", required_argument, NULL, 'a'},
{"changerslot", required_argument, NULL, 'c'},
{"manualeject", required_argument, NULL, 'i'},
{"trayclose", no_argument, NULL, 't'},
{"traytoggle", no_argument, NULL, 'T'},
{"cdspeed", required_argument, NULL, 'x'},
@ -182,7 +186,7 @@ static void parse_args(int argc, char **argv, char **device)
int c;
while ((c = getopt_long(argc, argv,
"a:c:x:dfhnqrstTvVpm", long_opts, NULL)) != -1) {
"a:c:i:x:dfhnqrstTvVpm", long_opts, NULL)) != -1) {
switch (c) {
case 'a':
a_option = 1;
@ -210,6 +214,15 @@ static void parse_args(int argc, char **argv, char **device)
case 'h':
usage(stdout);
break;
case 'i':
i_option = 1;
if (!strcmp(optarg, "0") || !strcmp(optarg, "off"))
i_arg = 0;
else if (!strcmp(optarg, "1") || !strcmp(optarg, "on"))
i_arg = 1;
else
errx(EXIT_FAILURE, _("invalid argument to --manualeject/-i option"));
break;
case 'm':
m_option = 1;
break;
@ -287,6 +300,27 @@ static void auto_eject(int fd, int on)
err(EXIT_FAILURE, _("CD-ROM auto-eject command failed"));
}
/*
* Stops CDROM from opening on manual eject pressing the button.
* This can be useful when you carry your laptop
* in your bag while it's on and no CD inserted in it's drive.
* Implemented as found in Documentation/ioctl/cdrom.txt
*
* TODO: Maybe we should check this also:
* EDRIVE_CANT_DO_THIS Door lock function not supported.
* EBUSY Attempt to unlock when multiple users
* have the drive open and not CAP_SYS_ADMIN
*/
static void manual_eject(int fd, int on)
{
if (ioctl(fd, CDROM_LOCKDOOR, on) < 0)
err(EXIT_FAILURE, _("CD-ROM lock door command failed"));
if (on)
info(_("CD-Drive may NOT be ejected with device button"));
else
info(_("CD-Drive may be ejected with device button"));
}
/*
* Changer select. CDROM_SELECT_DISC is preferred, older kernels used
@ -717,6 +751,13 @@ int main(int argc, char **argv)
exit(0);
}
/* handle -i option */
if (i_option) {
fd = open_device(device);
manual_eject(fd, i_arg);
exit(0);
}
/* handle -a option */
if (a_option) {
if (a_arg)