/* $Id: cd-read.c,v 1.14 2003/10/20 04:28:38 rocky Exp $ Copyright (C) 2003 Rocky Bernstein 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 of the License, 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 */ /* Program to debug read routines audio, mode1, mode2 forms 1 & 2. */ #include "util.h" #ifdef HAVE_SYS_STAT_H #include #endif #ifdef HAVE_FCNTL_H #include #endif #ifdef HAVE_ERRNO_H #include #endif /* Configuration option codes */ enum { /* These correspond to driver_id_t in cdio.h and have to MATCH! */ OP_SOURCE_UNDEF = DRIVER_UNKNOWN, OP_SOURCE_AUTO, OP_SOURCE_BIN, OP_SOURCE_CUE, OP_SOURCE_NRG = DRIVER_NRG, OP_SOURCE_DEVICE = DRIVER_DEVICE, /* These are the remaining configuration options */ OP_READ_MODE, OP_VERSION, }; typedef enum { READ_MODE_UNINIT, READ_AUDIO, READ_M1F1, READ_M1F2, READ_M2F1, READ_M2F2 #if AUTO_FINISHED READ_AUTO #endif } read_mode_t; /* Structure used so we can binary sort and set the --mode switch. */ typedef struct { char name[30]; read_mode_t read_mode; } subopt_entry_t; /* Sub-options for --mode. Note: entries must be sorted! */ subopt_entry_t modes_sublist[] = { {"audio", READ_AUDIO}, {"m1f1", READ_M1F1}, {"m1f2", READ_M1F2}, {"m2f1", READ_M2F1}, {"m2f2", READ_M2F2}, {"mode1form1", READ_M1F1}, {"mode1form2", READ_M1F2}, {"mode2form1", READ_M2F1}, {"mode2form2", READ_M2F2}, {"red", READ_AUDIO}, }; /* Used by `main' to communicate with `parse_opt'. And global options */ struct arguments { char *access_mode; /* Access method driver should use for control */ char *output_file; /* file to output blocks if not NULL. */ int debug_level; read_mode_t read_mode; int version_only; int no_header; int print_iso9660; source_image_t source_image; lsn_t start_lsn; lsn_t end_lsn; int num_sectors; } opts; static void hexdump (uint8_t * buffer, unsigned int len) { unsigned int i; for (i = 0; i < len; i++, buffer++) { if (i % 16 == 0) printf ("0x%04x: ", i); printf ("%02x", *buffer); if (i % 2 == 1) printf (" "); if (i % 16 == 15) { uint8_t *p; printf (" "); for (p=buffer-15; p <= buffer; p++) { printf("%c", isprint(*p) ? *p : '.'); } printf ("\n"); } } printf ("\n"); } /* Comparison function called by bearch() to find sub-option record. */ static int compare_subopts(const void *key1, const void *key2) { subopt_entry_t *a = (subopt_entry_t *) key1; subopt_entry_t *b = (subopt_entry_t *) key2; return (strncmp(a->name, b->name, 30)); } /* Do processing of a --mode sub option. Basically we find the option in the array, set it's corresponding flag variable to true as well as the "show.all" false. */ static void process_suboption(const char *subopt, subopt_entry_t *sublist, const int num, const char *subopt_name) { subopt_entry_t *subopt_rec = bsearch(subopt, sublist, num, sizeof(subopt_entry_t), &compare_subopts); if (subopt_rec != NULL) { opts.read_mode = subopt_rec->read_mode; return; } else { unsigned int i; bool is_help=strcmp(subopt, "help")==0; if (is_help) { fprintf (stderr, "The list of sub options for \"%s\" are:\n", subopt_name); } else { fprintf (stderr, "Invalid option following \"%s\": %s.\n", subopt_name, subopt); fprintf (stderr, "Should be one of: "); } for (i=0; i