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"
" -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";
{"cdrom-device", 'i', POPT_ARG_STRING|POPT_ARGFLAG_OPTIONAL, const char* usageText =
&source_name, OP_SOURCE_DEVICE, "Usage: %s [-d|--debug INT] [-i|--cdrom-device DEVICE] [-q|--quiet]\n"
"show only info about CD-ROM device", "DEVICE"}, " [-V|--version] [-?|--help] [--usage]\n";
{"quiet", 'q', POPT_ARG_NONE, &opts.silent, 0, const char* optionsString = "d:i::qV?";
"Don't produce warning output" }, struct option optionsTable[] = {
{"debug", required_argument, NULL, 'd' },
{"version", 'V', POPT_ARG_NONE, &opts.version_only, 0, {"cdrom-device", optional_argument, NULL, 'i' },
"display version and copyright information and exit"}, {"quiet", no_argument, NULL, 'q' },
POPT_AUTOHELP {NULL, 0, 0, NULL, 0} {"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':
opts.debug_level = atoi(optarg);
break;
case OP_SOURCE_DEVICE: 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,23 +109,49 @@ 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
rendered the subsequent source_image test useless.
*/
if (source_name != NULL) {
report( stderr, "%s: Source specified in option %s and as %s\n", report( stderr, "%s: Source specified in option %s and as %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);
} }
@@ -114,18 +161,14 @@ parse_options (int argc, const char *argv[])
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,
@@ -104,6 +106,14 @@ enum {
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,162 +121,21 @@ enum {
char *temp_str; char *temp_str;
/* Parse a all options. */ /* Parse source options. */
static bool static void
parse_options (int argc, const char *argv[]) parse_source(int opt)
{ {
int opt; /* used for argument parsing */ /* NOTE: The libpopt version made use of an extra temporary
char *psz_my_source; variable (psz_my_source) for all sources _except_ devices.
This distinction seemed to serve no purpose.
*/
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"},
#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"},
#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."},
#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"},
#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)"},
#ifdef HAVE_JOLIET
{"no-joliet", '\0', POPT_ARG_NONE, &opts.no_joliet,
0, "Don't use Joliet extensions"},
#endif /*HAVE_JOLIET*/
{"no-rock-ridge", '\0', POPT_ARG_NONE, &opts.no_rock_ridge,
0, "Don't use Rock-Ridge-extension information"},
{"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}
};
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) {
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) { if (opts.source_image != INPUT_UNKNOWN) {
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",
program_name); program_name);
break; return;
} }
/* For all input sources which are not a DEVICE, we need to make /* For all input sources which are not a DEVICE, we need to make
@@ -274,7 +143,7 @@ parse_options (int argc, const char *argv[])
the copy. the copy.
*/ */
if (OP_SOURCE_DEVICE != opt) if (OP_SOURCE_DEVICE != opt)
source_name = strdup(psz_my_source); if (optarg != NULL) source_name = strdup(optarg);
switch (opt) { switch (opt) {
case OP_SOURCE_BIN: case OP_SOURCE_BIN:
@@ -292,31 +161,197 @@ parse_options (int argc, const char *argv[])
case OP_SOURCE_AUTO: case OP_SOURCE_AUTO:
opts.source_image = INPUT_AUTO; opts.source_image = INPUT_AUTO;
break; break;
case OP_SOURCE_DEVICE: case OP_SOURCE_DEVICE:
opts.source_image = INPUT_DEVICE; opts.source_image = INPUT_DEVICE;
source_name = fillout_device_name(source_name); if (optarg != NULL) source_name = fillout_device_name(optarg);
break; break;
} }
break;
}
}
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);
} }
/* Parse all options. */
static bool
parse_options (int argc, char *argv[])
{ {
const char *remaining_arg = poptGetArg(optCon); int opt; /* used for argument parsing */
if ( remaining_arg != NULL) {
if (opts.source_image != INPUT_UNKNOWN) { 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 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 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
" -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
" -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", 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 }
};
program_name = strrchr(argv[0],'/');
program_name = program_name ? strdup(program_name+1) : strdup(argv[0]);
while ((opt = getopt_long(argc, argv, optionsString, optionsTable, NULL)) >= 0) {
switch (opt) {
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;
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 (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 " report(stderr, "%s: Source '%s' given as an argument of an option and as "
"unnamed option '%s'\n", "unnamed option '%s'\n",
program_name, psz_my_source, remaining_arg); program_name, source_name, remaining_arg);
poptFreeContext(optCon);
free(program_name); free(program_name);
exit (EXIT_FAILURE); exit (EXIT_FAILURE);
} }
@@ -326,21 +361,24 @@ parse_options (int argc, const char *argv[])
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, psz_my_source, remaining_arg); program_name, source_name, remaining_arg);
poptFreeContext(optCon);
free(program_name); free(program_name);
exit (EXIT_FAILURE); exit (EXIT_FAILURE);
}
} }
} }
poptFreeContext(optCon); if (NULL == source_name) {
report(stderr, "%s: No source specified.\n", program_name);
free(program_name);
exit (EXIT_FAILURE);
}
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,99 +177,25 @@ process_suboption(const char *subopt, subopt_entry_t *sublist, const int num,
} }
} }
/* Parse a options. */
static bool /* Parse source options. */
parse_options (int argc, const char *argv[]) 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
*/
int opt;
char *psz_my_source;
char *opt_arg;
/* Command-line options */
struct poptOption optionsTable[] = {
{"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}
};
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)
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) { if (opts.source_image != INPUT_UNKNOWN) {
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",
program_name ); program_name );
break; return;
} }
/* For all input sources which are not a DEVICE, we need to make /* For all input sources which are not a DEVICE, we need to make
@@ -273,7 +203,7 @@ parse_options (int argc, const char *argv[])
the copy. the copy.
*/ */
if (OP_SOURCE_DEVICE != opt) if (OP_SOURCE_DEVICE != opt)
source_name = strdup(psz_my_source); if (optarg != NULL) source_name = strdup(optarg);
switch (opt) { switch (opt) {
case OP_SOURCE_BIN: case OP_SOURCE_BIN:
@@ -290,56 +220,155 @@ parse_options (int argc, const char *argv[])
break; break;
case OP_SOURCE_DEVICE: case OP_SOURCE_DEVICE:
opts.source_image = INPUT_DEVICE; opts.source_image = INPUT_DEVICE;
source_name = fillout_device_name(source_name); if (optarg != NULL) source_name = fillout_device_name(optarg);
break; break;
} }
break; }
case OP_READ_MODE:
process_suboption(opt_arg, modes_sublist, /* Parse a options. */
static bool
parse_options (int argc, char *argv[])
{
int opt;
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";
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 }
};
program_name = strrchr(argv[0],'/');
program_name = program_name ? strdup(program_name+1) : strdup(argv[0]);
while ((opt = getopt_long(argc, argv, optionsString, optionsTable, NULL)) >= 0)
switch (opt)
{
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), 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;
}
if (opt < -1) { case '?':
report( stderr, "%s: %s\n", fprintf(stderr, helpText, program_name);
poptBadOption(optCon, POPT_BADOPTION_NOALIAS),
poptStrerror(opt) );
free(program_name); free(program_name);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
break;
case OP_USAGE:
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.source_image != INPUT_UNKNOWN) { /* 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", report( stderr, "%s: Source specified in option %s and as %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);
} }
if (opts.source_image == OP_SOURCE_DEVICE) if (opts.source_image == INPUT_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);
}
} }
} }
@@ -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,6 +74,9 @@ 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-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-rock-ridge", '\0', POPT_ARG_NONE, &opts.no_rock_ridge, const char* usageText =
0, "Don't use Rock-Ridge-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";
{"no-xa", '\0', POPT_ARG_NONE, &opts.no_xa, const char* optionsString = "d:i::flqV?";
0, "Don't use XA-extension information"}, 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'},
{"quiet", 'q', POPT_ARG_NONE, &opts.silent, 0, {"help", no_argument, NULL, '?' },
"Don't produce warning output" }, {"usage", no_argument, NULL, OP_USAGE },
{ NULL, 0, NULL, 0 }
{"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)
} {
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;
case 'V': opts.version_only = 1; break;
case '?':
fprintf(stderr, helpText, program_name);
free(program_name); free(program_name);
exit(EXIT_FAILURE); 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 (optind < argc) {
if ( (poptGetArgs(optCon)) != NULL) { const char *remaining_arg = argv[optind++];
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);
} }
source_name = strdup(remaining_arg); 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,94 +60,106 @@ 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";
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";
/* Command-line options */ /* Command-line options */
struct poptOption optionsTable[] = { 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' },
{"debug", 'd', {"help", no_argument, NULL, '?' },
POPT_ARG_INT, &opts.debug_level, 0, {"usage", no_argument, NULL, OP_USAGE },
"Set debugging to LEVEL."}, { NULL, 0, NULL, 0 }
{"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)"},
{"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}
}; };
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),
poptStrerror(opt) );
report( stderr, "Error while parsing command line - try --help.\n" );
poptFreeContext(optCon);
free(program_name); free(program_name);
exit(EXIT_FAILURE); exit(EXIT_FAILURE);
break;
case OP_USAGE:
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 );
poptFreeContext(optCon);
free(program_name); free(program_name);
exit (EXIT_FAILURE); exit (EXIT_FAILURE);
} }
opts.iso9660_image = strdup(remaining_arg); opts.iso9660_image = strdup(remaining_arg);
if ( (poptGetArgs(optCon)) != NULL) { if (optind < argc ) {
report( stderr, report( stderr,
"%s: use only one unnamed argument for the ISO 9660 " "%s: use only one unnamed argument for the ISO 9660 "
"image name\n", "image name\n",
program_name ); program_name );
poptFreeContext(optCon);
free(program_name); free(program_name);
exit (EXIT_FAILURE); 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",
@@ -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