]> git.ipfire.org Git - people/amarx/ipfire-3.x.git/blob - eject/patches/eject-2.1.5-lock.patch
Move all packages to root.
[people/amarx/ipfire-3.x.git] / eject / patches / eject-2.1.5-lock.patch
1 eject.1 | 13 +++++++++++--
2 eject.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++--
3 2 files changed, 63 insertions(+), 4 deletions(-)
4
5 diff --git a/eject.1 b/eject.1
6 index 3c388c6..315dc6d 100644
7 --- a/eject.1
8 +++ b/eject.1
9 @@ -17,6 +17,8 @@ eject [\-vn] \-a on|off|1|0 [<name>]
10 .br
11 eject [\-vn] \-c slot [<name>]
12 .br
13 +eject [\-vn] \-i on|off|1|0 [<name>]
14 +.br
15 eject [\-vn] \-t [<name>]
16 .br
17 eject [\-vn] \-T [<name>]
18 @@ -83,6 +85,13 @@ for a change request to work. Please also note that the first slot of
19 the changer is referred to as 0, not 1.
20
21 .TP 0.5i
22 +.B \-i on|1|off|0
23 +This option controls locking of the hardware eject button. When
24 +enabled, the drive will not be ejected when the button is pressed.
25 +This is useful when you are carrying a laptop in a bag or case and
26 +don't want it to eject if the button is inadvertently pressed.
27 +
28 +.TP 0.5i
29 .B \-t
30 With this option the drive is given a CD-ROM tray close command. Not
31 all devices support this command.
32 @@ -121,8 +130,8 @@ performed.
33 .B \-r
34 This option specifies that the drive should be ejected using a
35 CDROM eject command.
36 -.TP 0.5i
37
38 +.TP 0.5i
39 .B \-s
40 This option specifies that the drive should be ejected using
41 SCSI commands.
42 @@ -145,7 +154,7 @@ also passes the \-n option to umount(1).
43 .TP 0.5i
44 .B \-m
45 This option allows eject to work with device drivers which automatically
46 -mount removable media and therefore must be always mount()ed.
47 +mount removable media and therefore must be always mount(1)ed.
48 The option tells eject to not try to unmount the given device,
49 even if it is mounted according to /etc/mtab or /proc/mounts.
50
51 diff --git a/eject.c b/eject.c
52 index f7b2a2e..4175756 100644
53 --- a/eject.c
54 +++ b/eject.c
55 @@ -116,6 +116,7 @@ int d_option = 0;
56 int f_option = 0;
57 int h_option = 0;
58 int n_option = 0;
59 +int i_option = 0;
60 int q_option = 0;
61 int r_option = 0;
62 int s_option = 0;
63 @@ -129,6 +130,7 @@ int m_option = 0;
64 int a_arg = 0;
65 int c_arg = 0;
66 int x_arg = 0;
67 +int i_arg = 0;
68 static char *programName; /* used in error messages */
69
70 /*
71 @@ -163,6 +165,7 @@ static void usage()
72 " eject [-vn] -c <slot> [<name>] -- switch discs on a CD-ROM changer\n"
73 " eject [-vn] -t [<name>] -- close tray\n"
74 " eject [-vn] -T [<name>] -- toggle tray\n"
75 +" eject [-vn] -i on|off|1|0 [<name>] -- toggle manual eject protection on/off\n"
76 " eject [-vn] -x <speed> [<name>] -- set CD-ROM max speed\n"
77 " eject [-vn] -X [<name>] -- list CD-ROM available speeds\n"
78 "Options:\n"
79 @@ -200,7 +203,7 @@ static void usage()
80 #endif
81 "\n"
82 " -n --noop -V --version\n"
83 -" -p --proc -m --no-unmount -T --traytoggle\n"));
84 +" -p --proc -m --no-unmount -T --traytoggle -i --manualeject\n"));
85 #endif /* GETOPTLONG */
86 fprintf(stderr,_(
87 "Parameter <name> can be a device file or a mount point.\n"
88 @@ -214,7 +217,7 @@ static void usage()
89 /* Handle command line options. */
90 static void parse_args(int argc, char **argv, char **device)
91 {
92 - const char *flags = "a:c:x:dfhnqrstTXvVpm";
93 + const char *flags = "a:c:x:i:dfhnqrstTXvVpm";
94 #ifdef GETOPTLONG
95 static struct option long_options[] =
96 {
97 @@ -223,6 +226,7 @@ static void parse_args(int argc, char **argv, char **device)
98 {"default", no_argument, NULL, 'd'},
99 {"auto", required_argument, NULL, 'a'},
100 {"changerslot", required_argument, NULL, 'c'},
101 + {"manualeject", required_argument, NULL, 'i'},
102 {"trayclose", no_argument, NULL, 't'},
103 {"traytoggle", no_argument, NULL, 'T'},
104 {"cdspeed", required_argument, NULL, 'x'},
105 @@ -297,6 +301,21 @@ static void parse_args(int argc, char **argv, char **device)
106 usage();
107 exit(0);
108 break;
109 + case 'i':
110 + i_option = 1;
111 + if (!strcmp(optarg, "0"))
112 + i_arg = 0;
113 + else if (!strcmp(optarg, "off"))
114 + i_arg = 0;
115 + else if (!strcmp(optarg, "1"))
116 + i_arg = 1;
117 + else if (!strcmp(optarg, "on"))
118 + i_arg = 1;
119 + else {
120 + fprintf(stderr, _("%s: invalid argument to -i option\n"), programName);
121 + exit(1);
122 + }
123 + break;
124 case 'm':
125 m_option = 1;
126 break;
127 @@ -482,6 +501,30 @@ static char *FindDevice(const char *name)
128 }
129
130
131 +/*
132 + * Stops CDROM from opening on manual eject pressing the button.
133 + * This can be useful when you carry your laptop
134 + * in your bag while it's on and no CD inserted in it's drive.
135 + * Implemented as found in Documentation/ioctl/cdrom.txt
136 + *
137 + * TODO: Maybe we should check this also:
138 + * EDRIVE_CANT_DO_THIS Door lock function not supported.
139 + * EBUSY Attempt to unlock when multiple users
140 + * have the drive open and not CAP_SYS_ADMIN
141 + */
142 +static void ManualEject(int fd, int onOff)
143 +{
144 + if (ioctl(fd, CDROM_LOCKDOOR, onOff) < 0) {
145 + perror("ioctl on CDROM_LOCKDOOR");
146 + } else {
147 + if (onOff)
148 + printf("CD-Drive may NOT be ejected with device button\n");
149 + else
150 + printf("CD-Drive may be ejected with device button\n");
151 + }
152 +}
153 +
154 +
155 /* Set or clear auto-eject mode. */
156 static void AutoEject(int fd, int onOff)
157 {
158 @@ -1233,6 +1276,13 @@ int main(int argc, char **argv)
159 exit(0);
160 }
161
162 + /* handle -i option */
163 + if (i_option) {
164 + fd = OpenDevice(deviceName);
165 + ManualEject(fd, i_arg);
166 + exit(0);
167 + }
168 +
169 /* handle -a option */
170 if (a_option) {
171 if (v_option) {