Remove libpopt.
cd-drive, cd-info: some source option bug fixes osx.c: bug in duplicate free in add-device Patches and bug fixes courtesy Peter J. Creath
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
# $Id: Makefile.am,v 1.35 2005/03/10 12:47:03 rocky Exp $
|
||||
# $Id: Makefile.am,v 1.36 2005/10/05 09:48:12 rocky Exp $
|
||||
#
|
||||
# Copyright (C) 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com>
|
||||
#
|
||||
@@ -42,42 +42,40 @@ endif
|
||||
|
||||
if BUILD_CD_DRIVE
|
||||
cd_drive_SOURCES = cd-drive.c util.c util.h
|
||||
cd_drive_LDADD = $(LIBISO9660_LIBS) $(LIBCDIO_LIBS) $(LIBPOPT_LIBS) $(LIBICONV)
|
||||
cd_drive_LDADD = $(LIBISO9660_LIBS) $(LIBCDIO_LIBS) $(LIBICONV)
|
||||
bin_cd_drive = cd-drive
|
||||
endif
|
||||
|
||||
if BUILD_CDINFO
|
||||
cd_info_SOURCES = cd-info.c cddb.c cddb.h util.c util.h
|
||||
cd_info_LDADD = $(LIBISO9660_LIBS) $(LIBCDIO_LIBS) $(LIBPOPT_LIBS) $(CDDB_LIBS) $(VCDINFO_LIBS) $(LIBICONV)
|
||||
cd_info_LDADD = $(LIBISO9660_LIBS) $(LIBCDIO_LIBS) $(CDDB_LIBS) $(VCDINFO_LIBS) $(LIBICONV)
|
||||
bin_cd_info = cd-info
|
||||
endif
|
||||
|
||||
if BUILD_CDINFO_LINUX
|
||||
cdinfo_linux_SOURCES = cdinfo-linux.c
|
||||
cdinfo_linux_LDADD = $(LIBCDIO_LIBS) $(LIBPOPT_LIBS)
|
||||
cdinfo_linux_LDADD = $(LIBCDIO_LIBS)
|
||||
bin_cdinfo_linux = cdinfo-linux
|
||||
endif
|
||||
|
||||
if BUILD_CD_READ
|
||||
cd_read_SOURCES = cd-read.c util.c util.h
|
||||
cd_read_LDADD = $(LIBISO9660_LIBS) $(LIBCDIO_LIBS) $(LIBPOPT_LIBS) $(LIBICONV)
|
||||
cd_read_LDADD = $(LIBISO9660_LIBS) $(LIBCDIO_LIBS) $(LIBICONV)
|
||||
bin_cd_read = cd-read
|
||||
endif
|
||||
|
||||
if BUILD_ISO_INFO
|
||||
iso_info_SOURCES = iso-info.c util.c util.h
|
||||
iso_info_LDADD = $(LIBISO9660_LIBS) $(LIBCDIO_LIBS) $(LIBPOPT_LIBS) $(LIBICONV)
|
||||
iso_info_LDADD = $(LIBISO9660_LIBS) $(LIBCDIO_LIBS) $(LIBICONV)
|
||||
bin_iso_info = iso-info
|
||||
endif
|
||||
|
||||
if BUILD_ISO_READ
|
||||
iso_read_SOURCES = iso-read.c util.c util.h
|
||||
iso_read_LDADD = $(LIBISO9660_LIBS) $(LIBCDIO_LIBS) $(LIBPOPT_LIBS) $(LIBICONV)
|
||||
iso_read_LDADD = $(LIBISO9660_LIBS) $(LIBCDIO_LIBS) $(LIBICONV)
|
||||
bin_iso_read = iso-read
|
||||
endif
|
||||
|
||||
bin_PROGRAMS = $(bin_cd_drive) $(bin_cd_info) $(bin_cdinfo_linux) $(bin_cd_read) $(bin_iso_info) $(bin_iso_read) $(bin_cdda_player)
|
||||
|
||||
# Put LIBPOPT_CFLAGS after local include in case LIBPOPT has headers common
|
||||
# to those in LIBCDIO_CFLAGS
|
||||
INCLUDES = -I$(top_srcdir) $(LIBCDIO_CFLAGS) $(VCDINFO_CFLAGS) $(CDDB_CFLAGS) $(LIBPOPT_CFLAGS)
|
||||
INCLUDES = -I$(top_srcdir) $(LIBCDIO_CFLAGS) $(VCDINFO_CFLAGS) $(CDDB_CFLAGS)
|
||||
|
||||
143
src/cd-drive.c
143
src/cd-drive.c
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
$Id: cd-drive.c,v 1.23 2005/04/30 10:05:11 rocky Exp $
|
||||
$Id: cd-drive.c,v 1.24 2005/10/05 09:48:12 rocky Exp $
|
||||
|
||||
Copyright (C) 2004, 2005 Rocky Bernstein <rocky@panix.com>
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
#include <getopt.h>
|
||||
#include <cdio/cdio.h>
|
||||
#include <cdio/scsi_mmc.h>
|
||||
|
||||
@@ -43,44 +44,64 @@ struct arguments
|
||||
|
||||
/* Configuration option codes */
|
||||
enum {
|
||||
OP_HANDLED,
|
||||
|
||||
OP_SOURCE_DEVICE,
|
||||
|
||||
|
||||
OP_USAGE,
|
||||
|
||||
/* These are the remaining configuration options */
|
||||
OP_VERSION,
|
||||
|
||||
};
|
||||
|
||||
/* Parse a all options. */
|
||||
/* Parse all options. */
|
||||
static bool
|
||||
parse_options (int argc, const char *argv[])
|
||||
parse_options (int argc, char *argv[])
|
||||
{
|
||||
int opt;
|
||||
|
||||
struct poptOption optionsTable[] = {
|
||||
{"debug", 'd', POPT_ARG_INT, &opts.debug_level, 0,
|
||||
"Set debugging to LEVEL"},
|
||||
|
||||
{"cdrom-device", 'i', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL,
|
||||
&source_name, OP_SOURCE_DEVICE,
|
||||
"show only info about CD-ROM device", "DEVICE"},
|
||||
|
||||
{"quiet", 'q', POPT_ARG_NONE, &opts.silent, 0,
|
||||
"Don't produce warning output" },
|
||||
|
||||
{"version", 'V', POPT_ARG_NONE, &opts.version_only, 0,
|
||||
"display version and copyright information and exit"},
|
||||
POPT_AUTOHELP {NULL, 0, 0, NULL, 0}
|
||||
const char* helpText =
|
||||
"Usage: %s [OPTION...]\n"
|
||||
" -d, --debug=INT Set debugging to LEVEL\n"
|
||||
" -i, --cdrom-device[=DEVICE] show only info about CD-ROM device\n"
|
||||
" -q, --quiet Don't produce warning output\n"
|
||||
" -V, --version display version and copyright information\n"
|
||||
" and exit\n"
|
||||
"\n"
|
||||
"Help options:\n"
|
||||
" -?, --help Show this help message\n"
|
||||
" --usage Display brief usage message\n";
|
||||
|
||||
const char* usageText =
|
||||
"Usage: %s [-d|--debug INT] [-i|--cdrom-device DEVICE] [-q|--quiet]\n"
|
||||
" [-V|--version] [-?|--help] [--usage]\n";
|
||||
|
||||
const char* optionsString = "d:i::qV?";
|
||||
struct option optionsTable[] = {
|
||||
{"debug", required_argument, NULL, 'd' },
|
||||
{"cdrom-device", optional_argument, NULL, 'i' },
|
||||
{"quiet", no_argument, NULL, 'q' },
|
||||
{"version", no_argument, NULL, 'V' },
|
||||
{"help", no_argument, NULL, '?' },
|
||||
{"usage", no_argument, NULL, OP_USAGE },
|
||||
{NULL, 0, NULL, 0 }
|
||||
};
|
||||
poptContext optCon = poptGetContext (NULL, argc, argv, optionsTable, 0);
|
||||
|
||||
program_name = strrchr(argv[0],'/');
|
||||
program_name = program_name ? strdup(program_name+1) : strdup(argv[0]);
|
||||
|
||||
while ((opt = poptGetNextOpt (optCon)) != -1) {
|
||||
while ((opt = getopt_long(argc, argv, optionsString, optionsTable, NULL)) != -1) {
|
||||
switch (opt) {
|
||||
|
||||
case OP_SOURCE_DEVICE:
|
||||
case 'd':
|
||||
opts.debug_level = atoi(optarg);
|
||||
break;
|
||||
|
||||
case 'i':
|
||||
if (opts.source_image != DRIVER_UNKNOWN) {
|
||||
/* NOTE: The libpopt version already set source_name by this time.
|
||||
To restore this behavior, fall through to the else{} block.
|
||||
*/
|
||||
report( stderr, "%s: another source type option given before.\n",
|
||||
program_name );
|
||||
report( stderr, "%s: give only one source type option.\n",
|
||||
@@ -88,44 +109,66 @@ parse_options (int argc, const char *argv[])
|
||||
break;
|
||||
} else {
|
||||
opts.source_image = DRIVER_DEVICE;
|
||||
source_name = fillout_device_name(source_name);
|
||||
if (optarg != NULL) {
|
||||
source_name = fillout_device_name(optarg);
|
||||
}
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case 'q':
|
||||
opts.silent = 1;
|
||||
break;
|
||||
|
||||
case 'V':
|
||||
opts.version_only = 1;
|
||||
break;
|
||||
|
||||
case '?':
|
||||
fprintf(stderr, helpText, program_name);
|
||||
free(program_name);
|
||||
exit(EXIT_FAILURE);
|
||||
break;
|
||||
|
||||
case OP_USAGE:
|
||||
fprintf(stderr, usageText, program_name);
|
||||
free(program_name);
|
||||
exit(EXIT_FAILURE);
|
||||
break;
|
||||
|
||||
case OP_HANDLED:
|
||||
break;
|
||||
|
||||
default:
|
||||
poptFreeContext(optCon);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
{
|
||||
const char *remaining_arg = poptGetArg(optCon);
|
||||
if ( remaining_arg != NULL) {
|
||||
if (opts.source_image != DRIVER_UNKNOWN) {
|
||||
report( stderr, "%s: Source specified in option %s and as %s\n",
|
||||
program_name, source_name, remaining_arg);
|
||||
poptFreeContext(optCon);
|
||||
free(program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
if (optind < argc) {
|
||||
const char *remaining_arg = argv[optind++];
|
||||
|
||||
/* NOTE: A bug in the libpopt version checked source_image, which
|
||||
rendered the subsequent source_image test useless.
|
||||
*/
|
||||
if (source_name != NULL) {
|
||||
report( stderr, "%s: Source specified in option %s and as %s\n",
|
||||
program_name, source_name, remaining_arg);
|
||||
free(program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (opts.source_image == DRIVER_DEVICE)
|
||||
source_name = fillout_device_name(remaining_arg);
|
||||
else
|
||||
source_name = strdup(remaining_arg);
|
||||
|
||||
if ( (poptGetArgs(optCon)) != NULL) {
|
||||
report( stderr, "%s: Source specified in previously %s and %s\n",
|
||||
program_name, source_name, remaining_arg);
|
||||
poptFreeContext(optCon);
|
||||
free(program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
|
||||
}
|
||||
if (opts.source_image == DRIVER_DEVICE)
|
||||
source_name = fillout_device_name(remaining_arg);
|
||||
else
|
||||
source_name = strdup(remaining_arg);
|
||||
|
||||
if (optind < argc) {
|
||||
report( stderr, "%s: Source specified in previously %s and %s\n",
|
||||
program_name, source_name, remaining_arg);
|
||||
free(program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
poptFreeContext(optCon);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -187,7 +230,7 @@ init(void)
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, const char *argv[])
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
CdIo_t *p_cdio=NULL;
|
||||
|
||||
|
||||
448
src/cd-info.c
448
src/cd-info.c
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
$Id: cd-info.c,v 1.144 2005/09/18 20:34:02 rocky Exp $
|
||||
$Id: cd-info.c,v 1.145 2005/10/05 09:48:12 rocky Exp $
|
||||
|
||||
Copyright (C) 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com>
|
||||
Copyright (C) 1996, 1997, 1998 Gerd Knorr <kraxel@bytesex.org>
|
||||
@@ -27,6 +27,7 @@
|
||||
#include "util.h"
|
||||
#include "cddb.h"
|
||||
#include <stdarg.h>
|
||||
#include <getopt.h>
|
||||
|
||||
#ifdef HAVE_CDDB
|
||||
#include <cddb/cddb.h>
|
||||
@@ -95,6 +96,7 @@ struct opts_s
|
||||
|
||||
/* Configuration option codes */
|
||||
enum {
|
||||
OP_HANDLED = 0,
|
||||
|
||||
OP_SOURCE_UNDEF,
|
||||
OP_SOURCE_AUTO,
|
||||
@@ -103,7 +105,15 @@ enum {
|
||||
OP_SOURCE_CDRDAO,
|
||||
OP_SOURCE_NRG ,
|
||||
OP_SOURCE_DEVICE,
|
||||
|
||||
|
||||
OP_CDDB_SERVER,
|
||||
OP_CDDB_CACHE,
|
||||
OP_CDDB_EMAIL,
|
||||
OP_CDDB_NOCACHE,
|
||||
OP_CDDB_TIMEOUT,
|
||||
|
||||
OP_USAGE,
|
||||
|
||||
/* These are the remaining configuration options */
|
||||
OP_VERSION,
|
||||
|
||||
@@ -111,236 +121,264 @@ enum {
|
||||
|
||||
char *temp_str;
|
||||
|
||||
/* Parse a all options. */
|
||||
/* Parse source options. */
|
||||
static void
|
||||
parse_source(int opt)
|
||||
{
|
||||
/* NOTE: The libpopt version made use of an extra temporary
|
||||
variable (psz_my_source) for all sources _except_ devices.
|
||||
This distinction seemed to serve no purpose.
|
||||
*/
|
||||
|
||||
if (opts.source_image != INPUT_UNKNOWN) {
|
||||
report(stderr, "%s: another source type option given before.\n",
|
||||
program_name);
|
||||
report(stderr, "%s: give only one source type option.\n",
|
||||
program_name);
|
||||
return;
|
||||
}
|
||||
|
||||
/* For all input sources which are not a DEVICE, we need to make
|
||||
a copy of the string; for a DEVICE the fill-out routine makes
|
||||
the copy.
|
||||
*/
|
||||
if (OP_SOURCE_DEVICE != opt)
|
||||
if (optarg != NULL) source_name = strdup(optarg);
|
||||
|
||||
switch (opt) {
|
||||
case OP_SOURCE_BIN:
|
||||
opts.source_image = INPUT_BIN;
|
||||
break;
|
||||
case OP_SOURCE_CUE:
|
||||
opts.source_image = INPUT_CUE;
|
||||
break;
|
||||
case OP_SOURCE_CDRDAO:
|
||||
opts.source_image = INPUT_CDRDAO;
|
||||
break;
|
||||
case OP_SOURCE_NRG:
|
||||
opts.source_image = INPUT_NRG;
|
||||
break;
|
||||
case OP_SOURCE_AUTO:
|
||||
opts.source_image = INPUT_AUTO;
|
||||
break;
|
||||
|
||||
case OP_SOURCE_DEVICE:
|
||||
opts.source_image = INPUT_DEVICE;
|
||||
if (optarg != NULL) source_name = fillout_device_name(optarg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Parse all options. */
|
||||
static bool
|
||||
parse_options (int argc, const char *argv[])
|
||||
parse_options (int argc, char *argv[])
|
||||
{
|
||||
int opt; /* used for argument parsing */
|
||||
char *psz_my_source;
|
||||
|
||||
struct poptOption optionsTable[] = {
|
||||
{"access-mode", 'a', POPT_ARG_STRING, &opts.access_mode, 0,
|
||||
"Set CD access methed"},
|
||||
|
||||
{"debug", 'd', POPT_ARG_INT, &opts.debug_level, 0,
|
||||
"Set debugging to LEVEL"},
|
||||
|
||||
{"no-tracks", 'T', POPT_ARG_NONE, &opts.no_tracks, 0,
|
||||
"Don't show track information"},
|
||||
|
||||
{"no-analyze", 'A', POPT_ARG_NONE, &opts.no_analysis, 0,
|
||||
"Don't filesystem analysis"},
|
||||
|
||||
|
||||
const char* helpText =
|
||||
"Usage: %s [OPTION...]\n"
|
||||
" -a, --access-mode=STRING Set CD access method\n"
|
||||
" -d, --debug=INT Set debugging to LEVEL\n"
|
||||
" -T, --no-tracks Don't show track information\n"
|
||||
" -A, --no-analyze Don't filesystem analysis\n"
|
||||
#ifdef HAVE_CDDB
|
||||
{"no-cddb", '\0', POPT_ARG_NONE, &opts.no_cddb, 0,
|
||||
"Don't look up audio CDDB information or print that"},
|
||||
|
||||
{"cddb-port", 'P', POPT_ARG_INT, &cddb_opts.port, 8880,
|
||||
"CDDB port number to use (default 8880)"},
|
||||
|
||||
{"cddb-http", 'H', POPT_ARG_NONE, &cddb_opts.http, 0,
|
||||
"Lookup CDDB via HTTP proxy (default no proxy)"},
|
||||
|
||||
{"cddb-server", '\0', POPT_ARG_STRING, &cddb_opts.server, 0,
|
||||
"CDDB server to contact for information (default: freedb.freedb.org)"},
|
||||
|
||||
{"cddb-cache", '\0', POPT_ARG_STRING, &cddb_opts.cachedir, 0,
|
||||
"Location of CDDB cache directory (default ~/.cddbclient)"},
|
||||
|
||||
{"cddb-email", '\0', POPT_ARG_STRING, &cddb_opts.email, 0,
|
||||
"Email address to give CDDB server (default me@home"},
|
||||
|
||||
{"no-cddb-cache", '\0', POPT_ARG_NONE, &cddb_opts.disable_cache, 0,
|
||||
"Lookup CDDB via HTTP proxy (default no proxy)"},
|
||||
|
||||
{"cddb-timeout", '\0', POPT_ARG_INT, &cddb_opts.timeout, 0,
|
||||
"CDDB timeout value in seconds (default 10 seconds)"},
|
||||
#else
|
||||
{"no-cddb", '\0', POPT_ARG_NONE, &opts.no_cddb, 0,
|
||||
"Does nothing since this program is not CDDB-enabled"},
|
||||
|
||||
{"cddb-port", 'P', POPT_ARG_INT, &cddb_opts.port, 8880,
|
||||
"Does nothing since this program is not CDDB-enabled"},
|
||||
|
||||
{"cddb-http", 'H', POPT_ARG_NONE, &cddb_opts.http, 0,
|
||||
"Does nothing since this program is not CDDB-enabled"},
|
||||
|
||||
{"cddb-server", '\0', POPT_ARG_STRING, &cddb_opts.server, 0,
|
||||
"Does nothing since this program is not CDDB-enabled"},
|
||||
|
||||
{"cddb-cache", '\0', POPT_ARG_STRING, &cddb_opts.cachedir, 0,
|
||||
"Does nothing since this program is not CDDB-enabled"},
|
||||
|
||||
{"cddb-email", '\0', POPT_ARG_STRING, &cddb_opts.email, 0,
|
||||
"Does nothing since this program is not CDDB-enabled"},
|
||||
|
||||
{"no-cddb-cache", '\0', POPT_ARG_NONE, &cddb_opts.disable_cache, 0,
|
||||
"Does nothing since this program is not CDDB-enabled"},
|
||||
|
||||
{"cddb-timeout", '\0', POPT_ARG_INT, &cddb_opts.timeout, 0,
|
||||
"Does nothing since this program is not CDDB-enabled"},
|
||||
" --no-cddb Don't look up audio CDDB information\n"
|
||||
" or print it\n"
|
||||
" -P, --cddb-port=INT CDDB port number to use (default 8880)\n"
|
||||
" -H, --cddb-http Lookup CDDB via HTTP proxy (default no\n"
|
||||
" proxy)\n"
|
||||
" --cddb-server=STRING CDDB server to contact for information\n"
|
||||
" (default: freedb.freedb.org)\n"
|
||||
" --cddb-cache=STRING Location of CDDB cache directory\n"
|
||||
" (default ~/.cddbclient)\n"
|
||||
" --cddb-email=STRING Email address to give CDDB server\n"
|
||||
" (default me@home)\n"
|
||||
" --no-cddb-cache Disable caching of CDDB entries\n"
|
||||
" locally (default caches)\n"
|
||||
" --cddb-timeout=INT CDDB timeout value in seconds\n"
|
||||
" (default 10 seconds)\n"
|
||||
#else
|
||||
" --no-cddb Does nothing since this program is not\n"
|
||||
" -P, --cddb-port=INT CDDB-enabled\n"
|
||||
" -H, --cddb-http\n"
|
||||
" --cddb-server=STRING\n"
|
||||
" --cddb-cache=STRING\n"
|
||||
" --cddb-email=STRING\n"
|
||||
" --no-cddb-cache\n"
|
||||
" --cddb-timeout=INT\n"
|
||||
#endif
|
||||
|
||||
{"no-device-info", '\0', POPT_ARG_NONE, &opts.no_device, 0,
|
||||
"Don't show device info, just CD info"},
|
||||
|
||||
{"no-disc-mode", '\0', POPT_ARG_NONE, &opts.no_disc_mode, 0,
|
||||
"Don't show disc-mode info"},
|
||||
|
||||
{"dvd", '\0', POPT_ARG_NONE, &opts.show_dvd, 0,
|
||||
"Attempt to give DVD information if a DVD is found."},
|
||||
|
||||
" --no-device-info Don't show device info, just CD info\n"
|
||||
" --no-disc-mode Don't show disc-mode info\n"
|
||||
" --dvd Attempt to give DVD information if a DVD is\n"
|
||||
" found.\n"
|
||||
#ifdef HAVE_VCDINFO
|
||||
{"no-vcd", 'v', POPT_ARG_NONE, &opts.no_vcd, 0,
|
||||
"Don't look up Video CD information"},
|
||||
#else
|
||||
{"no-vcd", 'v', POPT_ARG_NONE, &opts.no_vcd, 1,
|
||||
"Don't look up Video CD information - for this build, this is always set"},
|
||||
" -v, --no-vcd Don't look up Video CD information\n"
|
||||
#else
|
||||
" -v, --no-vcd Don't look up Video CD information - for\n"
|
||||
" this build, this is always set\n"
|
||||
#endif
|
||||
{"no-ioctl", 'I', POPT_ARG_NONE, &opts.no_ioctl, 0,
|
||||
"Don't show ioctl() information"},
|
||||
|
||||
{"bin-file", 'b', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, &psz_my_source,
|
||||
OP_SOURCE_BIN, "set \"bin\" CD-ROM disk image file as source", "FILE"},
|
||||
|
||||
{"cue-file", 'c', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, &psz_my_source,
|
||||
OP_SOURCE_CUE, "set \"cue\" CD-ROM disk image file as source", "FILE"},
|
||||
|
||||
{"nrg-file", 'N', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, &psz_my_source,
|
||||
OP_SOURCE_NRG, "set Nero CD-ROM disk image file as source", "FILE"},
|
||||
|
||||
{"toc-file", 't', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, &psz_my_source,
|
||||
OP_SOURCE_CDRDAO, "set cdrdao CD-ROM disk image file as source", "FILE"},
|
||||
|
||||
{"input", 'i', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, &psz_my_source,
|
||||
OP_SOURCE_AUTO,
|
||||
"set source and determine if \"bin\" image or device", "FILE"},
|
||||
|
||||
{"iso9660", '\0', POPT_ARG_NONE, &opts.print_iso9660, 0,
|
||||
"print directory contents of any ISO-9660 filesystems"},
|
||||
|
||||
{"cdrom-device", 'C', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, &source_name,
|
||||
OP_SOURCE_DEVICE,
|
||||
"set CD-ROM device as source", "DEVICE"},
|
||||
|
||||
{"list-drives", 'l', POPT_ARG_NONE, &opts.list_drives, 0,
|
||||
"Give a list of CD-drives" },
|
||||
|
||||
{"no-header", '\0', POPT_ARG_NONE, &opts.no_header,
|
||||
0, "Don't display header and copyright (for regression testing)"},
|
||||
" -I, --no-ioctl Don't show ioctl() information\n"
|
||||
" -b, --bin-file[=FILE] set \"bin\" CD-ROM disk image file as source\n"
|
||||
" -c, --cue-file[=FILE] set \"cue\" CD-ROM disk image file as source\n"
|
||||
" -N, --nrg-file[=FILE] set Nero CD-ROM disk image file as source\n"
|
||||
" -t, --toc-file[=FILE] set cdrdao CD-ROM disk image file as source\n"
|
||||
" -i, --input[=FILE] set source and determine if \"bin\" image or\n"
|
||||
" device\n"
|
||||
" --iso9660 print directory contents of any ISO-9660\n"
|
||||
" filesystems\n"
|
||||
" -C, --cdrom-device[=DEVICE] set CD-ROM device as source\n"
|
||||
" -l, --list-drives Give a list of CD-drives\n"
|
||||
" --no-header Don't display header and copyright (for\n"
|
||||
" regression testing)\n"
|
||||
#ifdef HAVE_JOLIET
|
||||
" --no-joliet Don't use Joliet extensions\n"
|
||||
#endif
|
||||
" --no-rock-ridge Don't use Rock-Ridge-extension information\n"
|
||||
" --no-xa Don't use XA-extension information\n"
|
||||
" -q, --quiet Don't produce warning output\n"
|
||||
" -V, --version display version and copyright information\n"
|
||||
" and exit\n"
|
||||
"\n"
|
||||
"Help options:\n"
|
||||
" -?, --help Show this help message\n"
|
||||
" --usage Display brief usage message\n";
|
||||
|
||||
const char* usageText =
|
||||
"Usage: %s [-a|--access-mode STRING] [-d|--debug INT] [-T|--no-tracks]\n"
|
||||
" [-A|--no-analyze] [--no-cddb] [-P|--cddb-port INT] [-H|--cddb-http]\n"
|
||||
" [--cddb-server=STRING] [--cddb-cache=STRING] [--cddb-email=STRING]\n"
|
||||
" [--no-cddb-cache] [--cddb-timeout=INT] [--no-device-info]\n"
|
||||
" [--no-disc-mode] [--dvd] [-v|--no-vcd] [-I|--no-ioctl]\n"
|
||||
" [-b|--bin-file FILE] [-c|--cue-file FILE] [-N|--nrg-file FILE]\n"
|
||||
" [-t|--toc-file FILE] [-i|--input FILE] [--iso9660]\n"
|
||||
" [-C|--cdrom-device DEVICE] [-l|--list-drives] [--no-header]\n"
|
||||
" [--no-joliet] [--no-rock-ridge] [--no-xa] [-q|--quiet] [-V|--version]\n"
|
||||
" [-?|--help] [--usage]\n";
|
||||
|
||||
const char* optionsString = "a:d:TAP:HvIb::c::N::t::i::C::lqV?";
|
||||
struct option optionsTable[] = {
|
||||
{"access-mode", required_argument, NULL, 'a'},
|
||||
{"debug", required_argument, NULL, 'd' },
|
||||
{"no-tracks", no_argument, NULL, 'T' },
|
||||
{"no-analyze", no_argument, NULL, 'A' },
|
||||
{"no-cddb", no_argument, &opts.no_cddb, 1 },
|
||||
{"cddb-port", required_argument, NULL, 'P' },
|
||||
{"cddb-http", no_argument, NULL, 'H' },
|
||||
{"cddb-server", required_argument, NULL, OP_CDDB_SERVER },
|
||||
{"cddb-cache", required_argument, NULL, OP_CDDB_CACHE },
|
||||
{"cddb-email", required_argument, NULL, OP_CDDB_EMAIL },
|
||||
{"no-cddb-cache", no_argument, NULL, OP_CDDB_NOCACHE },
|
||||
{"cddb-timeout", required_argument, NULL, OP_CDDB_TIMEOUT },
|
||||
{"no-device-info", no_argument, &opts.no_device, 1 },
|
||||
{"no-disc-mode", no_argument, &opts.no_disc_mode, 1 },
|
||||
{"dvd", no_argument, &opts.show_dvd, 1 },
|
||||
{"no-vcd", no_argument, NULL, 'v' },
|
||||
{"no-ioctl", no_argument, NULL, 'I' },
|
||||
{"bin-file", optional_argument, NULL, 'b' },
|
||||
{"cue-file", optional_argument, NULL, 'c' },
|
||||
{"nrg-file", optional_argument, NULL, 'N' },
|
||||
{"toc-file", optional_argument, NULL, 't' },
|
||||
{"input", optional_argument, NULL, 'i' },
|
||||
{"iso9660", no_argument, &opts.print_iso9660, 1 },
|
||||
{"cdrom-device", optional_argument, NULL, 'C' },
|
||||
{"list-drives", no_argument, NULL, 'l' },
|
||||
{"no-header", no_argument, &opts.no_header, 1 },
|
||||
#ifdef HAVE_JOLIET
|
||||
{"no-joliet", '\0', POPT_ARG_NONE, &opts.no_joliet,
|
||||
0, "Don't use Joliet extensions"},
|
||||
{"no-joliet", no_argument, &opts.no_joliet, 1 },
|
||||
#endif /*HAVE_JOLIET*/
|
||||
|
||||
{"no-rock-ridge", '\0', POPT_ARG_NONE, &opts.no_rock_ridge,
|
||||
0, "Don't use Rock-Ridge-extension information"},
|
||||
{"no-rock-ridge", no_argument, &opts.no_rock_ridge, 1 },
|
||||
{"no-xa", no_argument, &opts.no_xa, 1 },
|
||||
{"quiet", no_argument, NULL, 'q' },
|
||||
{"version", no_argument, NULL, 'V' },
|
||||
|
||||
{"no-xa", '\0', POPT_ARG_NONE, &opts.no_xa,
|
||||
0, "Don't use XA-extension information"},
|
||||
|
||||
{"quiet", 'q', POPT_ARG_NONE, &opts.silent, 0,
|
||||
"Don't produce warning output" },
|
||||
|
||||
{"version", 'V', POPT_ARG_NONE, &opts.version_only, 0,
|
||||
"display version and copyright information and exit"},
|
||||
POPT_AUTOHELP {NULL, 0, 0, NULL, 0}
|
||||
{"help", no_argument, NULL, '?' },
|
||||
{"usage", no_argument, NULL, OP_USAGE },
|
||||
{ NULL, 0, NULL, 0 }
|
||||
};
|
||||
poptContext optCon = poptGetContext (NULL, argc, argv, optionsTable, 0);
|
||||
|
||||
program_name = strrchr(argv[0],'/');
|
||||
program_name = program_name ? strdup(program_name+1) : strdup(argv[0]);
|
||||
|
||||
while ((opt = poptGetNextOpt (optCon)) >= 0) {
|
||||
while ((opt = getopt_long(argc, argv, optionsString, optionsTable, NULL)) >= 0) {
|
||||
switch (opt) {
|
||||
|
||||
case OP_SOURCE_AUTO:
|
||||
case OP_SOURCE_BIN:
|
||||
case OP_SOURCE_CUE:
|
||||
case OP_SOURCE_CDRDAO:
|
||||
case OP_SOURCE_NRG:
|
||||
case OP_SOURCE_DEVICE:
|
||||
if (opts.source_image != INPUT_UNKNOWN) {
|
||||
report(stderr, "%s: another source type option given before.\n",
|
||||
program_name);
|
||||
report(stderr, "%s: give only one source type option.\n",
|
||||
program_name);
|
||||
break;
|
||||
}
|
||||
case 'a': opts.access_mode = strdup(optarg); break;
|
||||
case 'd': opts.debug_level = atoi(optarg); break;
|
||||
case 'T': opts.no_tracks = 1; break;
|
||||
case 'A': opts.no_analysis = 1; break;
|
||||
case 'P': cddb_opts.port = atoi(optarg); break;
|
||||
case 'H': cddb_opts.http = 1; break;
|
||||
case OP_CDDB_SERVER: cddb_opts.server = strdup(optarg); break;
|
||||
case OP_CDDB_CACHE: cddb_opts.cachedir = strdup(optarg); break;
|
||||
case OP_CDDB_EMAIL: cddb_opts.email = strdup(optarg); break;
|
||||
case OP_CDDB_NOCACHE: cddb_opts.disable_cache = 1; break;
|
||||
case OP_CDDB_TIMEOUT: cddb_opts.timeout = atoi(optarg); break;
|
||||
case 'v': opts.no_vcd = 1; break;
|
||||
case 'I': opts.no_ioctl = 1; break;
|
||||
case 'b': parse_source(OP_SOURCE_BIN); break;
|
||||
case 'c': parse_source(OP_SOURCE_CUE); break;
|
||||
case 'N': parse_source(OP_SOURCE_NRG); break;
|
||||
case 't': parse_source(OP_SOURCE_CDRDAO); break;
|
||||
case 'i': parse_source(OP_SOURCE_AUTO); break;
|
||||
case 'C': parse_source(OP_SOURCE_DEVICE); break;
|
||||
case 'l': opts.list_drives = 1; break;
|
||||
case 'q': opts.silent = 1; break;
|
||||
case 'V': opts.version_only = 1; break;
|
||||
|
||||
/* For all input sources which are not a DEVICE, we need to make
|
||||
a copy of the string; for a DEVICE the fill-out routine makes
|
||||
the copy.
|
||||
*/
|
||||
if (OP_SOURCE_DEVICE != opt)
|
||||
source_name = strdup(psz_my_source);
|
||||
|
||||
switch (opt) {
|
||||
case OP_SOURCE_BIN:
|
||||
opts.source_image = INPUT_BIN;
|
||||
break;
|
||||
case OP_SOURCE_CUE:
|
||||
opts.source_image = INPUT_CUE;
|
||||
break;
|
||||
case OP_SOURCE_CDRDAO:
|
||||
opts.source_image = INPUT_CDRDAO;
|
||||
break;
|
||||
case OP_SOURCE_NRG:
|
||||
opts.source_image = INPUT_NRG;
|
||||
break;
|
||||
case OP_SOURCE_AUTO:
|
||||
opts.source_image = INPUT_AUTO;
|
||||
break;
|
||||
case OP_SOURCE_DEVICE:
|
||||
opts.source_image = INPUT_DEVICE;
|
||||
source_name = fillout_device_name(source_name);
|
||||
break;
|
||||
}
|
||||
case '?':
|
||||
fprintf(stderr, helpText, program_name);
|
||||
free(program_name);
|
||||
exit(EXIT_FAILURE);
|
||||
break;
|
||||
|
||||
case OP_USAGE:
|
||||
fprintf(stderr, usageText, program_name);
|
||||
free(program_name);
|
||||
exit(EXIT_FAILURE);
|
||||
break;
|
||||
|
||||
case OP_HANDLED:
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (opt < -1) {
|
||||
/* an error occurred during option processing */
|
||||
report(stderr, "%s: %s\n",
|
||||
poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
|
||||
poptStrerror(opt));
|
||||
|
||||
if (optind < argc) {
|
||||
const char *remaining_arg = argv[optind++];
|
||||
|
||||
/* NOTE: A bug in the libpopt version checked source_image, which
|
||||
rendered the subsequent source_image test useless.
|
||||
*/
|
||||
if (source_name != NULL) {
|
||||
report(stderr, "%s: Source '%s' given as an argument of an option and as "
|
||||
"unnamed option '%s'\n",
|
||||
program_name, source_name, remaining_arg);
|
||||
free(program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (opts.source_image == INPUT_DEVICE)
|
||||
source_name = fillout_device_name(remaining_arg);
|
||||
else
|
||||
source_name = strdup(remaining_arg);
|
||||
|
||||
if (optind < argc) {
|
||||
report(stderr, "%s: Source specified in previously %s and %s\n",
|
||||
program_name, source_name, remaining_arg);
|
||||
free(program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
if (NULL == source_name) {
|
||||
report(stderr, "%s: No source specified.\n", program_name);
|
||||
free(program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
{
|
||||
const char *remaining_arg = poptGetArg(optCon);
|
||||
if ( remaining_arg != NULL) {
|
||||
if (opts.source_image != INPUT_UNKNOWN) {
|
||||
report(stderr, "%s: Source '%s' given as an argument of an option and as "
|
||||
"unnamed option '%s'\n",
|
||||
program_name, psz_my_source, remaining_arg);
|
||||
poptFreeContext(optCon);
|
||||
free(program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (opts.source_image == INPUT_DEVICE)
|
||||
source_name = fillout_device_name(remaining_arg);
|
||||
else
|
||||
source_name = strdup(remaining_arg);
|
||||
|
||||
if ( (poptGetArgs(optCon)) != NULL) {
|
||||
report(stderr, "%s: Source specified in previously %s and %s\n",
|
||||
program_name, psz_my_source, remaining_arg);
|
||||
poptFreeContext(optCon);
|
||||
free(program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
poptFreeContext(optCon);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
/* CDIO logging routines */
|
||||
|
||||
#ifdef HAVE_CDDB
|
||||
@@ -764,7 +802,7 @@ init(void)
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
int
|
||||
main(int argc, const char *argv[])
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
|
||||
CdIo_t *p_cdio=NULL;
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# $Id: Makefile.am,v 1.15 2005/09/17 01:33:29 rocky Exp $
|
||||
# $Id: Makefile.am,v 1.16 2005/10/05 09:48:12 rocky Exp $
|
||||
#
|
||||
# Copyright (C) 2004, 2005 Rocky Bernstein <rocky@panix.com>
|
||||
# Copyright (C) 1998 Monty xiphmont@mit.edu
|
||||
@@ -19,17 +19,11 @@
|
||||
#
|
||||
###############################################################################
|
||||
|
||||
if HAVE_GETOPT_LONG
|
||||
else
|
||||
getopt_sources = getopt.c getopt1.c
|
||||
endif
|
||||
|
||||
EXTRA_DIST = getopt.c getopt1.c \
|
||||
usage.txt.in usage-copy.h pod2c.pl \
|
||||
EXTRA_DIST = usage.txt.in usage-copy.h pod2c.pl \
|
||||
doc/FAQ.txt doc/overlapdef.txt
|
||||
|
||||
|
||||
noinst_HEADERS = getopt.h header.h report.h
|
||||
noinst_HEADERS = header.h report.h
|
||||
|
||||
transform = s,cd-paranoia,@CDPARANOIA_NAME@,
|
||||
|
||||
|
||||
@@ -76,7 +76,14 @@
|
||||
#include <fcntl.h>
|
||||
#endif
|
||||
|
||||
/* FreeBSD 4 has getopt in unistd.h. So we include that before
|
||||
getopt.h */
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#ifdef HAVE_GETOPT_H
|
||||
#include <getopt.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_ERRNO_H
|
||||
#include <errno.h>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -1,133 +0,0 @@
|
||||
/* Declarations for getopt.
|
||||
Copyright (C) 1989,90,91,92,93,94,96,97 Free Software Foundation, Inc.
|
||||
|
||||
NOTE: The canonical source of this file is maintained with the GNU C Library.
|
||||
Bugs can be reported to bug-glibc@gnu.org.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
USA. */
|
||||
|
||||
#ifndef _GETOPT_H
|
||||
#define _GETOPT_H 1
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/* For communication from `getopt' to the caller.
|
||||
When `getopt' finds an option that takes an argument,
|
||||
the argument value is returned here.
|
||||
Also, when `ordering' is RETURN_IN_ORDER,
|
||||
each non-option ARGV-element is returned here. */
|
||||
|
||||
extern char *optarg;
|
||||
|
||||
/* Index in ARGV of the next element to be scanned.
|
||||
This is used for communication to and from the caller
|
||||
and for communication between successive calls to `getopt'.
|
||||
|
||||
On entry to `getopt', zero means this is the first call; initialize.
|
||||
|
||||
When `getopt' returns -1, this is the index of the first of the
|
||||
non-option elements that the caller should itself scan.
|
||||
|
||||
Otherwise, `optind' communicates from one call to the next
|
||||
how much of ARGV has been scanned so far. */
|
||||
|
||||
extern int optind;
|
||||
|
||||
/* Callers store zero here to inhibit the error message `getopt' prints
|
||||
for unrecognized options. */
|
||||
|
||||
extern int opterr;
|
||||
|
||||
/* Set to an option character which was unrecognized. */
|
||||
|
||||
extern int optopt;
|
||||
|
||||
/* Describe the long-named options requested by the application.
|
||||
The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector
|
||||
of `struct option' terminated by an element containing a name which is
|
||||
zero.
|
||||
|
||||
The field `has_arg' is:
|
||||
no_argument (or 0) if the option does not take an argument,
|
||||
required_argument (or 1) if the option requires an argument,
|
||||
optional_argument (or 2) if the option takes an optional argument.
|
||||
|
||||
If the field `flag' is not NULL, it points to a variable that is set
|
||||
to the value given in the field `val' when the option is found, but
|
||||
left unchanged if the option is not found.
|
||||
|
||||
To have a long-named option do something other than set an `int' to
|
||||
a compiled-in constant, such as set a value from `optarg', set the
|
||||
option's `flag' field to zero and its `val' field to a nonzero
|
||||
value (the equivalent single-letter option character, if there is
|
||||
one). For long options that have a zero `flag' field, `getopt'
|
||||
returns the contents of the `val' field. */
|
||||
|
||||
struct option
|
||||
{
|
||||
#if defined (__STDC__) && __STDC__
|
||||
const char *name;
|
||||
#else
|
||||
char *name;
|
||||
#endif
|
||||
/* has_arg can't be an enum because some compilers complain about
|
||||
type mismatches in all the code that assumes it is an int. */
|
||||
int has_arg;
|
||||
int *flag;
|
||||
int val;
|
||||
};
|
||||
|
||||
/* Names for the values of the `has_arg' field of `struct option'. */
|
||||
|
||||
#define no_argument 0
|
||||
#define required_argument 1
|
||||
#define optional_argument 2
|
||||
|
||||
#if defined (__STDC__) && __STDC__
|
||||
#ifdef __GNU_LIBRARY__
|
||||
/* Many other libraries have conflicting prototypes for getopt, with
|
||||
differences in the consts, in stdlib.h. To avoid compilation
|
||||
errors, only prototype getopt for the GNU C library. */
|
||||
extern int getopt (int argc, char *const *argv, const char *shortopts);
|
||||
#else /* not __GNU_LIBRARY__ */
|
||||
extern int getopt ();
|
||||
#endif /* __GNU_LIBRARY__ */
|
||||
extern int getopt_long (int argc, char *const *argv, const char *shortopts,
|
||||
const struct option *longopts, int *longind);
|
||||
extern int getopt_long_only (int argc, char *const *argv,
|
||||
const char *shortopts,
|
||||
const struct option *longopts, int *longind);
|
||||
|
||||
/* Internal only. Users should not call this directly. */
|
||||
extern int _getopt_internal (int argc, char *const *argv,
|
||||
const char *shortopts,
|
||||
const struct option *longopts, int *longind,
|
||||
int long_only);
|
||||
#else /* not __STDC__ */
|
||||
extern int getopt ();
|
||||
extern int getopt_long ();
|
||||
extern int getopt_long_only ();
|
||||
|
||||
extern int _getopt_internal ();
|
||||
#endif /* __STDC__ */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif /* getopt.h */
|
||||
@@ -1,190 +0,0 @@
|
||||
/* getopt_long and getopt_long_only entry points for GNU getopt.
|
||||
Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
NOTE: The canonical source of this file is maintained with the GNU C Library.
|
||||
Bugs can be reported to bug-glibc@gnu.org.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307,
|
||||
USA. */
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include "getopt.h"
|
||||
|
||||
#if !defined __STDC__ || !__STDC__
|
||||
/* This is a separate conditional since some stdc systems
|
||||
reject `defined (const)'. */
|
||||
#ifndef const
|
||||
#define const
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
/* Comment out all this code if we are using the GNU C Library, and are not
|
||||
actually compiling the library itself. This code is part of the GNU C
|
||||
Library, but also included in many other GNU distributions. Compiling
|
||||
and linking in this code is a waste when using the GNU C library
|
||||
(especially if it is a shared library). Rather than having every GNU
|
||||
program understand `configure --with-gnu-libc' and omit the object files,
|
||||
it is simpler to just do this in the source for each such file. */
|
||||
|
||||
#define GETOPT_INTERFACE_VERSION 2
|
||||
#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2
|
||||
#include <gnu-versions.h>
|
||||
#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION
|
||||
#define ELIDE_CODE
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#ifndef ELIDE_CODE
|
||||
|
||||
|
||||
/* This needs to come after some library #include
|
||||
to get __GNU_LIBRARY__ defined. */
|
||||
#ifdef __GNU_LIBRARY__
|
||||
#include <stdlib.h>
|
||||
#endif
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL 0
|
||||
#endif
|
||||
|
||||
int
|
||||
getopt_long (argc, argv, options, long_options, opt_index)
|
||||
int argc;
|
||||
char *const *argv;
|
||||
const char *options;
|
||||
const struct option *long_options;
|
||||
int *opt_index;
|
||||
{
|
||||
return _getopt_internal (argc, argv, options, long_options, opt_index, 0);
|
||||
}
|
||||
|
||||
/* Like getopt_long, but '-' as well as '--' can indicate a long option.
|
||||
If an option that starts with '-' (not '--') doesn't match a long option,
|
||||
but does match a short option, it is parsed as a short option
|
||||
instead. */
|
||||
|
||||
int
|
||||
getopt_long_only (argc, argv, options, long_options, opt_index)
|
||||
int argc;
|
||||
char *const *argv;
|
||||
const char *options;
|
||||
const struct option *long_options;
|
||||
int *opt_index;
|
||||
{
|
||||
return _getopt_internal (argc, argv, options, long_options, opt_index, 1);
|
||||
}
|
||||
|
||||
|
||||
#endif /* Not ELIDE_CODE. */
|
||||
|
||||
#ifdef TEST
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
int
|
||||
main (argc, argv)
|
||||
int argc;
|
||||
char **argv;
|
||||
{
|
||||
int c;
|
||||
int digit_optind = 0;
|
||||
|
||||
while (1)
|
||||
{
|
||||
int this_option_optind = optind ? optind : 1;
|
||||
int option_index = 0;
|
||||
static struct option long_options[] =
|
||||
{
|
||||
{"add", 1, 0, 0},
|
||||
{"append", 0, 0, 0},
|
||||
{"delete", 1, 0, 0},
|
||||
{"verbose", 0, 0, 0},
|
||||
{"create", 0, 0, 0},
|
||||
{"file", 1, 0, 0},
|
||||
{0, 0, 0, 0}
|
||||
};
|
||||
|
||||
c = getopt_long (argc, argv, "abc:d:0123456789",
|
||||
long_options, &option_index);
|
||||
if (c == -1)
|
||||
break;
|
||||
|
||||
switch (c)
|
||||
{
|
||||
case 0:
|
||||
printf ("option %s", long_options[option_index].name);
|
||||
if (optarg)
|
||||
printf (" with arg %s", optarg);
|
||||
printf ("\n");
|
||||
break;
|
||||
|
||||
case '0':
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
case '8':
|
||||
case '9':
|
||||
if (digit_optind != 0 && digit_optind != this_option_optind)
|
||||
printf ("digits occur in two different argv-elements.\n");
|
||||
digit_optind = this_option_optind;
|
||||
printf ("option %c\n", c);
|
||||
break;
|
||||
|
||||
case 'a':
|
||||
printf ("option a\n");
|
||||
break;
|
||||
|
||||
case 'b':
|
||||
printf ("option b\n");
|
||||
break;
|
||||
|
||||
case 'c':
|
||||
printf ("option c with value `%s'\n", optarg);
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
printf ("option d with value `%s'\n", optarg);
|
||||
break;
|
||||
|
||||
case '?':
|
||||
break;
|
||||
|
||||
default:
|
||||
printf ("?? getopt returned character code 0%o ??\n", c);
|
||||
}
|
||||
}
|
||||
|
||||
if (optind < argc)
|
||||
{
|
||||
printf ("non-option ARGV-elements: ");
|
||||
while (optind < argc)
|
||||
printf ("%s ", argv[optind++]);
|
||||
printf ("\n");
|
||||
}
|
||||
|
||||
exit (0);
|
||||
}
|
||||
|
||||
#endif /* TEST */
|
||||
336
src/cd-read.c
336
src/cd-read.c
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
$Id: cd-read.c,v 1.25 2005/09/18 20:34:02 rocky Exp $
|
||||
$Id: cd-read.c,v 1.26 2005/10/05 09:48:12 rocky Exp $
|
||||
|
||||
Copyright (C) 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com>
|
||||
|
||||
@@ -34,15 +34,19 @@
|
||||
|
||||
/* Configuration option codes */
|
||||
enum {
|
||||
OP_HANDLED = 0,
|
||||
|
||||
/* These correspond to driver_id_t in cdio.h and have to MATCH! */
|
||||
OP_SOURCE_UNDEF = DRIVER_UNKNOWN,
|
||||
/* NOTE: libpopt version associated these with drivers. That
|
||||
appeared to be an unused historical artifact.
|
||||
*/
|
||||
OP_SOURCE_AUTO,
|
||||
OP_SOURCE_BIN,
|
||||
OP_SOURCE_CUE,
|
||||
OP_SOURCE_NRG = DRIVER_NRG,
|
||||
OP_SOURCE_CDRDAO = DRIVER_CDRDAO,
|
||||
OP_SOURCE_DEVICE = DRIVER_DEVICE,
|
||||
OP_SOURCE_NRG,
|
||||
OP_SOURCE_CDRDAO,
|
||||
OP_SOURCE_DEVICE,
|
||||
|
||||
OP_USAGE,
|
||||
|
||||
/* These are the remaining configuration options */
|
||||
OP_READ_MODE,
|
||||
@@ -173,173 +177,198 @@ process_suboption(const char *subopt, subopt_entry_t *sublist, const int num,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Parse source options. */
|
||||
static void
|
||||
parse_source(int opt)
|
||||
{
|
||||
/* NOTE: The libpopt version made use of an extra temporary
|
||||
variable (psz_my_source) for all sources _except_ devices.
|
||||
This distinction seemed to serve no purpose.
|
||||
*/
|
||||
/* NOTE: The libpopt version had a bug which kept it from
|
||||
processing toc-file inputs
|
||||
*/
|
||||
|
||||
if (opts.source_image != INPUT_UNKNOWN) {
|
||||
report( stderr, "%s: another source type option given before.\n",
|
||||
program_name );
|
||||
report( stderr, "%s: give only one source type option.\n",
|
||||
program_name );
|
||||
return;
|
||||
}
|
||||
|
||||
/* For all input sources which are not a DEVICE, we need to make
|
||||
a copy of the string; for a DEVICE the fill-out routine makes
|
||||
the copy.
|
||||
*/
|
||||
if (OP_SOURCE_DEVICE != opt)
|
||||
if (optarg != NULL) source_name = strdup(optarg);
|
||||
|
||||
switch (opt) {
|
||||
case OP_SOURCE_BIN:
|
||||
opts.source_image = INPUT_BIN;
|
||||
break;
|
||||
case OP_SOURCE_CUE:
|
||||
opts.source_image = INPUT_CUE;
|
||||
break;
|
||||
case OP_SOURCE_NRG:
|
||||
opts.source_image = INPUT_NRG;
|
||||
break;
|
||||
case OP_SOURCE_AUTO:
|
||||
opts.source_image = INPUT_AUTO;
|
||||
break;
|
||||
case OP_SOURCE_DEVICE:
|
||||
opts.source_image = INPUT_DEVICE;
|
||||
if (optarg != NULL) source_name = fillout_device_name(optarg);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Parse a options. */
|
||||
static bool
|
||||
parse_options (int argc, const char *argv[])
|
||||
parse_options (int argc, char *argv[])
|
||||
{
|
||||
|
||||
int opt;
|
||||
char *psz_my_source;
|
||||
char *opt_arg;
|
||||
|
||||
/* Command-line options */
|
||||
struct poptOption optionsTable[] = {
|
||||
const char* helpText =
|
||||
"Usage: %s [OPTION...]\n"
|
||||
" -a, --access-mode=STRING Set CD control access mode\n"
|
||||
" -m, --mode=MODE-TYPE set CD-ROM read mode (audio, m1f1, m1f2,\n"
|
||||
" m2mf1, m2f2)\n"
|
||||
" -d, --debug=INT Set debugging to LEVEL\n"
|
||||
" -x, --hexdump Show output as a hex dump. The default is a\n"
|
||||
" hex dump when output goes to stdout and no\n"
|
||||
" hex dump when output is to a file.\n"
|
||||
" --no-header Don't display header and copyright (for\n"
|
||||
" regression testing)\n"
|
||||
" --no-hexdump Don't show output as a hex dump.\n"
|
||||
" -s, --start=INT Set LBA to start reading from\n"
|
||||
" -e, --end=INT Set LBA to end reading from\n"
|
||||
" -n, --number=INT Set number of sectors to read\n"
|
||||
" -b, --bin-file[=FILE] set \"bin\" CD-ROM disk image file as source\n"
|
||||
" -c, --cue-file[=FILE] set \"cue\" CD-ROM disk image file as source\n"
|
||||
" -i, --input[=FILE] set source and determine if \"bin\" image or\n"
|
||||
" device\n"
|
||||
" -C, --cdrom-device[=DEVICE] set CD-ROM device as source\n"
|
||||
" -N, --nrg-file[=FILE] set Nero CD-ROM disk image file as source\n"
|
||||
" -t, --toc-file[=FILE] set \"TOC\" CD-ROM disk image file as source\n"
|
||||
" -o, --output-file=FILE Output blocks to file rather than give a\n"
|
||||
" hexdump.\n"
|
||||
" -V, --version display version and copyright information\n"
|
||||
" and exit\n"
|
||||
"\n"
|
||||
"Help options:\n"
|
||||
" -?, --help Show this help message\n"
|
||||
" --usage Display brief usage message\n";
|
||||
|
||||
{"access-mode", 'a', POPT_ARG_STRING, &opts.access_mode, 0,
|
||||
"Set CD control access mode"},
|
||||
|
||||
{"mode", 'm',
|
||||
POPT_ARG_STRING, &opt_arg,
|
||||
OP_READ_MODE,
|
||||
"set CD-ROM read mode (audio, m1f1, m1f2, m2mf1, m2f2)",
|
||||
"MODE-TYPE"},
|
||||
|
||||
{"debug", 'd',
|
||||
POPT_ARG_INT, &opts.debug_level, 0,
|
||||
"Set debugging to LEVEL"},
|
||||
|
||||
{"hexdump", 'x', POPT_ARG_NONE, &opts.hexdump, 0,
|
||||
"Show output as a hex dump. The default is a hex dump when "
|
||||
"output goes to stdout and no hex dump when output is to a file."},
|
||||
|
||||
{"no-header", '\0', POPT_ARG_NONE, &opts.no_header,
|
||||
0, "Don't display header and copyright (for regression testing)"},
|
||||
|
||||
{"no-hexdump", '\0', POPT_ARG_NONE, &opts.nohexdump, 0,
|
||||
"Don't show output as a hex dump."},
|
||||
|
||||
{"start", 's',
|
||||
POPT_ARG_INT, &opts.start_lsn, 0,
|
||||
"Set LBA to start reading from"},
|
||||
|
||||
{"end", 'e',
|
||||
POPT_ARG_INT, &opts.end_lsn, 0,
|
||||
"Set LBA to end reading from"},
|
||||
|
||||
{"number", 'n',
|
||||
POPT_ARG_INT, &opts.num_sectors, 0,
|
||||
"Set number of sectors to read"},
|
||||
|
||||
{"bin-file", 'b', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, &psz_my_source,
|
||||
OP_SOURCE_BIN, "set \"bin\" CD-ROM disk image file as source", "FILE"},
|
||||
|
||||
{"cue-file", 'c', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, &psz_my_source,
|
||||
OP_SOURCE_CUE, "set \"cue\" CD-ROM disk image file as source", "FILE"},
|
||||
|
||||
{"input", 'i', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, &psz_my_source,
|
||||
OP_SOURCE_AUTO,
|
||||
"set source and determine if \"bin\" image or device", "FILE"},
|
||||
|
||||
{"cdrom-device", 'C', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, &source_name,
|
||||
OP_SOURCE_DEVICE,
|
||||
"set CD-ROM device as source", "DEVICE"},
|
||||
|
||||
{"nrg-file", 'N', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, &psz_my_source,
|
||||
OP_SOURCE_NRG, "set Nero CD-ROM disk image file as source", "FILE"},
|
||||
|
||||
{"toc-file", 't', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, &psz_my_source,
|
||||
OP_SOURCE_CDRDAO, "set \"TOC\" CD-ROM disk image file as source", "FILE"},
|
||||
|
||||
{"output-file", 'o', POPT_ARG_STRING, &opts.output_file, 0,
|
||||
"Output blocks to file rather than give a hexdump.", "FILE"},
|
||||
|
||||
{"version", 'V', POPT_ARG_NONE, NULL, OP_VERSION,
|
||||
"display version and copyright information and exit"},
|
||||
POPT_AUTOHELP {NULL, 0, 0, NULL, 0}
|
||||
const char* usageText =
|
||||
"Usage: %s [-a|--access-mode STRING] [-m|--mode MODE-TYPE]\n"
|
||||
" [-d|--debug INT] [-x|--hexdump] [--no-header] [--no-hexdump]\n"
|
||||
" [-s|--start INT] [-e|--end INT] [-n|--number INT] [-b|--bin-file FILE]\n"
|
||||
" [-c|--cue-file FILE] [-i|--input FILE] [-C|--cdrom-device DEVICE]\n"
|
||||
" [-N|--nrg-file FILE] [-t|--toc-file FILE] [-o|--output-file FILE]\n"
|
||||
" [-V|--version] [-?|--help] [--usage]\n";
|
||||
|
||||
/* Command-line options */
|
||||
const char* optionsString = "a:m:d:xs:e:n:b::c::i::C::N::t::o:V?";
|
||||
struct option optionsTable[] = {
|
||||
|
||||
{"access-mode", required_argument, NULL, 'a'},
|
||||
{"mode", required_argument, NULL, 'm'},
|
||||
{"debug", required_argument, NULL, 'd'},
|
||||
{"hexdump", no_argument, NULL, 'x'},
|
||||
{"no-header", no_argument, &opts.no_header, 1},
|
||||
{"no-hexdump", no_argument, &opts.nohexdump, 1},
|
||||
{"start", required_argument, NULL, 's'},
|
||||
{"end", required_argument, NULL, 'e'},
|
||||
{"number", required_argument, NULL, 'n'},
|
||||
{"bin-file", optional_argument, NULL, 'b'},
|
||||
{"cue-file", optional_argument, NULL, 'c'},
|
||||
{"input", optional_argument, NULL, 'i'},
|
||||
{"cdrom-device", optional_argument, NULL, 'C'},
|
||||
{"nrg-file", optional_argument, NULL, 'N'},
|
||||
{"toc-file", optional_argument, NULL, 't'},
|
||||
{"output-file", required_argument, NULL, 'o'},
|
||||
{"version", no_argument, NULL, 'V'},
|
||||
|
||||
{"help", no_argument, NULL, '?' },
|
||||
{"usage", no_argument, NULL, OP_USAGE },
|
||||
{ NULL, 0, NULL, 0 }
|
||||
};
|
||||
poptContext optCon = poptGetContext (NULL, argc, argv, optionsTable, 0);
|
||||
|
||||
program_name = strrchr(argv[0],'/');
|
||||
program_name = program_name ? strdup(program_name+1) : strdup(argv[0]);
|
||||
|
||||
while ((opt = poptGetNextOpt (optCon)) >= 0)
|
||||
while ((opt = getopt_long(argc, argv, optionsString, optionsTable, NULL)) >= 0)
|
||||
switch (opt)
|
||||
{
|
||||
case OP_SOURCE_AUTO:
|
||||
case OP_SOURCE_BIN:
|
||||
case OP_SOURCE_CUE:
|
||||
case OP_SOURCE_NRG:
|
||||
case OP_SOURCE_DEVICE:
|
||||
if (opts.source_image != INPUT_UNKNOWN) {
|
||||
report( stderr, "%s: another source type option given before.\n",
|
||||
program_name );
|
||||
report( stderr, "%s: give only one source type option.\n",
|
||||
program_name );
|
||||
break;
|
||||
}
|
||||
|
||||
/* For all input sources which are not a DEVICE, we need to make
|
||||
a copy of the string; for a DEVICE the fill-out routine makes
|
||||
the copy.
|
||||
*/
|
||||
if (OP_SOURCE_DEVICE != opt)
|
||||
source_name = strdup(psz_my_source);
|
||||
|
||||
switch (opt) {
|
||||
case OP_SOURCE_BIN:
|
||||
opts.source_image = INPUT_BIN;
|
||||
break;
|
||||
case OP_SOURCE_CUE:
|
||||
opts.source_image = INPUT_CUE;
|
||||
break;
|
||||
case OP_SOURCE_NRG:
|
||||
opts.source_image = INPUT_NRG;
|
||||
break;
|
||||
case OP_SOURCE_AUTO:
|
||||
opts.source_image = INPUT_AUTO;
|
||||
break;
|
||||
case OP_SOURCE_DEVICE:
|
||||
opts.source_image = INPUT_DEVICE;
|
||||
source_name = fillout_device_name(source_name);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case OP_READ_MODE:
|
||||
process_suboption(opt_arg, modes_sublist,
|
||||
case 'a': opts.access_mode = strdup(optarg); break;
|
||||
case 'd': opts.debug_level = atoi(optarg); break;
|
||||
case 'x': opts.hexdump = 1; break;
|
||||
case 's': opts.start_lsn = atoi(optarg); break;
|
||||
case 'e': opts.end_lsn = atoi(optarg); break;
|
||||
case 'n': opts.num_sectors = atoi(optarg); break;
|
||||
case 'b': parse_source(OP_SOURCE_BIN); break;
|
||||
case 'c': parse_source(OP_SOURCE_CUE); break;
|
||||
case 'i': parse_source(OP_SOURCE_AUTO); break;
|
||||
case 'C': parse_source(OP_SOURCE_DEVICE); break;
|
||||
case 'N': parse_source(OP_SOURCE_NRG); break;
|
||||
case 't': parse_source(OP_SOURCE_CDRDAO); break;
|
||||
case 'o': opts.output_file = strdup(optarg); break;
|
||||
|
||||
case 'm':
|
||||
process_suboption(optarg, modes_sublist,
|
||||
sizeof(modes_sublist) / sizeof(subopt_entry_t),
|
||||
"--mode");
|
||||
break;
|
||||
case OP_VERSION:
|
||||
|
||||
case 'V':
|
||||
print_version(program_name, VERSION, 0, true);
|
||||
poptFreeContext(optCon);
|
||||
free(program_name);
|
||||
exit (EXIT_SUCCESS);
|
||||
break;
|
||||
|
||||
case '?':
|
||||
fprintf(stderr, helpText, program_name);
|
||||
free(program_name);
|
||||
exit(EXIT_FAILURE);
|
||||
break;
|
||||
|
||||
case OP_USAGE:
|
||||
fprintf(stderr, usageText, program_name);
|
||||
free(program_name);
|
||||
exit(EXIT_FAILURE);
|
||||
break;
|
||||
|
||||
case OP_HANDLED:
|
||||
break;
|
||||
}
|
||||
|
||||
if (opt < -1) {
|
||||
report( stderr, "%s: %s\n",
|
||||
poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
|
||||
poptStrerror(opt) );
|
||||
free(program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
{
|
||||
const char *remaining_arg = poptGetArg(optCon);
|
||||
if ( remaining_arg != NULL) {
|
||||
if (opts.source_image != INPUT_UNKNOWN) {
|
||||
report( stderr, "%s: Source specified in option %s and as %s\n",
|
||||
program_name, source_name, remaining_arg );
|
||||
poptFreeContext(optCon);
|
||||
free(program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
if (optind < argc) {
|
||||
const char *remaining_arg = argv[optind++];
|
||||
|
||||
/* NOTE: A bug in the libpopt version checked source_image, which
|
||||
rendered the subsequent source_image test useless.
|
||||
*/
|
||||
if (source_name != NULL) {
|
||||
report( stderr, "%s: Source specified in option %s and as %s\n",
|
||||
program_name, source_name, remaining_arg );
|
||||
free(program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if (opts.source_image == INPUT_DEVICE)
|
||||
source_name = fillout_device_name(remaining_arg);
|
||||
else
|
||||
source_name = strdup(remaining_arg);
|
||||
|
||||
if (opts.source_image == OP_SOURCE_DEVICE)
|
||||
source_name = fillout_device_name(remaining_arg);
|
||||
else
|
||||
source_name = strdup(remaining_arg);
|
||||
|
||||
if ( (poptGetArgs(optCon)) != NULL) {
|
||||
report( stderr, "%s: Source specified in previously %s and %s\n",
|
||||
program_name, source_name, remaining_arg );
|
||||
poptFreeContext(optCon);
|
||||
free(program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
|
||||
}
|
||||
if (optind < argc) {
|
||||
report( stderr, "%s: Source specified in previously %s and %s\n",
|
||||
program_name, source_name, remaining_arg );
|
||||
free(program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -354,7 +383,6 @@ parse_options (int argc, const char *argv[])
|
||||
"%s: Need to give a read mode "
|
||||
"(audio, m1f1, m1f2, m2f1 or m2f2)\n",
|
||||
program_name );
|
||||
poptFreeContext(optCon);
|
||||
free(program_name);
|
||||
exit(10);
|
||||
}
|
||||
@@ -382,7 +410,6 @@ parse_options (int argc, const char *argv[])
|
||||
" the sector to read (%lu)\n",
|
||||
program_name, (unsigned long) opts.end_lsn,
|
||||
(unsigned long) opts.num_sectors );
|
||||
poptFreeContext(optCon);
|
||||
exit(12);
|
||||
}
|
||||
opts.start_lsn = opts.end_lsn - opts.num_sectors + 1;
|
||||
@@ -401,7 +428,6 @@ parse_options (int argc, const char *argv[])
|
||||
"%s: end LSN (%lu) needs to be less than start LSN (%lu)\n",
|
||||
program_name, (unsigned long) opts.start_lsn,
|
||||
(unsigned long) opts.end_lsn );
|
||||
poptFreeContext(optCon);
|
||||
free(program_name);
|
||||
exit(13);
|
||||
}
|
||||
@@ -412,14 +438,12 @@ parse_options (int argc, const char *argv[])
|
||||
"and count (%d)\n",
|
||||
program_name, (unsigned long) opts.start_lsn,
|
||||
(unsigned long) opts.end_lsn, opts.num_sectors );
|
||||
poptFreeContext(optCon);
|
||||
free(program_name);
|
||||
exit(14);
|
||||
}
|
||||
opts.num_sectors = opts.end_lsn - opts.start_lsn + 1;
|
||||
}
|
||||
|
||||
poptFreeContext(optCon);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -454,7 +478,7 @@ init(void)
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, const char *argv[])
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
uint8_t buffer[CDIO_CD_FRAMESIZE_RAW] = { 0, };
|
||||
unsigned int blocklen=CDIO_CD_FRAMESIZE_RAW;
|
||||
|
||||
136
src/iso-info.c
136
src/iso-info.c
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
$Id: iso-info.c,v 1.30 2005/03/18 12:56:00 rocky Exp $
|
||||
$Id: iso-info.c,v 1.31 2005/10/05 09:48:12 rocky Exp $
|
||||
|
||||
Copyright (C) 2004, 2005 Rocky Bernstein <rocky@panix.com>
|
||||
|
||||
@@ -47,6 +47,7 @@
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include <getopt.h>
|
||||
|
||||
#if 0
|
||||
#define STRONG "\033[1m"
|
||||
@@ -73,7 +74,10 @@ struct arguments
|
||||
|
||||
/* Configuration option codes */
|
||||
enum {
|
||||
|
||||
OP_HANDLED = 0,
|
||||
|
||||
OP_USAGE,
|
||||
|
||||
/* These are the remaining configuration options */
|
||||
OP_VERSION,
|
||||
|
||||
@@ -84,75 +88,95 @@ char *temp_str;
|
||||
|
||||
/* Parse a all options. */
|
||||
static bool
|
||||
parse_options (int argc, const char *argv[])
|
||||
parse_options (int argc, char *argv[])
|
||||
{
|
||||
int opt;
|
||||
|
||||
struct poptOption optionsTable[] = {
|
||||
{"debug", 'd', POPT_ARG_INT, &opts.debug_level, 0,
|
||||
"Set debugging to LEVEL"},
|
||||
|
||||
{"input", 'i', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, &source_name, 0,
|
||||
"Filename to read ISO-9960 image from", "FILE"},
|
||||
|
||||
{'\0', 'f', POPT_ARG_NONE, &opts.print_iso9660_short, 0,
|
||||
"Generate output similar to 'find . -print'"},
|
||||
|
||||
{"iso9660", 'l', POPT_ARG_NONE, &opts.print_iso9660, 0,
|
||||
"Generate output similar to 'ls -lR'"},
|
||||
|
||||
{"no-header", '\0', POPT_ARG_NONE, &opts.no_header,
|
||||
0, "Don't display header and copyright (for regression testing)"},
|
||||
|
||||
const char* helpText =
|
||||
"Usage: %s [OPTION...]\n"
|
||||
" -d, --debug=INT Set debugging to LEVEL\n"
|
||||
" -i, --input[=FILE] Filename to read ISO-9960 image from\n"
|
||||
" -f Generate output similar to 'find . -print'\n"
|
||||
" -l, --iso9660 Generate output similar to 'ls -lR'\n"
|
||||
" --no-header Don't display header and copyright (for regression\n"
|
||||
" testing)\n"
|
||||
#ifdef HAVE_JOLIET
|
||||
{"no-joliet", '\0', POPT_ARG_NONE, &opts.no_joliet,
|
||||
0, "Don't use Joliet-extension information"},
|
||||
" --no-joliet Don't use Joliet-extension information\n"
|
||||
#endif /*HAVE_JOLIET*/
|
||||
|
||||
{"no-rock-ridge", '\0', POPT_ARG_NONE, &opts.no_rock_ridge,
|
||||
0, "Don't use Rock-Ridge-extension information"},
|
||||
" --no-rock-ridge Don't use Rock-Ridge-extension information\n"
|
||||
" --no-xa Don't use XA-extension information\n"
|
||||
" -q, --quiet Don't produce warning output\n"
|
||||
" -V, --version display version and copyright information and exit\n"
|
||||
"\n"
|
||||
"Help options:\n"
|
||||
" -?, --help Show this help message\n"
|
||||
" --usage Display brief usage message\n";
|
||||
|
||||
{"no-xa", '\0', POPT_ARG_NONE, &opts.no_xa,
|
||||
0, "Don't use XA-extension information"},
|
||||
const char* usageText =
|
||||
"Usage: %s [-d|--debug INT] [-i|--input FILE] [-f] [-l|--iso9660]\n"
|
||||
" [--no-header] [--no-joliet] [--no-rock-ridge] [--no-xa] [-q|--quiet]\n"
|
||||
" [-V|--version] [-?|--help] [--usage]\n";
|
||||
|
||||
{"quiet", 'q', POPT_ARG_NONE, &opts.silent, 0,
|
||||
"Don't produce warning output" },
|
||||
|
||||
{"version", 'V', POPT_ARG_NONE, &opts.version_only, 0,
|
||||
"display version and copyright information and exit"},
|
||||
POPT_AUTOHELP {NULL, 0, 0, NULL, 0}
|
||||
const char* optionsString = "d:i::flqV?";
|
||||
struct option optionsTable[] = {
|
||||
{"debug", required_argument, NULL, 'd'},
|
||||
{"input", optional_argument, NULL, 'i'},
|
||||
{"iso9660", no_argument, NULL, 'l'},
|
||||
{"no-header", no_argument, &opts.no_header, 1 },
|
||||
#ifdef HAVE_JOLIET
|
||||
{"no-joliet", no_argument, &opts.no_joliet, 1 },
|
||||
#endif /*HAVE_JOLIET*/
|
||||
{"no-rock-ridge", no_argument, &opts.no_rock_ridge, 1 },
|
||||
{"no-xa", no_argument, &opts.no_xa, 1 },
|
||||
{"quiet", no_argument, NULL, 'q'},
|
||||
{"version", no_argument, NULL, 'V'},
|
||||
|
||||
{"help", no_argument, NULL, '?' },
|
||||
{"usage", no_argument, NULL, OP_USAGE },
|
||||
{ NULL, 0, NULL, 0 }
|
||||
};
|
||||
poptContext optCon = poptGetContext (NULL, argc, argv, optionsTable, 0);
|
||||
|
||||
program_name = strrchr(argv[0],'/');
|
||||
program_name = program_name ? strdup(program_name+1) : strdup(argv[0]);
|
||||
|
||||
while ((opt = poptGetNextOpt (optCon)) >= 0) {
|
||||
;
|
||||
}
|
||||
if (opt < -1) {
|
||||
/* an error occurred during option processing */
|
||||
report(stderr, "%s: %s\n",
|
||||
poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
|
||||
poptStrerror(opt));
|
||||
free(program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
{
|
||||
const char *remaining_arg = poptGetArg(optCon);
|
||||
if ( remaining_arg != NULL) {
|
||||
if ( (poptGetArgs(optCon)) != NULL) {
|
||||
report( stderr, "%s: Source specified in previously %s and %s\n",
|
||||
program_name, source_name, remaining_arg );
|
||||
poptFreeContext(optCon);
|
||||
free(program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
while ((opt = getopt_long(argc, argv, optionsString, optionsTable, NULL)) >= 0) {
|
||||
switch (opt)
|
||||
{
|
||||
case 'd': opts.debug_level = atoi(optarg); break;
|
||||
case 'i': if (optarg != NULL) source_name = strdup(optarg); break;
|
||||
case 'f': opts.print_iso9660_short = 1; break;
|
||||
case 'l': opts.print_iso9660 = 1; break;
|
||||
case 'q': opts.silent = 1; break;
|
||||
case 'V': opts.version_only = 1; break;
|
||||
|
||||
case '?':
|
||||
fprintf(stderr, helpText, program_name);
|
||||
free(program_name);
|
||||
exit(EXIT_FAILURE);
|
||||
break;
|
||||
|
||||
case OP_USAGE:
|
||||
fprintf(stderr, usageText, program_name);
|
||||
free(program_name);
|
||||
exit(EXIT_FAILURE);
|
||||
break;
|
||||
|
||||
case OP_HANDLED:
|
||||
break;
|
||||
}
|
||||
source_name = strdup(remaining_arg);
|
||||
}
|
||||
|
||||
if (optind < argc) {
|
||||
const char *remaining_arg = argv[optind++];
|
||||
if ( optind < argc ) {
|
||||
report( stderr, "%s: Source specified in previously %s and %s\n",
|
||||
program_name, source_name, remaining_arg );
|
||||
free(program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
source_name = strdup(remaining_arg);
|
||||
}
|
||||
|
||||
poptFreeContext(optCon);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -286,7 +310,7 @@ init(void)
|
||||
/* ------------------------------------------------------------------------ */
|
||||
|
||||
int
|
||||
main(int argc, const char *argv[])
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
|
||||
iso9660_t *p_iso=NULL;
|
||||
|
||||
144
src/iso-read.c
144
src/iso-read.c
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
$Id: iso-read.c,v 1.9 2005/02/19 11:43:05 rocky Exp $
|
||||
$Id: iso-read.c,v 1.10 2005/10/05 09:48:12 rocky Exp $
|
||||
|
||||
Copyright (C) 2004, 2005 Rocky Bernstein <rocky@panix.com>
|
||||
|
||||
@@ -45,6 +45,8 @@
|
||||
#include <sys/types.h>
|
||||
#endif
|
||||
|
||||
#include <getopt.h>
|
||||
|
||||
/* Used by `main' to communicate with `parse_opt'. And global options
|
||||
*/
|
||||
struct arguments
|
||||
@@ -58,100 +60,112 @@ struct arguments
|
||||
|
||||
/* Parse a options. */
|
||||
static bool
|
||||
parse_options (int argc, const char *argv[])
|
||||
parse_options (int argc, char *argv[])
|
||||
{
|
||||
|
||||
int opt;
|
||||
|
||||
/* Configuration option codes */
|
||||
enum {
|
||||
OP_VERSION=1
|
||||
OP_HANDLED = 0,
|
||||
OP_VERSION=1,
|
||||
OP_USAGE
|
||||
};
|
||||
|
||||
const char* helpText =
|
||||
"Usage: %s [OPTION...]\n"
|
||||
" -d, --debug=INT Set debugging to LEVEL.\n"
|
||||
" -i, --image=FILE Read from ISO-9660 image. This option is mandatory\n"
|
||||
" -e, --extract=FILE Extract FILE from ISO-9660 image. This option is\n"
|
||||
" mandatory.\n"
|
||||
" --no-header Don't display header and copyright (for\n"
|
||||
" regression testing)\n"
|
||||
" -o, --output-file=FILE Output file. This option is mandatory.\n"
|
||||
" -V, --version display version and copyright information and exit\n"
|
||||
"\n"
|
||||
"Help options:\n"
|
||||
" -?, --help Show this help message\n"
|
||||
" --usage Display brief usage message\n";
|
||||
|
||||
/* Command-line options */
|
||||
struct poptOption optionsTable[] = {
|
||||
const char* usageText =
|
||||
"Usage: %s [-d|--debug INT] [-i|--image FILE] [-e|--extract FILE]\n"
|
||||
" [--no-header] [-o|--output-file FILE] [-V|--version] [-?|--help]\n"
|
||||
" [--usage]\n";
|
||||
|
||||
{"debug", 'd',
|
||||
POPT_ARG_INT, &opts.debug_level, 0,
|
||||
"Set debugging to LEVEL."},
|
||||
|
||||
{"image", 'i', POPT_ARG_STRING, &opts.iso9660_image, 0,
|
||||
"Read from ISO-9660 image. This option is mandatory",
|
||||
"FILE"},
|
||||
|
||||
{"extract", 'e', POPT_ARG_STRING, &opts.file_name, 0,
|
||||
"Extract FILE from ISO-9660 image. This option is mandatory.",
|
||||
"FILE"},
|
||||
|
||||
{"no-header", '\0', POPT_ARG_NONE, &opts.no_header,
|
||||
0, "Don't display header and copyright (for regression testing)"},
|
||||
/* Command-line options */
|
||||
const char* optionsString = "d:i:e:o:V?";
|
||||
struct option optionsTable[] = {
|
||||
{"debug", required_argument, NULL, 'd' },
|
||||
{"image", required_argument, NULL, 'i' },
|
||||
{"extract", required_argument, NULL, 'e' },
|
||||
{"no-header", no_argument, &opts.no_header, 1 },
|
||||
{"output-file", required_argument, NULL, 'o' },
|
||||
{"version", no_argument, NULL, 'V' },
|
||||
|
||||
{"output-file", 'o', POPT_ARG_STRING, &opts.output_file, 0,
|
||||
"Output file. This option is mandatory.", "FILE"},
|
||||
|
||||
{"version", 'V', POPT_ARG_NONE, NULL, OP_VERSION,
|
||||
"display version and copyright information and exit"},
|
||||
POPT_AUTOHELP {NULL, 0, 0, NULL, 0}
|
||||
{"help", no_argument, NULL, '?' },
|
||||
{"usage", no_argument, NULL, OP_USAGE },
|
||||
{ NULL, 0, NULL, 0 }
|
||||
};
|
||||
poptContext optCon = poptGetContext (NULL, argc, argv, optionsTable, 0);
|
||||
|
||||
program_name = strrchr(argv[0],'/');
|
||||
program_name = program_name ? strdup(program_name+1) : strdup(argv[0]);
|
||||
|
||||
while ((opt = poptGetNextOpt (optCon)) != -1)
|
||||
while ((opt = getopt_long(argc, argv, optionsString, optionsTable, NULL)) != -1)
|
||||
switch (opt)
|
||||
{
|
||||
case OP_VERSION:
|
||||
case 'd': opts.debug_level = atoi(optarg); break;
|
||||
case 'i': opts.iso9660_image = strdup(optarg); break;
|
||||
case 'e': opts.file_name = strdup(optarg); break;
|
||||
case 'o': opts.output_file = strdup(optarg); break;
|
||||
|
||||
case 'V':
|
||||
print_version(program_name, CDIO_VERSION, 0, true);
|
||||
poptFreeContext(optCon);
|
||||
free(program_name);
|
||||
exit (EXIT_SUCCESS);
|
||||
break;
|
||||
|
||||
default:
|
||||
report( stderr, "%s: %s\n",
|
||||
poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
|
||||
poptStrerror(opt) );
|
||||
report( stderr, "Error while parsing command line - try --help.\n" );
|
||||
poptFreeContext(optCon);
|
||||
free(program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
case '?':
|
||||
fprintf(stderr, helpText, program_name);
|
||||
free(program_name);
|
||||
exit(EXIT_FAILURE);
|
||||
break;
|
||||
|
||||
case OP_USAGE:
|
||||
fprintf(stderr, usageText, program_name);
|
||||
free(program_name);
|
||||
exit(EXIT_FAILURE);
|
||||
break;
|
||||
|
||||
case OP_HANDLED:
|
||||
break;
|
||||
}
|
||||
|
||||
{
|
||||
const char *remaining_arg = poptGetArg(optCon);
|
||||
if ( remaining_arg != NULL) {
|
||||
if (opts.iso9660_image != NULL) {
|
||||
report( stderr, "%s: Source specified as --image %s and as %s\n",
|
||||
program_name, opts.iso9660_image, remaining_arg );
|
||||
poptFreeContext(optCon);
|
||||
free(program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
opts.iso9660_image = strdup(remaining_arg);
|
||||
|
||||
if ( (poptGetArgs(optCon)) != NULL) {
|
||||
report( stderr,
|
||||
"%s: use only one unnamed argument for the ISO 9660 "
|
||||
"image name\n",
|
||||
program_name );
|
||||
poptFreeContext(optCon);
|
||||
free(program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
|
||||
}
|
||||
if (optind < argc) {
|
||||
const char *remaining_arg = argv[optind++];
|
||||
if (opts.iso9660_image != NULL) {
|
||||
report( stderr, "%s: Source specified as --image %s and as %s\n",
|
||||
program_name, opts.iso9660_image, remaining_arg );
|
||||
free(program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
opts.iso9660_image = strdup(remaining_arg);
|
||||
|
||||
if (optind < argc ) {
|
||||
report( stderr,
|
||||
"%s: use only one unnamed argument for the ISO 9660 "
|
||||
"image name\n",
|
||||
program_name );
|
||||
free(program_name);
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
|
||||
poptFreeContext(optCon);
|
||||
|
||||
if (NULL == opts.iso9660_image) {
|
||||
report( stderr, "%s: you need to specify an ISO-9660 image name.\n",
|
||||
program_name );
|
||||
program_name );
|
||||
report( stderr, "%s: Use option --image or try --help.\n",
|
||||
program_name );
|
||||
program_name );
|
||||
exit (EXIT_FAILURE);
|
||||
}
|
||||
|
||||
@@ -185,7 +199,7 @@ init(void)
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, const char *argv[])
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
iso9660_stat_t *statbuf;
|
||||
FILE *outfd;
|
||||
|
||||
13
src/util.h
13
src/util.h
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
$Id: util.h,v 1.12 2005/02/21 09:00:53 rocky Exp $
|
||||
$Id: util.h,v 1.13 2005/10/05 09:48:12 rocky Exp $
|
||||
|
||||
Copyright (C) 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com>
|
||||
|
||||
@@ -44,10 +44,13 @@
|
||||
#include <stdarg.h>
|
||||
#endif
|
||||
|
||||
#include <popt.h>
|
||||
/* Accomodate to older popt that doesn't support the "optional" flag */
|
||||
#ifndef POPT_ARGFLAG_OPTIONAL
|
||||
#define POPT_ARGFLAG_OPTIONAL 0
|
||||
/* FreeBSD 4 has getopt in unistd.h. So we include that before
|
||||
getopt.h */
|
||||
#ifdef HAVE_UNISTD_H
|
||||
#include <unistd.h>
|
||||
#endif
|
||||
#ifdef HAVE_GETOPT_H
|
||||
#include <getopt.h>
|
||||
#endif
|
||||
|
||||
#ifdef ENABLE_NLS
|
||||
|
||||
Reference in New Issue
Block a user