udev/cdrom: split out parse_argv() and help()
This commit is contained in:
parent
007cac09a2
commit
56c1a2977b
|
@ -26,6 +26,11 @@
|
||||||
#include "random-util.h"
|
#include "random-util.h"
|
||||||
#include "udev-util.h"
|
#include "udev-util.h"
|
||||||
|
|
||||||
|
static bool arg_eject = false;
|
||||||
|
static bool arg_lock = false;
|
||||||
|
static bool arg_unlock = false;
|
||||||
|
static const char *arg_node = NULL;
|
||||||
|
|
||||||
/* device info */
|
/* device info */
|
||||||
static unsigned cd_rw_nonremovable;
|
static unsigned cd_rw_nonremovable;
|
||||||
static unsigned cd_rw_removable;
|
static unsigned cd_rw_removable;
|
||||||
|
@ -990,44 +995,40 @@ static int cd_media_toc(int fd) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
static int help(void) {
|
||||||
|
printf("Usage: %s [options] <device>\n"
|
||||||
|
" -l --lock-media lock the media (to enable eject request events)\n"
|
||||||
|
" -u --unlock-media unlock the media\n"
|
||||||
|
" -e --eject-media eject the media\n"
|
||||||
|
" -d --debug print debug messages to stderr\n"
|
||||||
|
" -h --help print this help text\n"
|
||||||
|
"\n",
|
||||||
|
program_invocation_short_name);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int parse_argv(int argc, char *argv[]) {
|
||||||
static const struct option options[] = {
|
static const struct option options[] = {
|
||||||
{ "lock-media", no_argument, NULL, 'l' },
|
{ "lock-media", no_argument, NULL, 'l' },
|
||||||
{ "unlock-media", no_argument, NULL, 'u' },
|
{ "unlock-media", no_argument, NULL, 'u' },
|
||||||
{ "eject-media", no_argument, NULL, 'e' },
|
{ "eject-media", no_argument, NULL, 'e' },
|
||||||
{ "debug", no_argument, NULL, 'd' },
|
{ "debug", no_argument, NULL, 'd' },
|
||||||
{ "help", no_argument, NULL, 'h' },
|
{ "help", no_argument, NULL, 'h' },
|
||||||
{}
|
{}
|
||||||
};
|
};
|
||||||
bool eject = false;
|
int c;
|
||||||
bool lock = false;
|
|
||||||
bool unlock = false;
|
|
||||||
const char *node = NULL;
|
|
||||||
int fd = -1;
|
|
||||||
int cnt;
|
|
||||||
int rc = 0;
|
|
||||||
|
|
||||||
log_set_target(LOG_TARGET_AUTO);
|
while ((c = getopt_long(argc, argv, "deluh", options, NULL)) >= 0)
|
||||||
udev_parse_config();
|
switch (c) {
|
||||||
log_parse_environment();
|
|
||||||
log_open();
|
|
||||||
|
|
||||||
for (;;) {
|
|
||||||
int option;
|
|
||||||
|
|
||||||
option = getopt_long(argc, argv, "deluh", options, NULL);
|
|
||||||
if (option == -1)
|
|
||||||
break;
|
|
||||||
|
|
||||||
switch (option) {
|
|
||||||
case 'l':
|
case 'l':
|
||||||
lock = true;
|
arg_lock = true;
|
||||||
break;
|
break;
|
||||||
case 'u':
|
case 'u':
|
||||||
unlock = true;
|
arg_unlock = true;
|
||||||
break;
|
break;
|
||||||
case 'e':
|
case 'e':
|
||||||
eject = true;
|
arg_eject = true;
|
||||||
break;
|
break;
|
||||||
case 'd':
|
case 'd':
|
||||||
log_set_target(LOG_TARGET_CONSOLE);
|
log_set_target(LOG_TARGET_CONSOLE);
|
||||||
|
@ -1035,24 +1036,32 @@ int main(int argc, char *argv[]) {
|
||||||
log_open();
|
log_open();
|
||||||
break;
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
printf("Usage: %s [options] <device>\n"
|
return help();
|
||||||
" -l,--lock-media lock the media (to enable eject request events)\n"
|
|
||||||
" -u,--unlock-media unlock the media\n"
|
|
||||||
" -e,--eject-media eject the media\n"
|
|
||||||
" -d,--debug debug to stderr\n"
|
|
||||||
" -h,--help print this help text\n\n",
|
|
||||||
program_invocation_short_name);
|
|
||||||
goto exit;
|
|
||||||
default:
|
default:
|
||||||
rc = 1;
|
assert_not_reached("Unknown option");
|
||||||
goto exit;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
node = argv[optind];
|
arg_node = argv[optind];
|
||||||
if (!node) {
|
if (!arg_node)
|
||||||
log_error("no device");
|
return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "No device is specified.");
|
||||||
rc = 1;
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char *argv[]) {
|
||||||
|
int fd = -1;
|
||||||
|
int cnt;
|
||||||
|
int rc = 0;
|
||||||
|
int r;
|
||||||
|
|
||||||
|
log_set_target(LOG_TARGET_AUTO);
|
||||||
|
udev_parse_config();
|
||||||
|
log_parse_environment();
|
||||||
|
log_open();
|
||||||
|
|
||||||
|
r = parse_argv(argc, argv);
|
||||||
|
if (r <= 0) {
|
||||||
|
rc = r < 0;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1060,7 +1069,7 @@ int main(int argc, char *argv[]) {
|
||||||
for (cnt = 20; cnt > 0; cnt--) {
|
for (cnt = 20; cnt > 0; cnt--) {
|
||||||
struct timespec duration;
|
struct timespec duration;
|
||||||
|
|
||||||
fd = open(node, O_RDONLY|O_NONBLOCK|O_CLOEXEC);
|
fd = open(arg_node, O_RDONLY|O_NONBLOCK|O_CLOEXEC);
|
||||||
if (fd >= 0 || errno != EBUSY)
|
if (fd >= 0 || errno != EBUSY)
|
||||||
break;
|
break;
|
||||||
duration.tv_sec = 0;
|
duration.tv_sec = 0;
|
||||||
|
@ -1068,11 +1077,11 @@ int main(int argc, char *argv[]) {
|
||||||
nanosleep(&duration, NULL);
|
nanosleep(&duration, NULL);
|
||||||
}
|
}
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
log_debug("unable to open '%s'", node);
|
log_debug("unable to open '%s'", arg_node);
|
||||||
rc = 1;
|
rc = 1;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
log_debug("probing: '%s'", node);
|
log_debug("probing: '%s'", arg_node);
|
||||||
|
|
||||||
/* same data as original cdrom_id */
|
/* same data as original cdrom_id */
|
||||||
if (cd_capability_compat(fd) < 0) {
|
if (cd_capability_compat(fd) < 0) {
|
||||||
|
@ -1102,17 +1111,17 @@ int main(int argc, char *argv[]) {
|
||||||
|
|
||||||
work:
|
work:
|
||||||
/* lock the media, so we enable eject button events */
|
/* lock the media, so we enable eject button events */
|
||||||
if (lock && cd_media) {
|
if (arg_lock && cd_media) {
|
||||||
log_debug("PREVENT_ALLOW_MEDIUM_REMOVAL (lock)");
|
log_debug("PREVENT_ALLOW_MEDIUM_REMOVAL (lock)");
|
||||||
media_lock(fd, true);
|
media_lock(fd, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlock && cd_media) {
|
if (arg_unlock && cd_media) {
|
||||||
log_debug("PREVENT_ALLOW_MEDIUM_REMOVAL (unlock)");
|
log_debug("PREVENT_ALLOW_MEDIUM_REMOVAL (unlock)");
|
||||||
media_lock(fd, false);
|
media_lock(fd, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (eject) {
|
if (arg_eject) {
|
||||||
log_debug("PREVENT_ALLOW_MEDIUM_REMOVAL (unlock)");
|
log_debug("PREVENT_ALLOW_MEDIUM_REMOVAL (unlock)");
|
||||||
media_lock(fd, false);
|
media_lock(fd, false);
|
||||||
log_debug("START_STOP_UNIT (eject)");
|
log_debug("START_STOP_UNIT (eject)");
|
||||||
|
|
Loading…
Reference in New Issue