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:
rocky
2005-10-05 09:48:11 +00:00
parent e74fc3f8da
commit 16bdbf2615
17 changed files with 717 additions and 2005 deletions

View File

@@ -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)

View File

@@ -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;

View File

@@ -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;

View File

@@ -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@,

View File

@@ -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

View File

@@ -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 */

View File

@@ -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 */

View File

@@ -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;

View File

@@ -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;

View File

@@ -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;

View File

@@ -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