[WIN32] deleted libcdio 0.72
[vuplus_xbmc] / lib / win32 / libcdio / src / cd-info.c
diff --git a/lib/win32/libcdio/src/cd-info.c b/lib/win32/libcdio/src/cd-info.c
deleted file mode 100644 (file)
index 467de56..0000000
+++ /dev/null
@@ -1,1450 +0,0 @@
-/*
-    $Id: cd-info.c,v 1.111 2005/01/27 03:10:06 rocky Exp $
-
-    Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
-    Copyright (C) 1996, 1997, 1998  Gerd Knorr <kraxel@bytesex.org>
-         and Heiko Eißfeldt <heiko@hexco.de>
-
-    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
-*/
-/*
-  CD Info - prints various information about a CD, and detects the type of 
-  the CD.
-*/
-
-#include "util.h"
-
-#ifdef _XBOX
-#include "xtl.h"
-#endif
-
-#ifdef HAVE_CDDB
-#include <cddb/cddb.h>
-#endif
-
-#ifdef HAVE_VCDINFO
-#include <libvcd/logging.h>
-#include <libvcd/files.h>
-#include <libvcd/info.h>
-#endif
-
-#include <cdio/bytesex.h>
-#include <cdio/ds.h>
-#include <cdio/util.h>
-#include <cdio/cd_types.h>
-#include <cdio/cdtext.h>
-#include <cdio/iso9660.h>
-#include <cdio/scsi_mmc.h>
-
-#include "cdio_assert.h"
-
-#include <fcntl.h>
-#ifdef __linux__
-# include <linux/version.h>
-# include <linux/cdrom.h>
-# if LINUX_VERSION_CODE < KERNEL_VERSION(2,1,50)
-#  include <linux/ucdrom.h>
-# endif
-#endif
-#include <errno.h>
-
-#define STRONG "__________________________________\n"
-#define NORMAL ""
-
-#if CDIO_IOCTL_FINISHED
-struct cdrom_multisession  ms;
-struct cdrom_subchnl       sub;
-#endif
-
-/* Used by `main' to communicate with `parse_opt'. And global options
- */
-struct arguments
-{
-  int            no_tracks;
-  int            no_ioctl;
-  int            no_analysis;
-  char          *access_mode; /* Access method driver should use for control */
-#ifdef HAVE_CDDB
-  int            no_cddb;     /* If set the below are meaningless. */
-  char          *cddb_email;  /* email to report to CDDB server. */
-  char          *cddb_server; /* CDDB server to contact */
-  int            cddb_port;   /* port number to contact CDDB server. */
-  int            cddb_http;   /* 1 if use http proxy */
-  int            cddb_timeout;
-  bool           cddb_disable_cache; /* If set the below is meaningless. */
-  char          *cddb_cachedir;
-#endif
-  int            no_vcd;
-  int            show_dvd;
-  int            no_device;
-  int            no_disc_mode;
-  uint32_t       debug_level;
-  int            version_only;
-  int            silent;
-  int            no_header;
-  int            no_joliet;
-  int            print_iso9660;
-  int            list_drives;
-  source_image_t source_image;
-} opts;
-     
-/* Configuration option codes */
-enum {
-  
-  OP_SOURCE_UNDEF,
-  OP_SOURCE_AUTO,
-  OP_SOURCE_BIN,
-  OP_SOURCE_CUE,
-  OP_SOURCE_CDRDAO,
-  OP_SOURCE_NRG ,
-  OP_SOURCE_DEVICE,
-  
-  /* These are the remaining configuration options */
-  OP_VERSION,  
-  
-};
-
-char *temp_str;
-
-
-/* Parse a all options. */
-static bool
-parse_options (int argc, const char *argv[])
-{
-  int opt;
-  char *psz_my_source;
-  
-  struct poptOption optionsTable[] = {
-    {"access-mode",       'a', POPT_ARG_STRING, &opts.access_mode, 0,
-     "Set CD access methed"},
-    
-    {"debug",       'd', POPT_ARG_INT, &opts.debug_level, 0,
-     "Set debugging to LEVEL"},
-    
-    {"no-tracks",   'T', POPT_ARG_NONE, &opts.no_tracks, 0,
-     "Don't show track information"},
-    
-    {"no-analyze",  'A', POPT_ARG_NONE, &opts.no_analysis, 0,
-     "Don't filesystem analysis"},
-    
-#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, &opts.cddb_port, 8880,
-     "CDDB port number to use (default 8880)"},
-    
-    {"cddb-http",   'H', POPT_ARG_NONE, &opts.cddb_http, 0,
-     "Lookup CDDB via HTTP proxy (default no proxy)"},
-    
-    {"cddb-server", '\0', POPT_ARG_STRING, &opts.cddb_server, 0,
-     "CDDB server to contact for information (default: freedb.freedb.org)"},
-    
-    {"cddb-cache",  '\0', POPT_ARG_STRING, &opts.cddb_cachedir, 0,
-     "Location of CDDB cache directory (default ~/.cddbclient)"},
-    
-    {"cddb-email",  '\0', POPT_ARG_STRING, &opts.cddb_email, 0,
-     "Email address to give CDDB server (default me@home"},
-    
-    {"no-cddb-cache", '\0', POPT_ARG_NONE, &opts.cddb_disable_cache, 0,
-     "Lookup CDDB via HTTP proxy (default no proxy)"},
-    
-    {"cddb-timeout",  '\0', POPT_ARG_INT, &opts.cddb_timeout, 0,
-     "CDDB timeout value in seconds (default 10 seconds)"},
-#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*/
-    
-    {"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)) != -1) {
-    switch (opt) {
-      
-    case OP_SOURCE_AUTO:
-    case OP_SOURCE_BIN: 
-    case OP_SOURCE_CUE: 
-    case OP_SOURCE_CDRDAO: 
-    case OP_SOURCE_NRG: 
-    case OP_SOURCE_DEVICE: 
-      if (opts.source_image != INPUT_UNKNOWN) {
-       report(stderr, "%s: another source type option given before.\n", 
-               program_name);
-       report(stderr, "%s: give only one source type option.\n", 
-               program_name);
-       break;
-      } 
-
-      /* For all input sources which are not a DEVICE, we need to make
-        a copy of the string; for a DEVICE the fill-out routine makes
-        the copy.
-       */
-      if (OP_SOURCE_DEVICE != opt) 
-       source_name = strdup(psz_my_source);
-      
-      switch (opt) {
-      case OP_SOURCE_BIN: 
-       opts.source_image  = INPUT_BIN;
-       break;
-      case OP_SOURCE_CUE: 
-       opts.source_image  = INPUT_CUE;
-       break;
-      case OP_SOURCE_CDRDAO: 
-       opts.source_image  = INPUT_CDRDAO;
-       break;
-      case OP_SOURCE_NRG: 
-       opts.source_image  = INPUT_NRG;
-       break;
-      case OP_SOURCE_AUTO:
-       opts.source_image  = INPUT_AUTO;
-       break;
-      case OP_SOURCE_DEVICE: 
-       opts.source_image  = INPUT_DEVICE;
-       source_name = fillout_device_name(source_name);
-       break;
-      }
-      break;
-      
-    default:
-      poptFreeContext(optCon);
-      return false;
-    }
-  }
-  {
-    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;
-}
-
-/* ------------------------------------------------------------------------ */
-/* CDDB                                                                     */
-
-/* 
-   Returns the sum of the decimal digits in a number. Eg. 1955 = 20
-*/
-static int
-cddb_dec_digit_sum(int n)
-{
-  int ret=0;
-  
-  for (;;) {
-    ret += n%10;
-    n    = n/10;
-    if (!n)
-      return ret;
-  }
-}
-
-/* Return the number of seconds (discarding frame portion) of an MSF */
-static inline unsigned int
-msf_seconds(msf_t *msf) 
-{
-  return cdio_from_bcd8(msf->m)*CDIO_CD_SECS_PER_MIN + cdio_from_bcd8(msf->s);
-}
-
-/* 
-   Compute the CDDB disk ID for an Audio disk.  This is a funny checksum
-   consisting of the concatenation of 3 things:
-      the sum of the decimal digits of sizes of all tracks, 
-      the total length of the disk, and 
-      the number of tracks.
-*/
-static unsigned long
-cddb_discid(CdIo_t *p_cdio, int i_tracks)
-{
-  int i,t,n=0;
-  msf_t start_msf;
-  msf_t msf;
-  
-  for (i = 1; i <= i_tracks; i++) {
-    cdio_get_track_msf(p_cdio, i, &msf);
-    n += cddb_dec_digit_sum(msf_seconds(&msf));
-  }
-
-  cdio_get_track_msf(p_cdio, 1, &start_msf);
-  cdio_get_track_msf(p_cdio, CDIO_CDROM_LEADOUT_TRACK, &msf);
-  
-  t = msf_seconds(&msf) - msf_seconds(&start_msf);
-  
-  return ((n % 0xff) << 24 | t << 8 | i_tracks);
-}
-
-
-/* CDIO logging routines */
-
-static cdio_log_handler_t gl_default_cdio_log_handler = NULL;
-#ifdef HAVE_CDDB
-static cddb_log_handler_t gl_default_cddb_log_handler = NULL;
-#endif
-#ifdef HAVE_VCDINFO
-static vcd_log_handler_t gl_default_vcd_log_handler = NULL;
-#endif
-
-static void 
-_log_handler (cdio_log_level_t level, const char message[])
-{
-  if (level == CDIO_LOG_DEBUG && opts.debug_level < 2)
-    return;
-
-  if (level == CDIO_LOG_INFO  && opts.debug_level < 1)
-    return;
-  
-  if (level == CDIO_LOG_WARN  && opts.silent)
-    return;
-  
-  gl_default_cdio_log_handler (level, message);
-}
-
-static void 
-print_cdtext_track_info(CdIo_t *p_cdio, track_t i_track, const char *psz_msg) {
-   cdtext_t *p_cdtext = cdio_get_cdtext(p_cdio, i_track);
-
-  if (NULL != p_cdtext) {
-    cdtext_field_t i;
-    
-    printf("%s\n", psz_msg);
-    
-    for (i=0; i < MAX_CDTEXT_FIELDS; i++) {
-      if (p_cdtext->field[i]) {
-       printf("\t%s: %s\n", cdtext_field2str(i), p_cdtext->field[i]);
-      }
-    }
-  }
-  cdtext_destroy(p_cdtext);
-}
-    
-static void 
-print_cdtext_info(CdIo_t *p_cdio, track_t i_tracks, track_t i_first_track) {
-  track_t i_last_track = i_first_track+i_tracks;
-  
-  print_cdtext_track_info(p_cdio, 0, "\nCD-TEXT for Disc:");
-  for ( ; i_first_track < i_last_track; i_first_track++ ) {
-    char msg[50];
-    sprintf(msg, "CD-TEXT for Track %d:", i_first_track);
-    print_cdtext_track_info(p_cdio, i_first_track, msg);
-  }
-}
-
-#ifdef HAVE_CDDB
-static void 
-print_cddb_info(CdIo_t *p_cdio, track_t i_tracks, track_t i_first_track) {
-  int i, matches;
-  
-  cddb_conn_t *conn =  cddb_new();
-  cddb_disc_t *disc = NULL;
-
-  if (!conn) {
-    report(stderr,  "%s: unable to initialize libcddb\n", program_name);
-    goto cddb_destroy;
-  }
-
-  if (NULL == opts.cddb_email) 
-    cddb_set_email_address(conn, "me@home");
-  else 
-    cddb_set_email_address(conn, opts.cddb_email);
-
-  if (NULL == opts.cddb_server) 
-    cddb_set_server_name(conn, "freedb.freedb.org");
-  else 
-    cddb_set_server_name(conn, opts.cddb_server);
-
-  if (opts.cddb_timeout >= 0) 
-    cddb_set_timeout(conn, opts.cddb_timeout);
-
-  cddb_set_server_port(conn, opts.cddb_port);
-
-  if (opts.cddb_http) 
-    cddb_http_enable(conn);
-  else 
-    cddb_http_disable(conn);
-
-  if (NULL != opts.cddb_cachedir) 
-    cddb_cache_set_dir(conn, opts.cddb_cachedir);
-    
-  if (opts.cddb_disable_cache) 
-    cddb_cache_disable(conn);
-    
-  disc = cddb_disc_new();
-  if (!disc) {
-    report(stderr, "%s: unable to create CDDB disc structure", program_name);
-    goto cddb_destroy;
-  }
-  for(i = 0; i < i_tracks; i++) {
-    cddb_track_t *t = cddb_track_new(); 
-    t->frame_offset = cdio_get_track_lba(p_cdio, i+i_first_track);
-    cddb_disc_add_track(disc, t);
-  }
-    
-  disc->length = 
-    cdio_get_track_lba(p_cdio, CDIO_CDROM_LEADOUT_TRACK) 
-    / CDIO_CD_FRAMES_PER_SEC;
-
-  if (!cddb_disc_calc_discid(disc)) {
-    report(stderr, "%s: libcddb calc discid failed.\n", 
-           program_name);
-    goto cddb_destroy;
-  }
-
-  matches = cddb_query(conn, disc);
-
-  if (-1 == matches) 
-  {
-    sprintf(temp_msg, "%s: %s\n", program_name, cddb_error_str(cddb_errno(conn)));
-       report(stdout, temp_msg);
-  }
-  else {
-    sprintf(temp_msg, "%s: Found %d matches in CDDB\n", program_name, matches);
-       report(stdout, temp_msg);
-    for (i=1; i<=matches; i++) {
-      cddb_read(conn, disc);
-      cddb_disc_print(disc);
-      cddb_query_next(conn, disc);
-    }
-  }
-  
-  cddb_disc_destroy(disc);
-  cddb_destroy:
-  cddb_destroy(conn);
-}
-#endif
-
-#ifdef HAVE_VCDINFO
-static void 
-print_vcd_info(driver_id_t driver) {
-  vcdinfo_open_return_t open_rc;
-  vcdinfo_obj_t *p_vcd = NULL;
-  open_rc = vcdinfo_open(&p_vcd, &source_name, driver, NULL);
-  switch (open_rc) {
-  case VCDINFO_OPEN_VCD: 
-    if (vcdinfo_get_format_version (p_vcd) == VCD_TYPE_INVALID) {
-      report(stderr, "VCD format detection failed");
-      vcdinfo_close(p_vcd);
-      return;
-    }
-    report (stdout, "Format      : %s\n", 
-           vcdinfo_get_format_version_str(p_vcd));
-    report (stdout, "Album       : `%.16s'\n",  vcdinfo_get_album_id(p_vcd));
-    report (stdout, "Volume count: %d\n",   vcdinfo_get_volume_count(p_vcd));
-    report (stdout, "volume number: %d\n",  vcdinfo_get_volume_num(p_vcd));
-
-    break;
-  case VCDINFO_OPEN_ERROR:
-    report( stderr, "Error in Video CD opening of %s\n", source_name );
-    break;
-  case VCDINFO_OPEN_OTHER:
-    report( stderr, "Even though we thought this was a Video CD, "
-            " further inspection says it is not.\n");
-    break;
-  }
-  if (p_vcd) vcdinfo_close(p_vcd);
-    
-}
-#endif 
-
-static void
-print_iso9660_recurse (CdIo_t *p_cdio, const char pathname[], 
-                      cdio_fs_anal_t fs, 
-                      bool b_mode2)
-{
-  CdioList_t *entlist;
-  CdioList_t *dirlist =  _cdio_list_new ();
-  CdioListNode_t *entnode;
-  uint8_t i_joliet_level;
-
-  i_joliet_level = (opts.no_joliet) 
-    ? 0
-    : cdio_get_joliet_level(p_cdio);
-
-  entlist = iso9660_fs_readdir (p_cdio, pathname, b_mode2);
-    
-  sprintf (temp_msg, "%s:\n", pathname);
-  report(stdout, temp_msg);
-
-  if (NULL == entlist) {
-    report( stderr, "Error getting above directory information\n" );
-    return;
-  }
-
-  /* Iterate over files in this directory */
-  
-  _CDIO_LIST_FOREACH (entnode, entlist)
-    {
-      iso9660_stat_t *statbuf = _cdio_list_node_data (entnode);
-      char *iso_name = statbuf->filename;
-      char _fullname[4096] = { 0, };
-      char translated_name[MAX_ISONAME+1];
-#define DATESTR_SIZE 30
-      char date_str[DATESTR_SIZE];
-
-      iso9660_name_translate_ext(iso_name, translated_name, i_joliet_level);
-      
-      snprintf (_fullname, sizeof (_fullname), "%s%s", pathname, 
-               iso_name);
-  
-      strncat (_fullname, "/", sizeof (_fullname));
-
-      if (statbuf->type == _STAT_DIR
-          && strcmp (iso_name, ".") 
-          && strcmp (iso_name, ".."))
-        _cdio_list_append (dirlist, strdup (_fullname));
-
-      if (fs & CDIO_FS_ANAL_XA) {
-       sprintf (temp_msg, "  %c %s %d %d [fn %.2d] [LSN %6lu] ",
-                (statbuf->type == _STAT_DIR) ? 'd' : '-',
-                iso9660_get_xa_attr_str (statbuf->xa.attributes),
-                uint16_from_be (statbuf->xa.user_id),
-                uint16_from_be (statbuf->xa.group_id),
-                statbuf->xa.filenum,
-                (long unsigned int) statbuf->lsn);
-    report(stdout, temp_msg);
-       
-       if (uint16_from_be(statbuf->xa.attributes) & XA_ATTR_MODE2FORM2) {
-         sprintf (temp_msg, "%9u (%9u)",
-                 (unsigned int) statbuf->secsize * M2F2_SECTOR_SIZE,
-                 (unsigned int) statbuf->size);
-      report(stdout, temp_msg);
-       } else {
-         printf ("%9u", (unsigned int) statbuf->size);
-       }
-      }
-      strftime(date_str, DATESTR_SIZE, "%b %d %Y %H:%M ", &statbuf->tm);
-      sprintf (temp_msg, " %s %s\n", date_str, translated_name);
-      report(stdout, temp_msg);
-    }
-
-  _cdio_list_free (entlist, true);
-
-  sprintf (temp_msg, "\n");
-  report(stdout, temp_msg);
-
-  /* Now recurse over the directories. */
-
-  _CDIO_LIST_FOREACH (entnode, dirlist)
-    {
-      char *_fullname = _cdio_list_node_data (entnode);
-
-      print_iso9660_recurse (p_cdio, _fullname, fs, b_mode2);
-    }
-
-  _cdio_list_free (dirlist, true);
-}
-
-static void
-print_iso9660_fs (CdIo_t *p_cdio, cdio_fs_anal_t fs, 
-                 track_format_t track_format)
-{
-  bool b_mode2 = false;
-  iso_extension_mask_t iso_extension_mask = ISO_EXTENSION_ALL;
-
-  if (fs & CDIO_FS_ANAL_XA) track_format = TRACK_FORMAT_XA;
-
-  if (opts.no_joliet) {
-    iso_extension_mask &= ~ISO_EXTENSION_JOLIET;
-  }
-
-  if ( !iso9660_fs_read_superblock(p_cdio, iso_extension_mask) ) 
-    return;
-  
-  b_mode2 = ( TRACK_FORMAT_CDI == track_format 
-              || TRACK_FORMAT_XA == track_format );
-  
-  {
-    sprintf (temp_msg, "ISO9660 filesystem\n");
-    report(stdout, temp_msg);
-    print_iso9660_recurse (p_cdio, "/", fs, b_mode2);
-  }
-}
-
-#define print_vd_info(title, fn)               \
-  psz_str = fn(&pvd);                          \
-  if (psz_str) {                               \
-    report(stdout, title ": %s\n", psz_str);   \
-    free(psz_str);                             \
-    psz_str = NULL;                            \
-  }
-
-static void
-print_analysis(int ms_offset, cdio_iso_analysis_t cdio_iso_analysis, 
-              cdio_fs_anal_t fs, int first_data, unsigned int num_audio, 
-              track_t i_tracks, track_t i_first_track, 
-              track_format_t track_format, CdIo_t *p_cdio)
-{
-  int need_lf;
-  
-  switch(CDIO_FSTYPE(fs)) {
-  case CDIO_FS_AUDIO:
-    if (num_audio > 0) {
-      sprintf(temp_msg, "Audio CD, CDDB disc ID is %08lx\n", 
-            cddb_discid(p_cdio, i_tracks));
-      report(stdout, temp_msg);
-#ifdef HAVE_CDDB
-      if (!opts.no_cddb) print_cddb_info(p_cdio, i_tracks, i_first_track);
-#endif      
-      print_cdtext_info(p_cdio, i_tracks, i_first_track);
-    }
-    break;
-  case CDIO_FS_ISO_9660:
-    sprintf(temp_msg, "CD-ROM with ISO 9660 filesystem");
-    report(stdout, temp_msg);
-    if (fs & CDIO_FS_ANAL_JOLIET) {
-      sprintf(temp_msg, " and joliet extension level %d", cdio_iso_analysis.joliet_level);
-      report(stdout, temp_msg);
-    }
-    if (fs & CDIO_FS_ANAL_ROCKRIDGE)
-       {
-      sprintf(temp_msg, " and rockridge extensions");
-      report(stdout, temp_msg);
-       }
-    sprintf(temp_msg, "\n");
-    report(stdout, temp_msg);
-    break;
-  case CDIO_FS_ISO_9660_INTERACTIVE:
-    sprintf(temp_msg,"CD-ROM with CD-RTOS and ISO 9660 filesystem\n");
-    report(stdout, temp_msg);
-    break;
-  case CDIO_FS_HIGH_SIERRA:
-    sprintf(temp_msg, "CD-ROM with High Sierra filesystem\n");
-    report(stdout, temp_msg);
-    break;
-  case CDIO_FS_INTERACTIVE:
-    sprintf(temp_msg, "CD-Interactive%s\n", num_audio > 0 ? "/Ready" : "");
-    report(stdout, temp_msg);
-    break;
-  case CDIO_FS_HFS:
-    sprintf(temp_msg, "CD-ROM with Macintosh HFS\n");
-    report(stdout, temp_msg);
-    break;
-  case CDIO_FS_ISO_HFS:
-    sprintf(temp_msg, "CD-ROM with both Macintosh HFS and ISO 9660 filesystem\n");
-    report(stdout, temp_msg);
-    break;
-  case CDIO_FS_UFS:
-    sprintf(temp_msg, "CD-ROM with Unix UFS\n");
-    report(stdout, temp_msg);
-    break;
-  case CDIO_FS_EXT2:
-    sprintf(temp_msg, "CD-ROM with GNU/Linux EXT2 (native) filesystem\n");
-    report(stdout, temp_msg);
-         break;
-  case CDIO_FS_3DO:
-    sprintf(temp_msg, "CD-ROM with Panasonic 3DO filesystem\n");
-    report(stdout, temp_msg);
-    break;
-  case CDIO_FS_UDFX:
-    sprintf(temp_msg, "CD-ROM with UDFX filesystem\n");
-    report(stdout, temp_msg);
-    break;
-  case CDIO_FS_UNKNOWN:
-    sprintf(temp_msg, "CD-ROM with unknown filesystem\n");
-    report(stdout, temp_msg);
-    break;
-  case CDIO_FS_XISO:
-    sprintf(temp_msg, "CD-ROM with Microsoft X-BOX XISO filesystem\n");
-    report(stdout, temp_msg);
-    break;
-  }
-  switch(CDIO_FSTYPE(fs)) {
-  case CDIO_FS_ISO_9660:
-  case CDIO_FS_ISO_9660_INTERACTIVE:
-  case CDIO_FS_ISO_HFS:
-  case CDIO_FS_ISO_UDF:
-    sprintf(temp_msg,"ISO 9660: %i blocks, label `%.32s'\n",
-          cdio_iso_analysis.isofs_size, cdio_iso_analysis.iso_label);
-    report(stdout, temp_msg);
-
-    {
-      iso9660_pvd_t pvd;
-
-      if ( iso9660_fs_read_pvd(p_cdio, &pvd) ) {
-       sprintf(temp_msg, "Application: %s\n", 
-               iso9660_get_application_id(&pvd));
-    report(stdout, temp_msg);
-       sprintf(temp_msg, "Preparer   : %s\n", iso9660_get_preparer_id(&pvd));
-    report(stdout, temp_msg);
-       sprintf(temp_msg, "Publisher  : %s\n", iso9660_get_publisher_id(&pvd));
-    report(stdout, temp_msg);
-       sprintf(temp_msg, "System     : %s\n", iso9660_get_system_id(&pvd));
-    report(stdout, temp_msg);
-       sprintf(temp_msg, "Volume     : %s\n", iso9660_get_volume_id(&pvd));
-    report(stdout, temp_msg);
-       sprintf(temp_msg, "Volume Set : %s\n", iso9660_get_volumeset_id(&pvd));
-    report(stdout, temp_msg);
-      }
-      
-    }
-    
-    if (opts.print_iso9660) 
-      print_iso9660_fs(p_cdio, fs, track_format);
-    
-    break;
-  }
-  
-  switch(CDIO_FSTYPE(fs)) {
-  case CDIO_FS_UDF:
-  case CDIO_FS_ISO_UDF:
-    report(stdout, "UDF: version %x.%2.2x\n",
-           cdio_iso_analysis.UDFVerMajor, cdio_iso_analysis.UDFVerMinor);
-    report(stdout, temp_msg);
-    break;
-  default: ;
-  }
-
-  need_lf = 0;
-  if (first_data == 1 && num_audio > 0) {
-    need_lf =1;
-       sprintf(temp_msg, "mixed mode CD   ");
-       report(stdout, temp_msg);
-  }
-  if (fs & CDIO_FS_ANAL_XA) {
-    need_lf =1;
-       sprintf(temp_msg, "XA sectors   ");
-       report(stdout, temp_msg);
-  }
-  if (fs & CDIO_FS_ANAL_MULTISESSION) {
-    need_lf =1;
-       sprintf(temp_msg, "Multisession, offset = %i   ", ms_offset);
-       report(stdout, temp_msg);
-  }
-  if (fs & CDIO_FS_ANAL_HIDDEN_TRACK) {
-    need_lf =1;
-       sprintf(temp_msg, "Hidden Track   ");
-       report(stdout, temp_msg);
-  }
-  if (fs & CDIO_FS_ANAL_PHOTO_CD) {
-    need_lf =1; 
-       sprintf(temp_msg, "%sPhoto CD   ", 
-                     num_audio > 0 ? " Portfolio " : "");
-       report(stdout, temp_msg);
-  }
-  if (fs & CDIO_FS_ANAL_CDTV) {
-    need_lf =1;
-       sprintf(temp_msg, "Commodore CDTV   ");
-       report(stdout, temp_msg);
-  }
-  if (first_data > 1) {
-    need_lf =1;
-       sprintf(temp_msg, "CD-Plus/Extra   ");
-       report(stdout, temp_msg);
-  }
-  if (fs & CDIO_FS_ANAL_BOOTABLE) {
-    need_lf =1;
-       sprintf(temp_msg, "bootable CD   ");
-       report(stdout, temp_msg);
-  }
-  if (fs & CDIO_FS_ANAL_VIDEOCD && num_audio == 0) {
-    need_lf =1;
-       sprintf(temp_msg, "Video CD   ");
-       report(stdout, temp_msg);
-  }
-  if (fs & CDIO_FS_ANAL_SVCD) {
-    need_lf =1;
-       sprintf(temp_msg, "Super Video CD (SVCD) or Chaoji Video CD (CVD)");
-       report(stdout, temp_msg);
-  }
-  if (fs & CDIO_FS_ANAL_CVD) {
-    need_lf =1;
-       sprintf(temp_msg, "Chaoji Video CD (CVD)");
-       report(stdout, temp_msg);
-  }
-  if (need_lf) {
-         sprintf(temp_msg, "\n");
-         report(stdout, temp_msg);
-  }
-#ifdef HAVE_VCDINFO
-  if (fs & (CDIO_FS_ANAL_VIDEOCD|CDIO_FS_ANAL_CVD|CDIO_FS_ANAL_SVCD)) 
-    if (!opts.no_vcd) {
-      sprintf(temp_msg, "\n");
-         report(stdout, temp_msg);
-      print_vcd_info(cdio_get_driver_id(p_cdio));
-    }
-#endif    
-
-}
-
-/* Initialize global variables. */
-static void 
-init(void) 
-{
-  gl_default_cdio_log_handler = cdio_log_set_handler (_log_handler);
-#ifdef HAVE_CDDB
-  
-
-  gl_default_cddb_log_handler = 
-    cddb_log_set_handler ((cddb_log_handler_t) _log_handler);
-#endif
-
-#ifdef HAVE_VCDINFO
-  gl_default_vcd_log_handler =
-    vcd_log_set_handler ((vcd_log_handler_t) _log_handler);
-#endif
-
-  /* Default option values. */
-  opts.silent        = false;
-  opts.list_drives   = false;
-  opts.no_header     = false;
-  opts.no_joliet     = false;
-  opts.no_device     = 0;
-  opts.no_disc_mode  = 0;
-  opts.debug_level   = 0;
-  opts.no_tracks     = 0;
-  opts.print_iso9660 = 0;
-#ifdef HAVE_CDDB
-  opts.no_cddb       = 0;
-  opts.cddb_port     = 8880;
-  opts.cddb_http     = 0;
-  opts.cddb_cachedir = NULL;
-  opts.cddb_server   = NULL;
-  opts.cddb_timeout = -1;
-  opts.cddb_disable_cache = false;
-#endif
-#ifdef HAVE_VCDINFO
-  opts.no_vcd        = 0;
-#else
-  opts.no_vcd        = 1;
-#endif
-  opts.no_ioctl      = 0;
-  opts.no_analysis   = 0;
-  opts.source_image  = INPUT_UNKNOWN;
-  opts.access_mode   = NULL;
-}
-
-/* ------------------------------------------------------------------------ */
-
-int
-main(int argc, const char *argv[])
-{
-
-  CdIo_t                *p_cdio=NULL;
-  cdio_fs_anal_t      fs=CDIO_FS_AUDIO;
-  int i;
-  lsn_t               start_track_lsn;      /* lsn of first track */
-  lsn_t               data_start     =  0;  /* start of data area */
-  int                 ms_offset      =  0;
-  track_t             i_tracks       =  0;
-  track_t             i_first_track  =  0;
-  unsigned int        num_audio      =  0;  /* # of audio tracks */
-  unsigned int        num_data       =  0;  /* # of data tracks */
-  int                 first_data     = -1;  /* # of first data track */
-  int                 first_audio    = -1;  /* # of first audio track */
-  cdio_iso_analysis_t cdio_iso_analysis; 
-  char                *media_catalog_number;  
-  discmode_t          discmode = CDIO_DISC_MODE_NO_INFO;
-      
-  memset(&cdio_iso_analysis, 0, sizeof(cdio_iso_analysis));
-  init();
-
-#ifdef _XBOX
-  /* argc and argv are both NULL, so just set some arbitrary values... */
-  opts.silent        = false;
-  opts.no_header     = false;
-  opts.debug_level   = 0;
-  opts.no_tracks     = 0;
-  opts.no_ioctl      = 0;
-  opts.no_analysis   = 0;
-  opts.source_image  = IMAGE_UNKNOWN;
-    
-  source_name = strdup("\\\\.\\D:");
-
-//  IoDeleteSymbolicLink(&DSymbolicLinkName);
-//  IoCreateSymbolicLink(&DSymbolicLinkName, &DDeviceName);
-//  IoCreateSymbolicLink(&FSymbolicLinkName, &FDeviceName);
-//  IoCreateSymbolicLink(&ESymbolicLinkName, &EDeviceName);
-
-  opts.source_image = IMAGE_DEVICE;
-
-#else
-  /* Parse our arguments; every option seen by `parse_opt' will
-     be reflected in `arguments'. */
-  parse_options(argc, argv);
-
-  print_version(program_name, CDIO_VERSION, opts.no_header, opts.version_only);
-#endif
-
-  if (opts.debug_level == 3) {
-    cdio_loglevel_default = CDIO_LOG_INFO;
-#ifdef HAVE_VCDINFO
-    vcd_loglevel_default = VCD_LOG_INFO;
-#endif
-  } else if (opts.debug_level >= 4) {
-    cdio_loglevel_default = CDIO_LOG_DEBUG;
-#ifdef HAVE_VCDINFO
-    vcd_loglevel_default = VCD_LOG_DEBUG;
-#endif
-  }
-
-  p_cdio = open_input(source_name, opts.source_image, opts.access_mode);
-
-  if (p_cdio==NULL) {
-    if (source_name) {
-#ifdef _WIN32
-       sprintf(temp_msg, "%s: Error in opening device driver for input %s.\n", 
-               program_name, source_name);
-       report(stderr, temp_msg);
-       myexit(p_cdio, EXIT_FAILURE);                
-#else
-      err_exit("%s: Error in opening device driver for input %s.\n", 
-              program_name, source_name);
-#endif
-    } else {
-#ifdef _WIN32
-       sprintf(temp_msg, "%s: Error in opening device driver for unspecified input.\n", 
-               program_name);
-       report(stderr, temp_msg);
-       myexit(p_cdio, EXIT_FAILURE);                
-#else
-      err_exit("%s: Error in opening device driver for unspecified input.\n", 
-              program_name);
-#endif
-    }
-    
-  } 
-
-  if (source_name==NULL) {
-    source_name=strdup(cdio_get_arg(p_cdio, "source"));
-    if (NULL == source_name) {
-#ifdef _WIN32
-       sprintf(temp_msg, "%s: No input device given/found\n", 
-               program_name);
-       report(stderr, temp_msg);
-       myexit(p_cdio, EXIT_FAILURE);                
-#else
-      err_exit("%s: No input device given/found\n", program_name);
-#endif
-    }
-  } 
-
-  if (0 == opts.silent) {
-    sprintf(temp_msg, "CD location   : %s\n",   source_name);
-       report(stdout, temp_msg);
-    sprintf(temp_msg, "CD driver name: %s\n",   cdio_get_driver_name(p_cdio));
-       report(stdout, temp_msg);
-    sprintf(temp_msg, "   access mode: %s\n\n", cdio_get_arg(p_cdio, "access-mode"));
-       report(stdout, temp_msg);
-  } 
-
-  if (0 == opts.no_device) {
-    cdio_drive_read_cap_t  i_read_cap;
-    cdio_drive_write_cap_t i_write_cap;
-    cdio_drive_misc_cap_t  i_misc_cap;
-    cdio_hwinfo_t          hwinfo;
-    if (cdio_get_hwinfo(p_cdio, &hwinfo)) {
-      sprintf(temp_msg, "%-28s: %s\n%-28s: %s\n%-28s: %s\n",
-            "Vendor"  , hwinfo.psz_vendor, 
-            "Model"   , hwinfo.psz_model, 
-            "Revision", hwinfo.psz_revision);
-         report(stdout, temp_msg);
-    }
-    cdio_get_drive_cap(p_cdio, &i_read_cap, &i_write_cap, &i_misc_cap);
-    print_drive_capabilities(i_read_cap, i_write_cap, i_misc_cap);
-  }
-
-  if (opts.list_drives) {
-    driver_id_t driver_id = DRIVER_DEVICE;
-    char ** device_list = cdio_get_devices_ret(&driver_id);
-    char ** d = device_list;
-
-    sprintf(temp_msg, "list of devices found:\n");
-       report(stdout, temp_msg);
-    if (NULL != d) {
-      for ( ; *d != NULL ; d++ ) {
-       CdIo_t *p_cdio = cdio_open(source_name, driver_id); 
-       cdio_hwinfo_t hwinfo;
-       sprintf(temp_msg, "Drive %s\n", *d);
-       report(stdout, temp_msg);
-       if (scsi_mmc_get_hwinfo(p_cdio, &hwinfo)) {
-         sprintf(temp_msg, "%-8s: %s\n%-8s: %s\n%-8s: %s\n",
-                "Vendor"  , hwinfo.psz_vendor, 
-                "Model"   , hwinfo.psz_model, 
-                "Revision", hwinfo.psz_revision);
-         report(stdout, temp_msg);
-       }
-       if (p_cdio) cdio_destroy(p_cdio);
-      }
-    }
-    cdio_free_device_list(device_list);
-    if (device_list) free(device_list);
-  }
-
-  report(stdout, STRONG "\n");
-  
-
-  discmode = cdio_get_discmode(p_cdio);
-  if ( 0 == opts.no_disc_mode ) {
-    sprintf(temp_msg, "Disc mode is listed as: %s\n", 
-          discmode2str[discmode]);
-    report(stdout, temp_msg);
-  }
-
-  if (discmode_is_dvd(discmode) && !opts.show_dvd) {
-    sprintf(temp_msg, "No further information currently given for DVDs.\n");
-    report(stdout, temp_msg);
-    sprintf(temp_msg, "Use --dvd to override.\n");
-    report(stdout, temp_msg);
-    myexit(p_cdio, EXIT_SUCCESS);
-  }
-  
-  i_first_track = cdio_get_first_track_num(p_cdio);
-
-  if (CDIO_INVALID_TRACK == i_first_track) {
-#ifdef _WIN32
-       sprintf(temp_msg, "Can't get first track number. I give up%s.\n", 
-               "");
-    report(stderr, temp_msg);
-       myexit(p_cdio, EXIT_FAILURE);                
-#else
-    err_exit("Can't get first track number. I give up%s.\n", "");
-#endif
-  }
-
-  i_tracks = cdio_get_num_tracks(p_cdio);
-
-  if (CDIO_INVALID_TRACK == i_tracks) {
-#ifdef _WIN32
-       sprintf(temp_msg, "Can't get number of tracks. I give up.%s\n", 
-               "");
-    report(stderr, temp_msg);
-       myexit(p_cdio, EXIT_FAILURE);                
-#else
-    err_exit("Can't get number of tracks. I give up.%s\n", "");
-#endif
-  }
-
-  if (!opts.no_tracks) {
-    sprintf(temp_msg, "CD-ROM Track List (%i - %i)\n" NORMAL, 
-          i_first_track, i_tracks);
-    report(stdout, temp_msg);
-
-    sprintf(temp_msg, "  #: MSF       LSN     Type  Green?\n");
-    report(stdout, temp_msg);
-    if ( CDIO_DISC_MODE_CD_DA == discmode 
-        || CDIO_DISC_MODE_CD_MIXED == discmode )
-      report(" Channels Premphasis?");
-    report("\n");
-  }
-
-  start_track_lsn = cdio_get_track_lsn(p_cdio, i_first_track);
-
-  /* Read and possibly print track information. */
-  for (i = i_first_track; i <= CDIO_CDROM_LEADOUT_TRACK; i++) {
-    msf_t msf;
-    char *psz_msf;
-    track_format_t track_format;
-
-    if (!cdio_get_track_msf(p_cdio, i, &msf)) {
-#ifdef _WIN32
-       sprintf(temp_msg, "cdio_track_msf for track %i failed, I give up.\n", 
-               i);
-    report(stderr, temp_msg);
-       myexit(p_cdio, EXIT_FAILURE);                
-#else
-      err_exit("cdio_track_msf for track %i failed, I give up.\n", i);
-#endif
-    }
-
-    track_format = cdio_get_track_format(p_cdio, i);
-    psz_msf = cdio_msf_to_str(&msf);
-    if (i == CDIO_CDROM_LEADOUT_TRACK) {
-         if (!opts.no_tracks) {
-       lsn_t lsn= cdio_msf_to_lsn(&msf);
-        long unsigned int i_bytes_raw = lsn * CDIO_CD_FRAMESIZE_RAW;
-        long unsigned int i_bytes_formatted = lsn - start_track_lsn;
-
-       printf( "%3d: %8s  %06lu leadout ", (int) i, psz_msf,
-               (long unsigned int) lsn );
-
-       switch (discmode) {
-        case CDIO_DISC_MODE_DVD_ROM:
-        case CDIO_DISC_MODE_DVD_RAM:
-        case CDIO_DISC_MODE_DVD_R:
-        case CDIO_DISC_MODE_DVD_RW:
-        case CDIO_DISC_MODE_DVD_PR:
-        case CDIO_DISC_MODE_DVD_PRW:
-        case CDIO_DISC_MODE_DVD_OTHER:
-       case CDIO_DISC_MODE_CD_DATA:
-         i_bytes_formatted *= CDIO_CD_FRAMESIZE;
-         break;
-       case CDIO_DISC_MODE_CD_DA:
-         i_bytes_formatted *= CDIO_CD_FRAMESIZE_RAW;
-         break;
-       case CDIO_DISC_MODE_CD_XA:
-       case CDIO_DISC_MODE_CD_MIXED:
-         i_bytes_formatted *= CDIO_CD_FRAMESIZE_RAW0;
-         break;
-       default:
-         i_bytes_formatted *= CDIO_CD_FRAMESIZE_RAW;
-       }
-       
-       if (i_bytes_raw < 1024) 
-         printf( "(%lu bytes", i_bytes_raw );
-       if (i_bytes_raw < 1024 * 1024) 
-         printf( "(%lu KB", i_bytes_raw / 1024 );
-       else 
-         printf( "(%lu MB", i_bytes_raw / (1024 * 1024) );
-
-       printf(" raw, ");
-       if (i_bytes_formatted < 1024) 
-         printf( "%lu bytes", i_bytes_formatted );
-       if (i_bytes_formatted < 1024 * 1024) 
-         printf( "%lu KB", i_bytes_formatted / 1024 );
-       else 
-         printf( "%lu MB", i_bytes_formatted / (1024 * 1024) );
-
-       printf(" formatted)\n");
-
-      }
-      free(psz_msf);
-      break;
-    } else if (!opts.no_tracks) {
-      sprintf(temp_msg, "%3d: %8s  %06lu  %-5s %s\n", (int) i, psz_msf,
-            (long unsigned int) cdio_msf_to_lsn(&msf),
-            track_format2str[cdio_get_track_format(p_cdio, i)],
-            cdio_get_track_green(p_cdio, i)? "true" : "false");
-         report(stdout, temp_msg);
-
-      switch (cdio_get_track_copy_permit(p_cdio, i)) {
-      case CDIO_TRACK_FLAG_FALSE:
-       psz="no";
-       break;
-      case CDIO_TRACK_FLAG_TRUE:
-       psz="yes";
-       break;
-      case CDIO_TRACK_FLAG_UNKNOWN:
-       psz="?";
-       break;
-      case CDIO_TRACK_FLAG_ERROR:
-      default:
-       psz="error";
-       break;
-      }
-      printf("%-5s", psz);
-       
-      if (TRACK_FORMAT_AUDIO == track_format) {
-       const int i_channels = cdio_get_track_channels(p_cdio, i);
-       switch (cdio_get_track_preemphasis(p_cdio, i)) {
-       case CDIO_TRACK_FLAG_FALSE:
-         psz="no";
-         break;
-       case CDIO_TRACK_FLAG_TRUE:
-         psz="yes";
-         break;
-       case CDIO_TRACK_FLAG_UNKNOWN:
-         psz="?";
-         break;
-       case CDIO_TRACK_FLAG_ERROR:
-       default:
-         psz="error";
-         break;
-       }
-       if (i_channels == -2) 
-         printf(" %-8s", "unknown");
-       else if (i_channels == -1) 
-         printf(" %-8s", "error");
-       else 
-         printf(" %-8d", i_channels);
-       printf( " %s", psz);
-      }
-      
-      printf( "\n" );
-      
-    }
-    free(psz_msf);
-    
-    if (TRACK_FORMAT_AUDIO == track_format) {
-      num_audio++;
-      if (-1 == first_audio) first_audio = i;
-    } else {
-      num_data++;
-      if (-1 == first_data)  first_data = i;
-    }
-    /* skip to leadout? */
-    if (i == i_tracks) i = CDIO_CDROM_LEADOUT_TRACK-1;
-  }
-
-  if (cdio_is_discmode_cdrom(discmode)) {
-    /* get and print MCN */
-    media_catalog_number = cdio_get_mcn(p_cdio);
-  
-    sprintf(temp_msg, "Media Catalog Number (MCN): "); 
-       report(stdout, temp_msg);
-       fflush(stdout);
-       if (NULL == media_catalog_number) {
-      sprintf(temp_msg, "not available\n");
-         report(stdout, temp_msg);
-       }
-    else {
-      sprintf(temp_msg, "%s\n", media_catalog_number);
-         report(stdout, temp_msg);
-      free(media_catalog_number);
-    }
-  }
-  
-  
-    
-#if CDIO_IOCTL_FINISHED
-  if (!opts.no_ioctl) {
-    report(stdout, "What ioctl's report...\n");
-  
-#ifdef CDROMMULTISESSION
-    /* get multisession */
-    sprintf(temp_msg, "multisession: "); 
-       report(stdout, temp_msg);
-       fflush(stdout);
-    ms.addr_format = CDROM_LBA;
-       if (ioctl(filehandle,CDROMMULTISESSION,&ms)) {
-      sprintf(temp_msg, "FAILED\n");
-         report(stdout, temp_msg);
-       }
-       else {
-      sprintf(temp_msg, "%d%s\n",ms.addr.lba,ms.xa_flag?" XA":"");
-         report(stdout, temp_msg);
-       }
-#endif 
-    
-#ifdef CDROMSUBCHNL
-    /* get audio status from subchnl */
-    sprintf(temp_msg, "audio status: "); 
-       report(stdout, temp_msg);
-       fflush(stdout);
-    sub.cdsc_format = CDROM_MSF;
-       if (ioctl(filehandle,CDROMSUBCHNL,&sub)) {
-      sprintf(temp_msg, "FAILED\n");
-         report(stdout, temp_msg);
-       }
-    else {
-      switch (sub.cdsc_audiostatus) {
-      case CDROM_AUDIO_INVALID:    
-                 sprintf(temp_msg, "invalid\n");   
-                 report(stdout, temp_msg);
-                 break;
-      case CDROM_AUDIO_PLAY:       
-                 sprintf(temp_msg, "playing");     
-                 report(stdout, temp_msg);
-                 break;
-      case CDROM_AUDIO_PAUSED:     
-                 sprintf(temp_msg, "paused");      
-                 report(stdout, temp_msg);
-                 break;
-      case CDROM_AUDIO_COMPLETED:  
-                 sprintf(temp_msg, "completed\n"); 
-                 report(stdout, temp_msg);
-                 break;
-      case CDROM_AUDIO_ERROR:      
-                 sprintf(temp_msg, "error\n");     
-                 report(stdout, temp_msg);
-                 break;
-      case CDROM_AUDIO_NO_STATUS:  
-                 sprintf(temp_msg, "no status\n"); 
-                 report(stdout, temp_msg);
-                 break;
-      default:                     
-                 sprintf(temp_msg, "Oops: unknown\n");
-                 report(stdout, temp_msg);
-      }
-      if (sub.cdsc_audiostatus == CDROM_AUDIO_PLAY ||
-         sub.cdsc_audiostatus == CDROM_AUDIO_PAUSED) {
-               sprintf(temp_msg, " at: %02d:%02d abs / %02d:%02d track %d\n",
-              sub.cdsc_absaddr.msf.minute,
-              sub.cdsc_absaddr.msf.second,
-              sub.cdsc_reladdr.msf.minute,
-              sub.cdsc_reladdr.msf.second,
-              sub.cdsc_trk);
-           report(stdout, temp_msg);
-      }
-    }
-#endif  /* CDROMSUBCHNL */
-  }
-#endif /*CDIO_IOCTL_FINISHED*/
-  
-  if (!opts.no_analysis) {
-    report(stdout, STRONG "CD Analysis Report\n" NORMAL);
-    
-    /* try to find out what sort of CD we have */
-    if (0 == num_data) {
-      /* no data track, may be a "real" audio CD or hidden track CD */
-      
-      msf_t msf;
-      cdio_get_track_msf(p_cdio, i_first_track, &msf);
-      
-      /* CD-I/Ready says start_track_lsn <= 30*75 then CDDA */
-      if (start_track_lsn > 100 /* 100 is just a guess */) {
-       fs = cdio_guess_cd_type(p_cdio, 0, 1, &cdio_iso_analysis);
-       if ((CDIO_FSTYPE(fs)) != CDIO_FS_UNKNOWN)
-         fs |= CDIO_FS_ANAL_HIDDEN_TRACK;
-       else {
-         fs &= ~CDIO_FS_MASK; /* del filesystem info */
-         sprintf(temp_msg, "Oops: %lu unused sectors at start, "
-                "but hidden track check failed.\n",
-                (long unsigned int) start_track_lsn);
-         report(stdout, temp_msg);
-       }
-      }
-      print_analysis(ms_offset, cdio_iso_analysis, fs, first_data, num_audio,
-                    i_tracks, i_first_track, 
-                    cdio_get_track_format(p_cdio, 1), p_cdio);
-    } else {
-      /* we have data track(s) */
-      int j;
-
-      for (j = 2, i = first_data; i <= i_tracks; i++) {
-       msf_t msf;
-       track_format_t track_format = cdio_get_track_format(p_cdio, i);
-      
-       cdio_get_track_msf(p_cdio, i, &msf);
-
-       switch ( track_format ) {
-       case TRACK_FORMAT_AUDIO:
-       case TRACK_FORMAT_ERROR:
-         break;
-       case TRACK_FORMAT_CDI:
-       case TRACK_FORMAT_XA:
-       case TRACK_FORMAT_DATA: 
-       case TRACK_FORMAT_PSX: 
-         ;
-       }
-       
-       start_track_lsn = (i == 1) ? 0 : cdio_msf_to_lsn(&msf);
-       
-       /* save the start of the data area */
-       if (i == first_data) 
-         data_start = start_track_lsn;
-       
-       /* skip tracks which belong to the current walked session */
-       if (start_track_lsn < data_start + cdio_iso_analysis.isofs_size)
-         continue;
-       
-       fs = cdio_guess_cd_type(p_cdio, start_track_lsn, i, 
-                               &cdio_iso_analysis);
-
-       if (i > 1) {
-         /* track is beyond last session -> new session found */
-         ms_offset = start_track_lsn;
-         sprintf(temp_msg, "session #%d starts at track %2i, LSN: %lu,"
-                " ISO 9660 blocks: %6i\n",
-                j++, i, (unsigned long int) start_track_lsn, 
-                cdio_iso_analysis.isofs_size);
-         report(stdout, temp_msg);
-         sprintf(temp_msg, "ISO 9660: %i blocks, label `%.32s'\n",
-                cdio_iso_analysis.isofs_size, cdio_iso_analysis.iso_label);
-         report(stdout, temp_msg);
-         fs |= CDIO_FS_ANAL_MULTISESSION;
-       } else {
-         print_analysis(ms_offset, cdio_iso_analysis, fs, first_data, 
-                        num_audio, i_tracks, i_first_track, 
-                        track_format, p_cdio);
-       }
-
-       if ( !(CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660 ||
-              CDIO_FSTYPE(fs) == CDIO_FS_ISO_HFS  ||
-              /* CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660_INTERACTIVE) 
-                 && (fs & XA))) */
-              CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660_INTERACTIVE) )
-         /* no method for non-ISO9660 multisessions */
-         break;
-      }
-    }
-  }
-
-  myexit(p_cdio, EXIT_SUCCESS);
-  /* Not reached:*/
-  return(EXIT_SUCCESS);
-}