Add -L and -U options to eject(1) that call DIOCLOCK. Also generally clean
stuff up, correct the usage message and update the manpage to match. Note that the new options aren't wonderfully useful, since cd(4) at least promptly unlocks the drawer when eject closes the device.
This commit is contained in:
parent
ac8c8ee3fd
commit
79931f7b04
@ -1,4 +1,4 @@
|
||||
.\" $NetBSD: eject.1,v 1.8 2001/02/27 19:05:56 cgd Exp $
|
||||
.\" $NetBSD: eject.1,v 1.9 2001/10/06 15:43:33 bjh21 Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1998 The NetBSD Foundation, Inc.
|
||||
.\" All rights reserved.
|
||||
@ -34,7 +34,7 @@
|
||||
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
.\" POSSIBILITY OF SUCH DAMAGE.
|
||||
.\"
|
||||
.Dd October 9, 1995
|
||||
.Dd October 6, 2001
|
||||
.Dt EJECT 1
|
||||
.Os
|
||||
.Sh NAME
|
||||
@ -42,10 +42,13 @@
|
||||
.Nd eject a floppy disk, cdrom or tape
|
||||
.Sh SYNOPSIS
|
||||
.Nm
|
||||
.Op Fl flnv
|
||||
.Op Fl d Ar raw-device
|
||||
.Op Fl fv
|
||||
.Op Fl l | L | U
|
||||
.Op Fl t Ar device-type
|
||||
.Op Ar device
|
||||
.Op Fl d
|
||||
.Ar device
|
||||
.Nm ""
|
||||
.Fl n
|
||||
.Sh DESCRIPTION
|
||||
The
|
||||
.Nm
|
||||
@ -71,6 +74,12 @@ Deprecated.
|
||||
Force the eject operation without attempting to unmount any filesystems first.
|
||||
.It Fl l
|
||||
Load media in the drive (only supporded for the cdrom device type).
|
||||
.It Fl L
|
||||
Lock the media into the drive (but see
|
||||
.Sx BUGS
|
||||
below).
|
||||
.It Fl U
|
||||
Unlock the media from the drive.
|
||||
.It Fl n
|
||||
List the built-in nicknames on standard output.
|
||||
.It Fl t Ar device-type
|
||||
@ -88,3 +97,9 @@ knowledge is available.
|
||||
Display some of the actions taken on standard output.
|
||||
.El
|
||||
.Pp
|
||||
.Sh BUGS
|
||||
Most disk drivers automatically lock the media on the first open and
|
||||
unlock it on the last close, making
|
||||
.Ql eject -L
|
||||
almost useless, since when it closes the device, it gets unlocked
|
||||
again.
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: eject.c,v 1.15 2001/10/06 14:29:55 bjh21 Exp $ */
|
||||
/* $NetBSD: eject.c,v 1.16 2001/10/06 15:43:33 bjh21 Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1999 The NetBSD Foundation, Inc.
|
||||
@ -43,7 +43,7 @@ __COPYRIGHT("@(#) Copyright (c) 1999 The NetBSD Foundation, Inc.\n\
|
||||
#endif /* not lint */
|
||||
|
||||
#ifndef lint
|
||||
__RCSID("$NetBSD: eject.c,v 1.15 2001/10/06 14:29:55 bjh21 Exp $");
|
||||
__RCSID("$NetBSD: eject.c,v 1.16 2001/10/06 15:43:33 bjh21 Exp $");
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
@ -109,9 +109,12 @@ struct devtypes_s {
|
||||
{ "tape", TAPE | NOTLOADABLE },
|
||||
};
|
||||
|
||||
enum eject_op {
|
||||
OP_EJECT, OP_LOAD, OP_LOCK, OP_UNLOCK
|
||||
};
|
||||
|
||||
int verbose_f = 0;
|
||||
int umount_f = 1;
|
||||
int load_f = 0;
|
||||
|
||||
int main(int, char *[]);
|
||||
void usage(void);
|
||||
@ -119,8 +122,8 @@ char *nick2dev(char *);
|
||||
char *nick2rdev(char *);
|
||||
int guess_devtype(char *);
|
||||
char *guess_nickname(char *);
|
||||
void eject_tape(char *);
|
||||
void eject_disk(char *);
|
||||
void eject_tape(char *, enum eject_op);
|
||||
void eject_disk(char *, enum eject_op);
|
||||
void unmount_dev(char *);
|
||||
|
||||
int
|
||||
@ -130,8 +133,9 @@ main(int argc, char *argv[])
|
||||
int devtype = -1;
|
||||
int n, i;
|
||||
char *devname = NULL;
|
||||
enum eject_op op = OP_EJECT;
|
||||
|
||||
while ((ch = getopt(argc, argv, "d:flnt:v")) != -1) {
|
||||
while ((ch = getopt(argc, argv, "d:flLnt:Uv")) != -1) {
|
||||
switch (ch) {
|
||||
case 'd':
|
||||
devname = optarg;
|
||||
@ -140,7 +144,14 @@ main(int argc, char *argv[])
|
||||
umount_f = 0;
|
||||
break;
|
||||
case 'l':
|
||||
load_f = 1;
|
||||
if (op != OP_EJECT)
|
||||
usage();
|
||||
op = OP_LOAD;
|
||||
break;
|
||||
case 'L':
|
||||
if (op != OP_EJECT)
|
||||
usage();
|
||||
op = OP_LOCK;
|
||||
break;
|
||||
case 'n':
|
||||
for (n = 0; n < sizeof(nicknames) / sizeof(nicknames[0]);
|
||||
@ -159,13 +170,17 @@ main(int argc, char *argv[])
|
||||
}
|
||||
}
|
||||
if (devtype == -1)
|
||||
errx(1, "%s: unknown device type\n", optarg);
|
||||
errx(1, "%s: unknown device type", optarg);
|
||||
break;
|
||||
case 'U':
|
||||
if (op != OP_EJECT)
|
||||
usage();
|
||||
op = OP_UNLOCK;
|
||||
break;
|
||||
case 'v':
|
||||
verbose_f = 1;
|
||||
break;
|
||||
default:
|
||||
warnx("-%c: unknown switch", ch);
|
||||
usage();
|
||||
/* NOTREACHED */
|
||||
}
|
||||
@ -197,9 +212,9 @@ main(int argc, char *argv[])
|
||||
|
||||
/* XXX Tapes and disks have different ioctl's: */
|
||||
if ((devtype & TYPEMASK) == TAPE)
|
||||
eject_tape(devname);
|
||||
eject_tape(devname, op);
|
||||
else
|
||||
eject_disk(devname);
|
||||
eject_disk(devname, op);
|
||||
|
||||
if (verbose_f)
|
||||
printf("done.\n");
|
||||
@ -211,7 +226,10 @@ void
|
||||
usage(void)
|
||||
{
|
||||
|
||||
errx(1, "Usage: eject [-n][-f][-v][-l][-t type][-d] device | nickname");
|
||||
fprintf(stderr, "Usage: eject [-fv] [-l | -L | -U] "
|
||||
"[-t device-type] [-d] device\n");
|
||||
fprintf(stderr, " eject -n\n");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
int
|
||||
@ -342,7 +360,7 @@ unmount_dev(char *name)
|
||||
}
|
||||
|
||||
void
|
||||
eject_tape(char *name)
|
||||
eject_tape(char *name, enum eject_op op)
|
||||
{
|
||||
struct mtop m;
|
||||
int fd;
|
||||
@ -354,19 +372,32 @@ eject_tape(char *name)
|
||||
fd = open(dn, O_RDONLY);
|
||||
if (fd == -1)
|
||||
err(1, "open: %s", dn);
|
||||
if (verbose_f)
|
||||
printf("Ejecting %s...\n", dn);
|
||||
switch (op) {
|
||||
case OP_EJECT:
|
||||
if (verbose_f)
|
||||
printf("Ejecting %s...\n", dn);
|
||||
|
||||
m.mt_op = MTOFFL;
|
||||
m.mt_count = 0;
|
||||
if (ioctl(fd, MTIOCTOP, &m) == -1)
|
||||
err(1, "ioctl: MTIOCTOP: %s", dn);
|
||||
m.mt_op = MTOFFL;
|
||||
m.mt_count = 0;
|
||||
if (ioctl(fd, MTIOCTOP, &m) == -1)
|
||||
err(1, "ioctl: MTIOCTOP: %s", dn);
|
||||
break;
|
||||
case OP_LOAD:
|
||||
errx(1, "cannot load tapes");
|
||||
/* NOTREACHED */
|
||||
case OP_LOCK:
|
||||
errx(1, "cannot lock tapes");
|
||||
/* NOTREACHED */
|
||||
case OP_UNLOCK:
|
||||
errx(1, "cannot unlock tapes");
|
||||
/* NOTREACHED */
|
||||
}
|
||||
close(fd);
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
eject_disk(char *name)
|
||||
eject_disk(char *name, enum eject_op op)
|
||||
{
|
||||
int fd;
|
||||
char *dn;
|
||||
@ -378,13 +409,15 @@ eject_disk(char *name)
|
||||
fd = open(dn, O_RDONLY);
|
||||
if (fd == -1)
|
||||
err(1, "open: %s", dn);
|
||||
if (load_f) {
|
||||
switch (op) {
|
||||
case OP_LOAD:
|
||||
if (verbose_f)
|
||||
printf("Closing %s...\n", dn);
|
||||
|
||||
if (ioctl(fd, CDIOCCLOSE, NULL) == -1)
|
||||
err(1, "ioctl: CDIOCCLOSE: %s", dn);
|
||||
} else {
|
||||
break;
|
||||
case OP_EJECT:
|
||||
if (verbose_f)
|
||||
printf("Ejecting %s...\n", dn);
|
||||
|
||||
@ -392,11 +425,28 @@ eject_disk(char *name)
|
||||
if (umount_f == 0) {
|
||||
/* force eject, unlock the device first */
|
||||
if (ioctl(fd, DIOCLOCK, &arg) == -1)
|
||||
err(1, "ioctl: DIOCEJECT: %s", dn);
|
||||
err(1, "ioctl: DIOCLOCK: %s", dn);
|
||||
arg = 1;
|
||||
}
|
||||
if (ioctl(fd, DIOCEJECT, &arg) == -1)
|
||||
err(1, "ioctl: DIOCEJECT: %s", dn);
|
||||
break;
|
||||
case OP_LOCK:
|
||||
if (verbose_f)
|
||||
printf("Locking %s...\n", dn);
|
||||
|
||||
arg = 1;
|
||||
if (ioctl(fd, DIOCLOCK, &arg) == -1)
|
||||
err(1, "ioctl: DIOCLOCK: %s", dn);
|
||||
break;
|
||||
case OP_UNLOCK:
|
||||
if (verbose_f)
|
||||
printf("Unlocking %s...\n", dn);
|
||||
|
||||
arg = 0;
|
||||
if (ioctl(fd, DIOCLOCK, &arg) == -1)
|
||||
err(1, "ioctl: DIOCLOCK: %s", dn);
|
||||
break;
|
||||
}
|
||||
|
||||
close(fd);
|
||||
|
Loading…
Reference in New Issue
Block a user