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

@@ -339,18 +339,6 @@
<File <File
RelativePath=".\src\findme.c"> RelativePath=".\src\findme.c">
</File> </File>
<File
RelativePath=".\src\popt.c">
</File>
<File
RelativePath=".\src\poptconfig.c">
</File>
<File
RelativePath=".\src\popthelp.c">
</File>
<File
RelativePath=".\src\poptparse.c">
</File>
<File <File
RelativePath=".\src\util.c"> RelativePath=".\src\util.c">
</File> </File>
@@ -362,9 +350,6 @@
<File <File
RelativePath=".\src\findme.h"> RelativePath=".\src\findme.h">
</File> </File>
<File
RelativePath=".\src\popt.h">
</File>
<File <File
RelativePath=".\src\util.h"> RelativePath=".\src\util.h">
</File> </File>

View File

@@ -1,4 +1,4 @@
# $Id: Makefile.am,v 1.35 2005/02/05 23:16:34 rocky Exp $ # $Id: Makefile.am,v 1.36 2005/10/05 09:48:11 rocky Exp $
# #
# Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com> # Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
# #
@@ -20,7 +20,7 @@
## which configure then turns into a Makefile ... ## which configure then turns into a Makefile ...
## which make can then use to produce stuff. Isn't configuration simple? ## which make can then use to produce stuff. Isn't configuration simple?
EXTRA_DIST = libpopt.m4 THANKS README.libcdio \ EXTRA_DIST = THANKS README.libcdio \
package/libcdio.spec.in package/libcdio.spec \ package/libcdio.spec.in package/libcdio.spec \
libcdio.pc.in libcdio.pc \ libcdio.pc.in libcdio.pc \
libcdio_cdda.pc.in libcdio_cdda.pc \ libcdio_cdda.pc.in libcdio_cdda.pc \

8
THANKS
View File

@@ -1,3 +1,6 @@
Burkhard Plaum <plaum@ipf.uni-stuttgart.de>
some GNU/Linux and CD-Text patches
Diego 'Flameeyes' Petten<65> Diego 'Flameeyes' Petten<65>
patches to FreeBSD and making Gentoo-friendly patches to FreeBSD and making Gentoo-friendly
@@ -30,8 +33,9 @@ Michael Kukat <michael at unixiron.org>,
Nicolas Boullis <nboullis at debian.org> Nicolas Boullis <nboullis at debian.org>
Build issues, library symbol versioning, Debian packaging and issues Build issues, library symbol versioning, Debian packaging and issues
Burkhard Plaum <plaum@ipf.uni-stuttgart.de> Peter J. Creath
some GNU/Linux and CD-Text patches removal of libpopt, paranoia documentation, some bug fixes to
cd-* programs and the paranoia lib
Steven M. Schultz <sms at 2BSD.COM> Steven M. Schultz <sms at 2BSD.COM>
All things BSDI and the use of a really fabulous Darwin G5 box. All things BSDI and the use of a really fabulous Darwin G5 box.

View File

@@ -19,7 +19,7 @@ define(RELEASE_NUM, 77)
define(CDIO_VERSION_STR, 0.$1cvs) define(CDIO_VERSION_STR, 0.$1cvs)
AC_PREREQ(2.52) AC_PREREQ(2.52)
AC_REVISION([$Id: configure.ac,v 1.172 2005/09/30 01:10:54 rocky Exp $])dnl AC_REVISION([$Id: configure.ac,v 1.173 2005/10/05 09:48:11 rocky Exp $])dnl
AC_INIT(libcdio, CDIO_VERSION_STR(RELEASE_NUM)) AC_INIT(libcdio, CDIO_VERSION_STR(RELEASE_NUM))
AC_CONFIG_SRCDIR(src/cd-info.c) AC_CONFIG_SRCDIR(src/cd-info.c)
@@ -152,14 +152,6 @@ AC_SUBST(CMP)
AC_PATH_PROG(OLD_CDPARANOIA, cdparanoia, no) AC_PATH_PROG(OLD_CDPARANOIA, cdparanoia, no)
AC_SUBST(OLD_CDPARANOIA) AC_SUBST(OLD_CDPARANOIA)
AM_PATH_LIBPOPT(,
[AC_MSG_WARN([Diagnostic programs cd-drive, cd-info, cd-read, iso-info, and is-read will not get built.])
enable_cd_info=no;
enable_cd_drive=no;
enable_cd_read=no;
enable_iso_info=no;
enable_iso_read=no])
AC_DEFINE(LIBCDIO_CONFIG_H, 1, AC_DEFINE(LIBCDIO_CONFIG_H, 1,
[Is set when libcdio's config.h has been included. Applications wishing to sue their own config.h values (such as set by the application's configure script can define this before including any of libcdio's headers.]) [Is set when libcdio's config.h has been included. Applications wishing to sue their own config.h values (such as set by the application's configure script can define this before including any of libcdio's headers.])
@@ -168,9 +160,12 @@ dnl headers
AC_HEADER_STDC AC_HEADER_STDC
AC_CHECK_HEADERS(errno.h fcntl.h glob.h pwd.h) AC_CHECK_HEADERS(errno.h fcntl.h glob.h pwd.h)
AC_CHECK_HEADERS(stdarg.h stdbool.h stdio.h sys/cdio.h sys/param.h) AC_CHECK_HEADERS(stdarg.h stdbool.h stdio.h sys/cdio.h sys/param.h)
AC_CHECK_HEADERS(ncurses.h curses.h, break, [enable_cdda_player='no']) AC_CHECK_HEADERS(ncurses.h curses.h, break, [enable_cdda_player='no'])
dnl FreeBSD 4 has getopt in unistd.h. So we include that before
dnl getopt.h
AC_CHECK_HEADERS(unistd.h getopt.h)
AC_SUBST(SBPCD_H) AC_SUBST(SBPCD_H)
AC_SUBST(UCDROM_H) AC_SUBST(UCDROM_H)
AC_SUBST(TYPESIZES) AC_SUBST(TYPESIZES)
@@ -188,38 +183,6 @@ AC_TRY_COMPILE([],[_Pragma("pack(1)")], [
],ISOC99_PRAGMA=no) ],ISOC99_PRAGMA=no)
AC_MSG_RESULT($ISOC99_PRAGMA) AC_MSG_RESULT($ISOC99_PRAGMA)
##
## Check for GNU getopt_long()
##
AC_MSG_CHECKING(for GNU getopt_long)
AC_TRY_RUN([
#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>
static struct option long_options[] = {
{"help" , no_argument, 0, 1 },
{"version" , no_argument, 0, 2 },
{0 , no_argument, 0, 0 }
};
int main(int argc, char **argv) {
int option_index = 0;
int c;
opterr = 0;
while((c = getopt_long(argc, argv, "?hv",
long_options, &option_index)) != EOF) {
}
return 0;
}
], [AC_MSG_RESULT(yes); ac_getopt_long=yes;
AC_DEFINE(HAVE_GETOPT_LONG, [],
[Define this if you have GNU getopt_long()])],
[AC_MSG_RESULT(no); ac_getopt_long=no],
[AC_MSG_RESULT(no); ac_getopt_long=no])
AM_CONDITIONAL(HAVE_GETOPT_LONG, test x"$ac_getopt_long" = "xyes")
## ##
## Check for S_ISSOCK() and S_ISLNK() macros ## Check for S_ISSOCK() and S_ISLNK() macros
## ##

