1*cf5a6c84SAndroid Build Coastguard Worker /* eject.c - eject device.
2*cf5a6c84SAndroid Build Coastguard Worker *
3*cf5a6c84SAndroid Build Coastguard Worker * Copyright 2012 Harvind Singh <[email protected]>
4*cf5a6c84SAndroid Build Coastguard Worker * Copyright 2013 Kyungwan Han <[email protected]>
5*cf5a6c84SAndroid Build Coastguard Worker *
6*cf5a6c84SAndroid Build Coastguard Worker * No standard.
7*cf5a6c84SAndroid Build Coastguard Worker
8*cf5a6c84SAndroid Build Coastguard Worker USE_EJECT(NEWTOY(eject, ">1stT[!tT]", TOYFLAG_USR|TOYFLAG_BIN))
9*cf5a6c84SAndroid Build Coastguard Worker
10*cf5a6c84SAndroid Build Coastguard Worker config EJECT
11*cf5a6c84SAndroid Build Coastguard Worker bool "eject"
12*cf5a6c84SAndroid Build Coastguard Worker default y
13*cf5a6c84SAndroid Build Coastguard Worker help
14*cf5a6c84SAndroid Build Coastguard Worker usage: eject [-stT] [DEVICE]
15*cf5a6c84SAndroid Build Coastguard Worker
16*cf5a6c84SAndroid Build Coastguard Worker Eject DEVICE or default /dev/cdrom
17*cf5a6c84SAndroid Build Coastguard Worker
18*cf5a6c84SAndroid Build Coastguard Worker -s SCSI device
19*cf5a6c84SAndroid Build Coastguard Worker -t Close tray
20*cf5a6c84SAndroid Build Coastguard Worker -T Open/close tray (toggle)
21*cf5a6c84SAndroid Build Coastguard Worker */
22*cf5a6c84SAndroid Build Coastguard Worker
23*cf5a6c84SAndroid Build Coastguard Worker #define FOR_eject
24*cf5a6c84SAndroid Build Coastguard Worker #include "toys.h"
25*cf5a6c84SAndroid Build Coastguard Worker #include <scsi/sg.h>
26*cf5a6c84SAndroid Build Coastguard Worker #include <scsi/scsi.h>
27*cf5a6c84SAndroid Build Coastguard Worker #include <linux/cdrom.h>
28*cf5a6c84SAndroid Build Coastguard Worker
29*cf5a6c84SAndroid Build Coastguard Worker // SCSI's overcomplicated way of requesting eject
remove_scsi(int fd)30*cf5a6c84SAndroid Build Coastguard Worker static void remove_scsi(int fd)
31*cf5a6c84SAndroid Build Coastguard Worker {
32*cf5a6c84SAndroid Build Coastguard Worker unsigned i;
33*cf5a6c84SAndroid Build Coastguard Worker sg_io_hdr_t *header = (sg_io_hdr_t *)(toybuf+64);
34*cf5a6c84SAndroid Build Coastguard Worker char sg_driver_cmd[][6] = {
35*cf5a6c84SAndroid Build Coastguard Worker { ALLOW_MEDIUM_REMOVAL, 0, 0, 0, 0, 0 },
36*cf5a6c84SAndroid Build Coastguard Worker { START_STOP, 0, 0, 0, 1, 0 }, //start the motor
37*cf5a6c84SAndroid Build Coastguard Worker { START_STOP, 0, 0, 0, 2, 0 } //eject the media
38*cf5a6c84SAndroid Build Coastguard Worker };
39*cf5a6c84SAndroid Build Coastguard Worker
40*cf5a6c84SAndroid Build Coastguard Worker header->interface_id = 'S';
41*cf5a6c84SAndroid Build Coastguard Worker header->cmd_len = 6;
42*cf5a6c84SAndroid Build Coastguard Worker header->mx_sb_len = 32;
43*cf5a6c84SAndroid Build Coastguard Worker header->dxfer_direction = SG_DXFER_NONE;
44*cf5a6c84SAndroid Build Coastguard Worker header->dxferp = toybuf + 32;
45*cf5a6c84SAndroid Build Coastguard Worker header->sbp = (void *)toybuf;
46*cf5a6c84SAndroid Build Coastguard Worker header->timeout = 2000;
47*cf5a6c84SAndroid Build Coastguard Worker
48*cf5a6c84SAndroid Build Coastguard Worker for (i = 0; i < ARRAY_LEN(sg_driver_cmd); i++) {
49*cf5a6c84SAndroid Build Coastguard Worker header->cmdp = (void *)sg_driver_cmd[i];
50*cf5a6c84SAndroid Build Coastguard Worker xioctl(fd, SG_IO, header);
51*cf5a6c84SAndroid Build Coastguard Worker }
52*cf5a6c84SAndroid Build Coastguard Worker
53*cf5a6c84SAndroid Build Coastguard Worker // force kernel to reread partition table when new disc is inserted
54*cf5a6c84SAndroid Build Coastguard Worker ioctl(fd, BLKRRPART);
55*cf5a6c84SAndroid Build Coastguard Worker }
56*cf5a6c84SAndroid Build Coastguard Worker
eject_main(void)57*cf5a6c84SAndroid Build Coastguard Worker void eject_main(void)
58*cf5a6c84SAndroid Build Coastguard Worker {
59*cf5a6c84SAndroid Build Coastguard Worker int fd = xopen(*toys.optargs ? : "/dev/cdrom", O_RDONLY | O_NONBLOCK);
60*cf5a6c84SAndroid Build Coastguard Worker
61*cf5a6c84SAndroid Build Coastguard Worker if (FLAG(s)) remove_scsi(fd);
62*cf5a6c84SAndroid Build Coastguard Worker else if (FLAG(T) && CDS_TRAY_OPEN == ioctl(fd, CDROM_DRIVE_STATUS, toybuf))
63*cf5a6c84SAndroid Build Coastguard Worker xioctl(fd, CDROMCLOSETRAY, toybuf);
64*cf5a6c84SAndroid Build Coastguard Worker else xioctl(fd, CDROMEJECT, toybuf);
65*cf5a6c84SAndroid Build Coastguard Worker if (CFG_TOYBOX_FREE) xclose(fd);
66*cf5a6c84SAndroid Build Coastguard Worker }
67