annotate toys/other/eject.c @ 1161:9dc339b4ac2c draft

Clean up half-finished blkid.test.
author Rob Landley <rob@landley.net>
date Mon, 23 Dec 2013 07:37:36 -0600
parents 9310246414a2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
946
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
1 /* eject.c - eject device.
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
2 *
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
3 * Copyright 2012 Harvind Singh <harvindsingh1981@gmail.com>
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
4 * Copyright 2013 Kyungwan Han <asura321@gamil.com>
947
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
5 *
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
6 * No standard.
946
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
7
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
8 USE_EJECT(NEWTOY(eject, ">1stT[!tT]", TOYFLAG_USR|TOYFLAG_BIN))
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
9
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
10 config EJECT
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
11 bool "eject"
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
12 default y
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
13 help
947
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
14 usage: eject [-stT] [DEVICE]
946
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
15
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
16 Eject DEVICE or default /dev/cdrom
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
17
947
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
18 -s SCSI device
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
19 -t Close tray
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
20 -T Open/close tray (toggle).
946
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
21 */
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
22
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
23 #define FOR_eject
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
24 #include "toys.h"
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
25 #include <scsi/sg.h>
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
26 #include <scsi/scsi.h>
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
27
947
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
28 // The SCSI way of requesting eject
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
29 static void remove_scsi(int fd)
946
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
30 {
947
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
31 unsigned i;
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
32 sg_io_hdr_t *header = (sg_io_hdr_t *)(toybuf+64);
946
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
33 char sg_driver_cmd[3][6] = {
947
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
34 { ALLOW_MEDIUM_REMOVAL, 0, 0, 0, 0, 0 },
946
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
35 { START_STOP, 0, 0, 0, 1, 0 }, //start the motor
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
36 { START_STOP, 0, 0, 0, 2, 0 } //eject the media
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
37 };
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
38
947
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
39 header->interface_id = 'S';
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
40 header->cmd_len = 6;
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
41 header->mx_sb_len = 32;
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
42 header->dxfer_direction = SG_DXFER_NONE;
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
43 header->dxferp = toybuf + 32;
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
44 header->sbp = (void *)toybuf;
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
45 header->timeout = 2000;
946
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
46
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
47 for (i = 0; i < 3; i++) {
947
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
48 header->cmdp = (void *)sg_driver_cmd[i];
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
49 xioctl(fd, SG_IO, (void *)header);
946
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
50 }
947
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
51
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
52 // force kernel to reread partition table when new disc is inserted
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
53 ioctl(fd, BLKRRPART);
946
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
54 }
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
55
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
56 /*
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
57 * eject main function.
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
58 */
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
59 void eject_main(void)
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
60 {
947
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
61 int fd, out = 0;
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
62 char *device_name = "/dev/cdrom";
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
63
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
64 if (*toys.optargs) device_name = *toys.optargs;
946
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
65
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
66 fd = xopen(device_name, O_RDONLY | O_NONBLOCK);
947
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
67 if (!toys.optflags) xioctl(fd, 0x5309, &out); // CDROM_EJECT
946
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
68 else if (toys.optflags & FLAG_s) remove_scsi(fd);
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
69 else {
947
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
70 if ((toys.optflags & FLAG_T) || (toys.optflags & FLAG_t)) {
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
71 int rc = ioctl(fd, 0x5326, &out); // CDROM_DRIVE_STATUS
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
72 if ((toys.optflags & FLAG_t) || rc == 2) // CDS_TRAY_OPEN
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
73 xioctl(fd, 0x5319, &out); // CDROM_CLOSE_TRAY
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
74 else xioctl(fd, 0x5309, &out); // CDROM_EJECT
946
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
75 }
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
76 }
947
9310246414a2 Eject cleanups.
Rob Landley <rob@landley.net>
parents: 946
diff changeset
77 if (CFG_TOYBOX_FREE) xclose(fd);
946
b8ab0a8f8cef Eject, by Kyungwan Han.
Rob Landley <rob@landley.net>
parents:
diff changeset
78 }