View File

@@ -1,5 +1,5 @@
/* /*
$Id: osx.c,v 1.4 2005/09/30 00:01:09 rocky Exp $ $Id: osx.c,v 1.5 2005/10/05 09:48:12 rocky Exp $
Copyright (C) 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com> Copyright (C) 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com>
from vcdimager code: from vcdimager code:
@@ -34,7 +34,7 @@
#include "config.h" #include "config.h"
#endif #endif
static const char _rcsid[] = "$Id: osx.c,v 1.4 2005/09/30 00:01:09 rocky Exp $"; static const char _rcsid[] = "$Id: osx.c,v 1.5 2005/10/05 09:48:12 rocky Exp $";
#include <cdio/logging.h> #include <cdio/logging.h>
#include <cdio/sector.h> #include <cdio/sector.h>
@@ -1627,15 +1627,9 @@ cdio_get_devices_osx(void)
sizeof(psz_buf) - dev_path_length, sizeof(psz_buf) - dev_path_length,
kCFStringEncodingASCII ) ) kCFStringEncodingASCII ) )
{ {
CFRelease( str_bsd_path );
IOObjectRelease( next_media );
IOObjectRelease( media_iterator );
cdio_add_device_list(&drives, strdup(psz_buf), &num_drives); cdio_add_device_list(&drives, strdup(psz_buf), &num_drives);
} }
else CFRelease( str_bsd_path );
{
CFRelease( str_bsd_path );
}
IOObjectRelease( next_media ); IOObjectRelease( next_media );
} while( ( next_media = IOIteratorNext( media_iterator ) ) != 0 ); } while( ( next_media = IOIteratorNext( media_iterator ) ) != 0 );

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> # Copyright (C) 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com>
# #
@@ -42,42 +42,40 @@ endif
if BUILD_CD_DRIVE if BUILD_CD_DRIVE
cd_drive_SOURCES = cd-drive.c util.c util.h 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 bin_cd_drive = cd-drive
endif endif
if BUILD_CDINFO if BUILD_CDINFO
cd_info_SOURCES = cd-info.c cddb.c cddb.h util.c util.h 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 bin_cd_info = cd-info
endif endif
if BUILD_CDINFO_LINUX if BUILD_CDINFO_LINUX
cdinfo_linux_SOURCES = cdinfo-linux.c cdinfo_linux_SOURCES = cdinfo-linux.c
cdinfo_linux_LDADD = $(LIBCDIO_LIBS) $(LIBPOPT_LIBS) cdinfo_linux_LDADD = $(LIBCDIO_LIBS)
bin_cdinfo_linux = cdinfo-linux bin_cdinfo_linux = cdinfo-linux
endif endif
if BUILD_CD_READ if BUILD_CD_READ
cd_read_SOURCES = cd-read.c util.c util.h 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 bin_cd_read = cd-read
endif endif
if BUILD_ISO_INFO if BUILD_ISO_INFO
iso_info_SOURCES = iso-info.c util.c util.h 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 bin_iso_info = iso-info
endif endif
if BUILD_ISO_READ if BUILD_ISO_READ
iso_read_SOURCES = iso-read.c util.c util.h 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 bin_iso_read = iso-read
endif endif
bin_PROGRAMS = $(bin_cd_drive) $(bin_cd_info) $(bin_cdinfo_linux) $(bin_cd_read) $(bin_iso_info) $(bin_iso_read) $(bin_cdda_player) 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 INCLUDES = -I$(top_srcdir) $(LIBCDIO_CFLAGS) $(VCDINFO_CFLAGS) $(CDDB_CFLAGS)
# to those in LIBCDIO_CFLAGS
INCLUDES = -I$(top_srcdir) $(LIBCDIO_CFLAGS) $(VCDINFO_CFLAGS) $(CDDB_CFLAGS) $(LIBPOPT_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> Copyright (C) 2004, 2005 Rocky Bernstein <rocky@panix.com>
@@ -28,6 +28,7 @@
#ifdef HAVE_SYS_TYPES_H #ifdef HAVE_SYS_TYPES_H
#include <sys/types.h> #include <sys/types.h>
#endif #endif
#include <getopt.h>
#include <cdio/cdio.h> #include <cdio/cdio.h>
#include <cdio/scsi_mmc.h> #include <cdio/scsi_mmc.h>
@@ -43,44 +44,64 @@ struct arguments
/* Configuration option codes */ /* Configuration option codes */
enum { enum {
OP_HANDLED,
OP_SOURCE_DEVICE, OP_SOURCE_DEVICE,
OP_USAGE,
/* These are the remaining configuration options */ /* These are the remaining configuration options */
OP_VERSION, OP_VERSION,
}; };
/* Parse a all options. */ /* Parse all options. */
static bool static bool
parse_options (int argc, const char *argv[]) parse_options (int argc, char *argv[])
{ {
int opt; int opt;
struct poptOption optionsTable[] = { const char* helpText =
{"debug", 'd', POPT_ARG_INT, &opts.debug_level, 0, "Usage: %s [OPTION...]\n"
"Set debugging to LEVEL"}, " -d, --debug=INT Set debugging to LEVEL\n"
" -i, --cdrom-device[=DEVICE] show only info about CD-ROM device\n"
{"cdrom-device", 'i', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, " -q, --quiet Don't produce warning output\n"
&source_name, OP_SOURCE_DEVICE, " -V, --version display version and copyright information\n"
"show only info about CD-ROM device", "DEVICE"}, " and exit\n"
"\n"
{"quiet", 'q', POPT_ARG_NONE, &opts.silent, 0, "Help options:\n"
"Don't produce warning output" }, " -?, --help Show this help message\n"
" --usage Display brief usage message\n";
{"version", 'V', POPT_ARG_NONE, &opts.version_only, 0,
"display version and copyright information and exit"}, const char* usageText =
POPT_AUTOHELP {NULL, 0, 0, NULL, 0} "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 = strrchr(argv[0],'/');
program_name = program_name ? strdup(program_name+1) : strdup(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) { switch (opt) {
case 'd':
case OP_SOURCE_DEVICE: opts.debug_level = atoi(optarg);
break;
case 'i':
if (opts.source_image != DRIVER_UNKNOWN) { 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", report( stderr, "%s: another source type option given before.\n",
program_name ); program_name );
report( stderr, "%s: give only one source type option.\n", report( stderr, "%s: give only one source type option.\n",
@@ -88,44 +109,66 @@ parse_options (int argc, const char *argv[])
break; break;
} else { } else {
opts.source_image = DRIVER_DEVICE; opts.source_image = DRIVER_DEVICE;
source_name = fillout_device_name(source_name); if (optarg != NULL) {
source_name = fillout_device_name(optarg);
}
break; break;
} }
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: default:
poptFreeContext(optCon);
return false; return false;
} }
} }
{ if (optind < argc) {
const char *remaining_arg = poptGetArg(optCon); const char *remaining_arg = argv[optind++];
if ( remaining_arg != NULL) {
if (opts.source_image != DRIVER_UNKNOWN) { /* NOTE: A bug in the libpopt version checked source_image, which
report( stderr, "%s: Source specified in option %s and as %s\n", rendered the subsequent source_image test useless.
program_name, source_name, remaining_arg); */
poptFreeContext(optCon); if (source_name != NULL) {
free(program_name); report( stderr, "%s: Source specified in option %s and as %s\n",
exit (EXIT_FAILURE); program_name, source_name, remaining_arg);
} free(program_name);
exit (EXIT_FAILURE);
}
if (opts.source_image == DRIVER_DEVICE) if (opts.source_image == DRIVER_DEVICE)
source_name = fillout_device_name(remaining_arg); source_name = fillout_device_name(remaining_arg);
else else
source_name = strdup(remaining_arg); source_name = strdup(remaining_arg);
if ( (poptGetArgs(optCon)) != NULL) { if (optind < argc) {
report( stderr, "%s: Source specified in previously %s and %s\n", report( stderr, "%s: Source specified in previously %s and %s\n",
program_name, source_name, remaining_arg); program_name, source_name, remaining_arg);
poptFreeContext(optCon); free(program_name);
free(program_name); exit (EXIT_FAILURE);
exit (EXIT_FAILURE);
}
} }
} }
poptFreeContext(optCon);
return true; return true;
} }
@@ -187,7 +230,7 @@ init(void)
} }
int int
main(int argc, const char *argv[]) main(int argc, char *argv[])
{ {
CdIo_t *p_cdio=NULL; 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) 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com>
Copyright (C) 1996, 1997, 1998 Gerd Knorr <kraxel@bytesex.org> Copyright (C) 1996, 1997, 1998 Gerd Knorr <kraxel@bytesex.org>
@@ -27,6 +27,7 @@
#include "util.h" #include "util.h"
#include "cddb.h" #include "cddb.h"
#include <stdarg.h> #include <stdarg.h>
#include <getopt.h>
#ifdef HAVE_CDDB #ifdef HAVE_CDDB
#include <cddb/cddb.h> #include <cddb/cddb.h>
@@ -95,6 +96,7 @@ struct opts_s
/* Configuration option codes */ /* Configuration option codes */
enum { enum {
OP_HANDLED = 0,
OP_SOURCE_UNDEF, OP_SOURCE_UNDEF,
OP_SOURCE_AUTO, OP_SOURCE_AUTO,
@@ -103,7 +105,15 @@ enum {
OP_SOURCE_CDRDAO, OP_SOURCE_CDRDAO,
OP_SOURCE_NRG , OP_SOURCE_NRG ,
OP_SOURCE_DEVICE, 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 */ /* These are the remaining configuration options */
OP_VERSION, OP_VERSION,
@@ -111,236 +121,264 @@ enum {
char *temp_str; 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 static bool
parse_options (int argc, const char *argv[]) parse_options (int argc, char *argv[])
{ {
int opt; /* used for argument parsing */ int opt; /* used for argument parsing */
char *psz_my_source;
const char* helpText =
struct poptOption optionsTable[] = { "Usage: %s [OPTION...]\n"
{"access-mode", 'a', POPT_ARG_STRING, &opts.access_mode, 0, " -a, --access-mode=STRING Set CD access method\n"
"Set CD access methed"}, " -d, --debug=INT Set debugging to LEVEL\n"
" -T, --no-tracks Don't show track information\n"
{"debug", 'd', POPT_ARG_INT, &opts.debug_level, 0, " -A, --no-analyze Don't filesystem analysis\n"
"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"},
#ifdef HAVE_CDDB #ifdef HAVE_CDDB
{"no-cddb", '\0', POPT_ARG_NONE, &opts.no_cddb, 0, " --no-cddb Don't look up audio CDDB information\n"
"Don't look up audio CDDB information or print that"}, " or print it\n"
" -P, --cddb-port=INT CDDB port number to use (default 8880)\n"
{"cddb-port", 'P', POPT_ARG_INT, &cddb_opts.port, 8880, " -H, --cddb-http Lookup CDDB via HTTP proxy (default no\n"
"CDDB port number to use (default 8880)"}, " proxy)\n"
" --cddb-server=STRING CDDB server to contact for information\n"
{"cddb-http", 'H', POPT_ARG_NONE, &cddb_opts.http, 0, " (default: freedb.freedb.org)\n"
"Lookup CDDB via HTTP proxy (default no proxy)"}, " --cddb-cache=STRING Location of CDDB cache directory\n"
" (default ~/.cddbclient)\n"
{"cddb-server", '\0', POPT_ARG_STRING, &cddb_opts.server, 0, " --cddb-email=STRING Email address to give CDDB server\n"
"CDDB server to contact for information (default: freedb.freedb.org)"}, " (default me@home)\n"
" --no-cddb-cache Disable caching of CDDB entries\n"
{"cddb-cache", '\0', POPT_ARG_STRING, &cddb_opts.cachedir, 0, " locally (default caches)\n"
"Location of CDDB cache directory (default ~/.cddbclient)"}, " --cddb-timeout=INT CDDB timeout value in seconds\n"
" (default 10 seconds)\n"
{"cddb-email", '\0', POPT_ARG_STRING, &cddb_opts.email, 0, #else
"Email address to give CDDB server (default me@home"}, " --no-cddb Does nothing since this program is not\n"
" -P, --cddb-port=INT CDDB-enabled\n"
{"no-cddb-cache", '\0', POPT_ARG_NONE, &cddb_opts.disable_cache, 0, " -H, --cddb-http\n"
"Lookup CDDB via HTTP proxy (default no proxy)"}, " --cddb-server=STRING\n"
" --cddb-cache=STRING\n"
{"cddb-timeout", '\0', POPT_ARG_INT, &cddb_opts.timeout, 0, " --cddb-email=STRING\n"
"CDDB timeout value in seconds (default 10 seconds)"}, " --no-cddb-cache\n"
#else " --cddb-timeout=INT\n"
{"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"},
#endif #endif
" --no-device-info Don't show device info, just CD info\n"
{"no-device-info", '\0', POPT_ARG_NONE, &opts.no_device, 0, " --no-disc-mode Don't show disc-mode info\n"
"Don't show device info, just CD info"}, " --dvd Attempt to give DVD information if a DVD is\n"
" found.\n"
{"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."},
#ifdef HAVE_VCDINFO #ifdef HAVE_VCDINFO
{"no-vcd", 'v', POPT_ARG_NONE, &opts.no_vcd, 0, " -v, --no-vcd Don't look up Video CD information\n"
"Don't look up Video CD information"}, #else
#else " -v, --no-vcd Don't look up Video CD information - for\n"
{"no-vcd", 'v', POPT_ARG_NONE, &opts.no_vcd, 1, " this build, this is always set\n"
"Don't look up Video CD information - for this build, this is always set"},
#endif #endif
{"no-ioctl", 'I', POPT_ARG_NONE, &opts.no_ioctl, 0, " -I, --no-ioctl Don't show ioctl() information\n"
"Don't show ioctl() information"}, " -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"
{"bin-file", 'b', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, &psz_my_source, " -N, --nrg-file[=FILE] set Nero CD-ROM disk image file as source\n"
OP_SOURCE_BIN, "set \"bin\" CD-ROM disk image file as source", "FILE"}, " -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"
{"cue-file", 'c', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, &psz_my_source, " device\n"
OP_SOURCE_CUE, "set \"cue\" CD-ROM disk image file as source", "FILE"}, " --iso9660 print directory contents of any ISO-9660\n"
" filesystems\n"
{"nrg-file", 'N', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, &psz_my_source, " -C, --cdrom-device[=DEVICE] set CD-ROM device as source\n"
OP_SOURCE_NRG, "set Nero CD-ROM disk image file as source", "FILE"}, " -l, --list-drives Give a list of CD-drives\n"
" --no-header Don't display header and copyright (for\n"
{"toc-file", 't', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, &psz_my_source, " regression testing)\n"
OP_SOURCE_CDRDAO, "set cdrdao CD-ROM disk image file as source", "FILE"}, #ifdef HAVE_JOLIET
" --no-joliet Don't use Joliet extensions\n"
{"input", 'i', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, &psz_my_source, #endif
OP_SOURCE_AUTO, " --no-rock-ridge Don't use Rock-Ridge-extension information\n"
"set source and determine if \"bin\" image or device", "FILE"}, " --no-xa Don't use XA-extension information\n"
" -q, --quiet Don't produce warning output\n"
{"iso9660", '\0', POPT_ARG_NONE, &opts.print_iso9660, 0, " -V, --version display version and copyright information\n"
"print directory contents of any ISO-9660 filesystems"}, " and exit\n"
"\n"
{"cdrom-device", 'C', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, &source_name, "Help options:\n"
OP_SOURCE_DEVICE, " -?, --help Show this help message\n"
"set CD-ROM device as source", "DEVICE"}, " --usage Display brief usage message\n";
{"list-drives", 'l', POPT_ARG_NONE, &opts.list_drives, 0, const char* usageText =
"Give a list of CD-drives" }, "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"
{"no-header", '\0', POPT_ARG_NONE, &opts.no_header, " [--cddb-server=STRING] [--cddb-cache=STRING] [--cddb-email=STRING]\n"
0, "Don't display header and copyright (for regression testing)"}, " [--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 #ifdef HAVE_JOLIET
{"no-joliet", '\0', POPT_ARG_NONE, &opts.no_joliet, {"no-joliet", no_argument, &opts.no_joliet, 1 },
0, "Don't use Joliet extensions"},
#endif /*HAVE_JOLIET*/ #endif /*HAVE_JOLIET*/
{"no-rock-ridge", no_argument, &opts.no_rock_ridge, 1 },
{"no-rock-ridge", '\0', POPT_ARG_NONE, &opts.no_rock_ridge, {"no-xa", no_argument, &opts.no_xa, 1 },
0, "Don't use Rock-Ridge-extension information"}, {"quiet", no_argument, NULL, 'q' },
{"version", no_argument, NULL, 'V' },
{"no-xa", '\0', POPT_ARG_NONE, &opts.no_xa, {"help", no_argument, NULL, '?' },
0, "Don't use XA-extension information"}, {"usage", no_argument, NULL, OP_USAGE },
{ NULL, 0, NULL, 0 }
{"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}
}; };
poptContext optCon = poptGetContext (NULL, argc, argv, optionsTable, 0);
program_name = strrchr(argv[0],'/'); program_name = strrchr(argv[0],'/');
program_name = program_name ? strdup(program_name+1) : strdup(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) { switch (opt) {
case 'a': opts.access_mode = strdup(optarg); break;
case OP_SOURCE_AUTO: case 'd': opts.debug_level = atoi(optarg); break;
case OP_SOURCE_BIN: case 'T': opts.no_tracks = 1; break;
case OP_SOURCE_CUE: case 'A': opts.no_analysis = 1; break;
case OP_SOURCE_CDRDAO: case 'P': cddb_opts.port = atoi(optarg); break;
case OP_SOURCE_NRG: case 'H': cddb_opts.http = 1; break;
case OP_SOURCE_DEVICE: case OP_CDDB_SERVER: cddb_opts.server = strdup(optarg); break;
if (opts.source_image != INPUT_UNKNOWN) { case OP_CDDB_CACHE: cddb_opts.cachedir = strdup(optarg); break;
report(stderr, "%s: another source type option given before.\n", case OP_CDDB_EMAIL: cddb_opts.email = strdup(optarg); break;
program_name); case OP_CDDB_NOCACHE: cddb_opts.disable_cache = 1; break;
report(stderr, "%s: give only one source type option.\n", case OP_CDDB_TIMEOUT: cddb_opts.timeout = atoi(optarg); break;
program_name); case 'v': opts.no_vcd = 1; break;
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 case '?':
a copy of the string; for a DEVICE the fill-out routine makes fprintf(stderr, helpText, program_name);
the copy. free(program_name);
*/ exit(EXIT_FAILURE);
if (OP_SOURCE_DEVICE != opt) break;
source_name = strdup(psz_my_source);
case OP_USAGE:
switch (opt) { fprintf(stderr, usageText, program_name);
case OP_SOURCE_BIN: free(program_name);
opts.source_image = INPUT_BIN; exit(EXIT_FAILURE);
break; break;
case OP_SOURCE_CUE:
opts.source_image = INPUT_CUE; case OP_HANDLED:
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;
}
break; break;
} }
} }
if (opt < -1) {
/* an error occurred during option processing */ if (optind < argc) {
report(stderr, "%s: %s\n", const char *remaining_arg = argv[optind++];
poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
poptStrerror(opt)); /* 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); free(program_name);
exit (EXIT_FAILURE); 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; return true;
} }
/* CDIO logging routines */ /* CDIO logging routines */
#ifdef HAVE_CDDB #ifdef HAVE_CDDB
@@ -764,7 +802,7 @@ init(void)
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
int int
main(int argc, const char *argv[]) main(int argc, char *argv[])
{ {
CdIo_t *p_cdio=NULL; 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) 2004, 2005 Rocky Bernstein <rocky@panix.com>
# Copyright (C) 1998 Monty xiphmont@mit.edu # Copyright (C) 1998 Monty xiphmont@mit.edu
@@ -19,17 +19,11 @@
# #
############################################################################### ###############################################################################
if HAVE_GETOPT_LONG EXTRA_DIST = usage.txt.in usage-copy.h pod2c.pl \
else
getopt_sources = getopt.c getopt1.c
endif
EXTRA_DIST = getopt.c getopt1.c \
usage.txt.in usage-copy.h pod2c.pl \
doc/FAQ.txt doc/overlapdef.txt 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@, transform = s,cd-paranoia,@CDPARANOIA_NAME@,

View File

@@ -76,7 +76,14 @@
#include <fcntl.h> #include <fcntl.h>
#endif #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> #include <getopt.h>
#endif
#ifdef HAVE_ERRNO_H #ifdef HAVE_ERRNO_H
#include <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> Copyright (C) 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com>
@@ -34,15 +34,19 @@
/* Configuration option codes */ /* Configuration option codes */
enum { enum {
OP_HANDLED = 0,
/* These correspond to driver_id_t in cdio.h and have to MATCH! */ /* NOTE: libpopt version associated these with drivers. That
OP_SOURCE_UNDEF = DRIVER_UNKNOWN, appeared to be an unused historical artifact.
*/
OP_SOURCE_AUTO, OP_SOURCE_AUTO,
OP_SOURCE_BIN, OP_SOURCE_BIN,
OP_SOURCE_CUE, OP_SOURCE_CUE,
OP_SOURCE_NRG = DRIVER_NRG, OP_SOURCE_NRG,
OP_SOURCE_CDRDAO = DRIVER_CDRDAO, OP_SOURCE_CDRDAO,
OP_SOURCE_DEVICE = DRIVER_DEVICE, OP_SOURCE_DEVICE,
OP_USAGE,
/* These are the remaining configuration options */ /* These are the remaining configuration options */
OP_READ_MODE, 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. */ /* Parse a options. */
static bool static bool
parse_options (int argc, const char *argv[]) parse_options (int argc, char *argv[])
{ {
int opt; int opt;
char *psz_my_source;
char *opt_arg;
/* Command-line options */ const char* helpText =
struct poptOption optionsTable[] = { "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, const char* usageText =
"Set CD control access mode"}, "Usage: %s [-a|--access-mode STRING] [-m|--mode MODE-TYPE]\n"
" [-d|--debug INT] [-x|--hexdump] [--no-header] [--no-hexdump]\n"
{"mode", 'm', " [-s|--start INT] [-e|--end INT] [-n|--number INT] [-b|--bin-file FILE]\n"
POPT_ARG_STRING, &opt_arg, " [-c|--cue-file FILE] [-i|--input FILE] [-C|--cdrom-device DEVICE]\n"
OP_READ_MODE, " [-N|--nrg-file FILE] [-t|--toc-file FILE] [-o|--output-file FILE]\n"
"set CD-ROM read mode (audio, m1f1, m1f2, m2mf1, m2f2)", " [-V|--version] [-?|--help] [--usage]\n";
"MODE-TYPE"},
/* Command-line options */
{"debug", 'd', const char* optionsString = "a:m:d:xs:e:n:b::c::i::C::N::t::o:V?";
POPT_ARG_INT, &opts.debug_level, 0, struct option optionsTable[] = {
"Set debugging to LEVEL"},
{"access-mode", required_argument, NULL, 'a'},
{"hexdump", 'x', POPT_ARG_NONE, &opts.hexdump, 0, {"mode", required_argument, NULL, 'm'},
"Show output as a hex dump. The default is a hex dump when " {"debug", required_argument, NULL, 'd'},
"output goes to stdout and no hex dump when output is to a file."}, {"hexdump", no_argument, NULL, 'x'},
{"no-header", no_argument, &opts.no_header, 1},
{"no-header", '\0', POPT_ARG_NONE, &opts.no_header, {"no-hexdump", no_argument, &opts.nohexdump, 1},
0, "Don't display header and copyright (for regression testing)"}, {"start", required_argument, NULL, 's'},
{"end", required_argument, NULL, 'e'},
{"no-hexdump", '\0', POPT_ARG_NONE, &opts.nohexdump, 0, {"number", required_argument, NULL, 'n'},
"Don't show output as a hex dump."}, {"bin-file", optional_argument, NULL, 'b'},
{"cue-file", optional_argument, NULL, 'c'},
{"start", 's', {"input", optional_argument, NULL, 'i'},
POPT_ARG_INT, &opts.start_lsn, 0, {"cdrom-device", optional_argument, NULL, 'C'},
"Set LBA to start reading from"}, {"nrg-file", optional_argument, NULL, 'N'},
{"toc-file", optional_argument, NULL, 't'},
{"end", 'e', {"output-file", required_argument, NULL, 'o'},
POPT_ARG_INT, &opts.end_lsn, 0, {"version", no_argument, NULL, 'V'},
"Set LBA to end reading from"},
{"help", no_argument, NULL, '?' },
{"number", 'n', {"usage", no_argument, NULL, OP_USAGE },
POPT_ARG_INT, &opts.num_sectors, 0, { NULL, 0, NULL, 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}
}; };
poptContext optCon = poptGetContext (NULL, argc, argv, optionsTable, 0);
program_name = strrchr(argv[0],'/'); program_name = strrchr(argv[0],'/');
program_name = program_name ? strdup(program_name+1) : strdup(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) switch (opt)
{ {
case OP_SOURCE_AUTO: case 'a': opts.access_mode = strdup(optarg); break;
case OP_SOURCE_BIN: case 'd': opts.debug_level = atoi(optarg); break;
case OP_SOURCE_CUE: case 'x': opts.hexdump = 1; break;
case OP_SOURCE_NRG: case 's': opts.start_lsn = atoi(optarg); break;
case OP_SOURCE_DEVICE: case 'e': opts.end_lsn = atoi(optarg); break;
if (opts.source_image != INPUT_UNKNOWN) { case 'n': opts.num_sectors = atoi(optarg); break;
report( stderr, "%s: another source type option given before.\n", case 'b': parse_source(OP_SOURCE_BIN); break;
program_name ); case 'c': parse_source(OP_SOURCE_CUE); break;
report( stderr, "%s: give only one source type option.\n", case 'i': parse_source(OP_SOURCE_AUTO); break;
program_name ); case 'C': parse_source(OP_SOURCE_DEVICE); break;
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;
/* 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 case 'm':
the copy. process_suboption(optarg, modes_sublist,
*/
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,
sizeof(modes_sublist) / sizeof(subopt_entry_t), sizeof(modes_sublist) / sizeof(subopt_entry_t),
"--mode"); "--mode");
break; break;
case OP_VERSION:
case 'V':
print_version(program_name, VERSION, 0, true); print_version(program_name, VERSION, 0, true);
poptFreeContext(optCon);
free(program_name); free(program_name);
exit (EXIT_SUCCESS); exit (EXIT_SUCCESS);
break; 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) { if (optind < argc) {
report( stderr, "%s: %s\n", const char *remaining_arg = argv[optind++];
poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
poptStrerror(opt) ); /* NOTE: A bug in the libpopt version checked source_image, which
free(program_name); rendered the subsequent source_image test useless.
exit (EXIT_FAILURE); */
} if (source_name != NULL) {
report( stderr, "%s: Source specified in option %s and as %s\n",
{ program_name, source_name, remaining_arg );
const char *remaining_arg = poptGetArg(optCon); free(program_name);
if ( remaining_arg != NULL) { exit (EXIT_FAILURE);
if (opts.source_image != INPUT_UNKNOWN) { }
report( stderr, "%s: Source specified in option %s and as %s\n",
program_name, source_name, remaining_arg ); if (opts.source_image == INPUT_DEVICE)
poptFreeContext(optCon); source_name = fillout_device_name(remaining_arg);
free(program_name); else
exit (EXIT_FAILURE); source_name = strdup(remaining_arg);
}
if (opts.source_image == OP_SOURCE_DEVICE) if (optind < argc) {
source_name = fillout_device_name(remaining_arg); report( stderr, "%s: Source specified in previously %s and %s\n",
else program_name, source_name, remaining_arg );
source_name = strdup(remaining_arg); free(program_name);
exit (EXIT_FAILURE);
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);
}
} }
} }
@@ -354,7 +383,6 @@ parse_options (int argc, const char *argv[])
"%s: Need to give a read mode " "%s: Need to give a read mode "
"(audio, m1f1, m1f2, m2f1 or m2f2)\n", "(audio, m1f1, m1f2, m2f1 or m2f2)\n",
program_name ); program_name );
poptFreeContext(optCon);
free(program_name); free(program_name);
exit(10); exit(10);
} }
@@ -382,7 +410,6 @@ parse_options (int argc, const char *argv[])
" the sector to read (%lu)\n", " the sector to read (%lu)\n",
program_name, (unsigned long) opts.end_lsn, program_name, (unsigned long) opts.end_lsn,
(unsigned long) opts.num_sectors ); (unsigned long) opts.num_sectors );
poptFreeContext(optCon);
exit(12); exit(12);
} }
opts.start_lsn = opts.end_lsn - opts.num_sectors + 1; 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", "%s: end LSN (%lu) needs to be less than start LSN (%lu)\n",
program_name, (unsigned long) opts.start_lsn, program_name, (unsigned long) opts.start_lsn,
(unsigned long) opts.end_lsn ); (unsigned long) opts.end_lsn );
poptFreeContext(optCon);
free(program_name); free(program_name);
exit(13); exit(13);
} }
@@ -412,14 +438,12 @@ parse_options (int argc, const char *argv[])
"and count (%d)\n", "and count (%d)\n",
program_name, (unsigned long) opts.start_lsn, program_name, (unsigned long) opts.start_lsn,
(unsigned long) opts.end_lsn, opts.num_sectors ); (unsigned long) opts.end_lsn, opts.num_sectors );
poptFreeContext(optCon);
free(program_name); free(program_name);
exit(14); exit(14);
} }
opts.num_sectors = opts.end_lsn - opts.start_lsn + 1; opts.num_sectors = opts.end_lsn - opts.start_lsn + 1;
} }
poptFreeContext(optCon);
return true; return true;
} }
@@ -454,7 +478,7 @@ init(void)
} }
int int
main(int argc, const char *argv[]) main(int argc, char *argv[])
{ {
uint8_t buffer[CDIO_CD_FRAMESIZE_RAW] = { 0, }; uint8_t buffer[CDIO_CD_FRAMESIZE_RAW] = { 0, };
unsigned int blocklen=CDIO_CD_FRAMESIZE_RAW; 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> Copyright (C) 2004, 2005 Rocky Bernstein <rocky@panix.com>
@@ -47,6 +47,7 @@
#include <errno.h> #include <errno.h>
#include <getopt.h>
#if 0 #if 0
#define STRONG "\033[1m" #define STRONG "\033[1m"
@@ -73,7 +74,10 @@ struct arguments
/* Configuration option codes */ /* Configuration option codes */
enum { enum {
OP_HANDLED = 0,
OP_USAGE,
/* These are the remaining configuration options */ /* These are the remaining configuration options */
OP_VERSION, OP_VERSION,
@@ -84,75 +88,95 @@ char *temp_str;
/* Parse a all options. */ /* Parse a all options. */
static bool static bool
parse_options (int argc, const char *argv[]) parse_options (int argc, char *argv[])
{ {
int opt; int opt;
struct poptOption optionsTable[] = { const char* helpText =
{"debug", 'd', POPT_ARG_INT, &opts.debug_level, 0, "Usage: %s [OPTION...]\n"
"Set debugging to LEVEL"}, " -d, --debug=INT Set debugging to LEVEL\n"
" -i, --input[=FILE] Filename to read ISO-9960 image from\n"
{"input", 'i', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, &source_name, 0, " -f Generate output similar to 'find . -print'\n"
"Filename to read ISO-9960 image from", "FILE"}, " -l, --iso9660 Generate output similar to 'ls -lR'\n"
" --no-header Don't display header and copyright (for regression\n"
{'\0', 'f', POPT_ARG_NONE, &opts.print_iso9660_short, 0, " testing)\n"
"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)"},
#ifdef HAVE_JOLIET #ifdef HAVE_JOLIET
{"no-joliet", '\0', POPT_ARG_NONE, &opts.no_joliet, " --no-joliet Don't use Joliet-extension information\n"
0, "Don't use Joliet-extension information"},
#endif /*HAVE_JOLIET*/ #endif /*HAVE_JOLIET*/
" --no-rock-ridge Don't use Rock-Ridge-extension information\n"
{"no-rock-ridge", '\0', POPT_ARG_NONE, &opts.no_rock_ridge, " --no-xa Don't use XA-extension information\n"
0, "Don't use Rock-Ridge-extension information"}, " -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, const char* usageText =
0, "Don't use XA-extension information"}, "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, const char* optionsString = "d:i::flqV?";
"Don't produce warning output" }, struct option optionsTable[] = {
{"debug", required_argument, NULL, 'd'},
{"version", 'V', POPT_ARG_NONE, &opts.version_only, 0, {"input", optional_argument, NULL, 'i'},
"display version and copyright information and exit"}, {"iso9660", no_argument, NULL, 'l'},
POPT_AUTOHELP {NULL, 0, 0, NULL, 0} {"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 = strrchr(argv[0],'/');
program_name = program_name ? strdup(program_name+1) : strdup(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)
} {
if (opt < -1) { case 'd': opts.debug_level = atoi(optarg); break;
/* an error occurred during option processing */ case 'i': if (optarg != NULL) source_name = strdup(optarg); break;
report(stderr, "%s: %s\n", case 'f': opts.print_iso9660_short = 1; break;
poptBadOption(optCon, POPT_BADOPTION_NOALIAS), case 'l': opts.print_iso9660 = 1; break;
poptStrerror(opt)); case 'q': opts.silent = 1; break;
free(program_name); case 'V': opts.version_only = 1; break;
exit (EXIT_FAILURE);
} case '?':
{ fprintf(stderr, helpText, program_name);
const char *remaining_arg = poptGetArg(optCon); free(program_name);
if ( remaining_arg != NULL) { exit(EXIT_FAILURE);
if ( (poptGetArgs(optCon)) != NULL) { break;
report( stderr, "%s: Source specified in previously %s and %s\n",
program_name, source_name, remaining_arg ); case OP_USAGE:
poptFreeContext(optCon); fprintf(stderr, usageText, program_name);
free(program_name); free(program_name);
exit (EXIT_FAILURE); 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; return true;
} }
@@ -286,7 +310,7 @@ init(void)
/* ------------------------------------------------------------------------ */ /* ------------------------------------------------------------------------ */
int int
main(int argc, const char *argv[]) main(int argc, char *argv[])
{ {
iso9660_t *p_iso=NULL; 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> Copyright (C) 2004, 2005 Rocky Bernstein <rocky@panix.com>
@@ -45,6 +45,8 @@
#include <sys/types.h> #include <sys/types.h>
#endif #endif
#include <getopt.h>
/* Used by `main' to communicate with `parse_opt'. And global options /* Used by `main' to communicate with `parse_opt'. And global options
*/ */
struct arguments struct arguments
@@ -58,100 +60,112 @@ struct arguments
/* Parse a options. */ /* Parse a options. */
static bool static bool
parse_options (int argc, const char *argv[]) parse_options (int argc, char *argv[])
{ {
int opt; int opt;
/* Configuration option codes */ /* Configuration option codes */
enum { 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 */ const char* usageText =
struct poptOption optionsTable[] = { "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', /* Command-line options */
POPT_ARG_INT, &opts.debug_level, 0, const char* optionsString = "d:i:e:o:V?";
"Set debugging to LEVEL."}, struct option optionsTable[] = {
{"debug", required_argument, NULL, 'd' },
{"image", 'i', POPT_ARG_STRING, &opts.iso9660_image, 0, {"image", required_argument, NULL, 'i' },
"Read from ISO-9660 image. This option is mandatory", {"extract", required_argument, NULL, 'e' },
"FILE"}, {"no-header", no_argument, &opts.no_header, 1 },
{"output-file", required_argument, NULL, 'o' },
{"extract", 'e', POPT_ARG_STRING, &opts.file_name, 0, {"version", no_argument, NULL, 'V' },
"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)"},
{"output-file", 'o', POPT_ARG_STRING, &opts.output_file, 0, {"help", no_argument, NULL, '?' },
"Output file. This option is mandatory.", "FILE"}, {"usage", no_argument, NULL, OP_USAGE },
{ NULL, 0, NULL, 0 }
{"version", 'V', POPT_ARG_NONE, NULL, OP_VERSION,
"display version and copyright information and exit"},
POPT_AUTOHELP {NULL, 0, 0, NULL, 0}
}; };
poptContext optCon = poptGetContext (NULL, argc, argv, optionsTable, 0);
program_name = strrchr(argv[0],'/'); program_name = strrchr(argv[0],'/');
program_name = program_name ? strdup(program_name+1) : strdup(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) 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); print_version(program_name, CDIO_VERSION, 0, true);
poptFreeContext(optCon);
free(program_name); free(program_name);
exit (EXIT_SUCCESS); exit (EXIT_SUCCESS);
break; break;
default: case '?':
report( stderr, "%s: %s\n", fprintf(stderr, helpText, program_name);
poptBadOption(optCon, POPT_BADOPTION_NOALIAS), free(program_name);
poptStrerror(opt) ); exit(EXIT_FAILURE);
report( stderr, "Error while parsing command line - try --help.\n" ); break;
poptFreeContext(optCon);
free(program_name); case OP_USAGE:
exit (EXIT_FAILURE); fprintf(stderr, usageText, program_name);
free(program_name);
exit(EXIT_FAILURE);
break;
case OP_HANDLED:
break;
} }
{ if (optind < argc) {
const char *remaining_arg = poptGetArg(optCon); const char *remaining_arg = argv[optind++];
if ( remaining_arg != NULL) { if (opts.iso9660_image != NULL) {
if (opts.iso9660_image != NULL) { report( stderr, "%s: Source specified as --image %s and as %s\n",
report( stderr, "%s: Source specified as --image %s and as %s\n", program_name, opts.iso9660_image, remaining_arg );
program_name, opts.iso9660_image, remaining_arg ); free(program_name);
poptFreeContext(optCon); exit (EXIT_FAILURE);
free(program_name); }
exit (EXIT_FAILURE);
} opts.iso9660_image = strdup(remaining_arg);
opts.iso9660_image = strdup(remaining_arg); if (optind < argc ) {
report( stderr,
if ( (poptGetArgs(optCon)) != NULL) { "%s: use only one unnamed argument for the ISO 9660 "
report( stderr, "image name\n",
"%s: use only one unnamed argument for the ISO 9660 " program_name );
"image name\n", free(program_name);
program_name ); exit (EXIT_FAILURE);
poptFreeContext(optCon);
free(program_name);
exit (EXIT_FAILURE);
}
} }
} }
poptFreeContext(optCon);
if (NULL == opts.iso9660_image) { if (NULL == opts.iso9660_image) {
report( stderr, "%s: you need to specify an ISO-9660 image name.\n", 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", report( stderr, "%s: Use option --image or try --help.\n",
program_name ); program_name );
exit (EXIT_FAILURE); exit (EXIT_FAILURE);
} }
@@ -185,7 +199,7 @@ init(void)
} }
int int
main(int argc, const char *argv[]) main(int argc, char *argv[])
{ {
iso9660_stat_t *statbuf; iso9660_stat_t *statbuf;
FILE *outfd; 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> Copyright (C) 2003, 2004, 2005 Rocky Bernstein <rocky@panix.com>
@@ -44,10 +44,13 @@
#include <stdarg.h> #include <stdarg.h>
#endif #endif
#include <popt.h> /* FreeBSD 4 has getopt in unistd.h. So we include that before
/* Accomodate to older popt that doesn't support the "optional" flag */ getopt.h */
#ifndef POPT_ARGFLAG_OPTIONAL #ifdef HAVE_UNISTD_H
#define POPT_ARGFLAG_OPTIONAL 0 #include <unistd.h>
#endif
#ifdef HAVE_GETOPT_H
#include <getopt.h>
#endif #endif
#ifdef ENABLE_NLS #ifdef ENABLE_NLS