|
Packit |
dd8086 |
/*
|
|
Packit |
dd8086 |
Copyright (C) 2003-2004, 2008-2009, 2012, 2017 Rocky Bernstein <rocky@gnu.org>
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
This program is free software: you can redistribute it and/or modify
|
|
Packit |
dd8086 |
it under the terms of the GNU General Public License as published by
|
|
Packit |
dd8086 |
the Free Software Foundation, either version 3 of the License, or
|
|
Packit |
dd8086 |
(at your option) any later version.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
This program is distributed in the hope that it will be useful,
|
|
Packit |
dd8086 |
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
dd8086 |
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
dd8086 |
GNU General Public License for more details.
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
You should have received a copy of the GNU General Public License
|
|
Packit |
dd8086 |
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/*
|
|
Packit |
dd8086 |
A slightly improved sample3 program: we handle cdio logging and
|
|
Packit |
dd8086 |
take an optional CD-location.
|
|
Packit |
dd8086 |
*/
|
|
Packit |
dd8086 |
#ifdef HAVE_CONFIG_H
|
|
Packit |
dd8086 |
#include "config.h"
|
|
Packit |
dd8086 |
#define __CDIO_CONFIG_H__ 1
|
|
Packit |
dd8086 |
#endif
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#ifdef HAVE_STDIO_H
|
|
Packit |
dd8086 |
#include <stdio.h>
|
|
Packit |
dd8086 |
#endif
|
|
Packit |
dd8086 |
#ifdef HAVE_STDLIB_H
|
|
Packit |
dd8086 |
#include <stdlib.h>
|
|
Packit |
dd8086 |
#endif
|
|
Packit |
dd8086 |
#ifdef HAVE_STRING_H
|
|
Packit |
dd8086 |
#include <string.h>
|
|
Packit |
dd8086 |
#endif
|
|
Packit |
dd8086 |
#ifdef HAVE_SYS_TYPES_H
|
|
Packit |
dd8086 |
#include <sys/types.h>
|
|
Packit |
dd8086 |
#endif
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
#include <cdio/cdio.h>
|
|
Packit |
dd8086 |
#include <cdio/cd_types.h>
|
|
Packit |
dd8086 |
#include <cdio/logging.h>
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
static void
|
|
Packit |
dd8086 |
log_handler (cdio_log_level_t level, const char message[])
|
|
Packit |
dd8086 |
{
|
|
Packit |
dd8086 |
switch(level) {
|
|
Packit |
dd8086 |
case CDIO_LOG_DEBUG:
|
|
Packit |
dd8086 |
case CDIO_LOG_INFO:
|
|
Packit |
dd8086 |
return;
|
|
Packit |
dd8086 |
default:
|
|
Packit |
dd8086 |
printf("cdio %d message: %s\n", level, message);
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
static void
|
|
Packit |
dd8086 |
print_analysis(cdio_iso_analysis_t cdio_iso_analysis,
|
|
Packit |
dd8086 |
cdio_fs_anal_t fs, int first_data, unsigned int num_audio)
|
|
Packit |
dd8086 |
{
|
|
Packit |
dd8086 |
switch(CDIO_FSTYPE(fs)) {
|
|
Packit |
dd8086 |
case CDIO_FS_AUDIO:
|
|
Packit |
dd8086 |
break;
|
|
Packit |
dd8086 |
case CDIO_FS_ISO_9660:
|
|
Packit |
dd8086 |
printf("CD-ROM with ISO 9660 filesystem");
|
|
Packit |
dd8086 |
if (fs & CDIO_FS_ANAL_JOLIET) {
|
|
Packit |
dd8086 |
printf(" and joliet extension level %d", cdio_iso_analysis.joliet_level);
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (fs & CDIO_FS_ANAL_ROCKRIDGE)
|
|
Packit |
dd8086 |
printf(" and rockridge extensions");
|
|
Packit |
dd8086 |
printf("\n");
|
|
Packit |
dd8086 |
break;
|
|
Packit |
dd8086 |
case CDIO_FS_ISO_9660_INTERACTIVE:
|
|
Packit |
dd8086 |
printf("CD-ROM with CD-RTOS and ISO 9660 filesystem\n");
|
|
Packit |
dd8086 |
break;
|
|
Packit |
dd8086 |
case CDIO_FS_HIGH_SIERRA:
|
|
Packit |
dd8086 |
printf("CD-ROM with High Sierra filesystem\n");
|
|
Packit |
dd8086 |
break;
|
|
Packit |
dd8086 |
case CDIO_FS_INTERACTIVE:
|
|
Packit |
dd8086 |
printf("CD-Interactive%s\n", num_audio > 0 ? "/Ready" : "");
|
|
Packit |
dd8086 |
break;
|
|
Packit |
dd8086 |
case CDIO_FS_HFS:
|
|
Packit |
dd8086 |
printf("CD-ROM with Macintosh HFS\n");
|
|
Packit |
dd8086 |
break;
|
|
Packit |
dd8086 |
case CDIO_FS_ISO_HFS:
|
|
Packit |
dd8086 |
printf("CD-ROM with both Macintosh HFS and ISO 9660 filesystem\n");
|
|
Packit |
dd8086 |
break;
|
|
Packit |
dd8086 |
case CDIO_FS_UFS:
|
|
Packit |
dd8086 |
printf("CD-ROM with Unix UFS\n");
|
|
Packit |
dd8086 |
break;
|
|
Packit |
dd8086 |
case CDIO_FS_EXT2:
|
|
Packit |
dd8086 |
printf("CD-ROM with Linux second extended filesystem\n");
|
|
Packit |
dd8086 |
break;
|
|
Packit |
dd8086 |
case CDIO_FS_3DO:
|
|
Packit |
dd8086 |
printf("CD-ROM with Panasonic 3DO filesystem\n");
|
|
Packit |
dd8086 |
break;
|
|
Packit |
dd8086 |
case CDIO_FS_UNKNOWN:
|
|
Packit |
dd8086 |
printf("CD-ROM with unknown filesystem\n");
|
|
Packit |
dd8086 |
break;
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
switch(CDIO_FSTYPE(fs)) {
|
|
Packit |
dd8086 |
case CDIO_FS_ISO_9660:
|
|
Packit |
dd8086 |
case CDIO_FS_ISO_9660_INTERACTIVE:
|
|
Packit |
dd8086 |
case CDIO_FS_ISO_HFS:
|
|
Packit |
dd8086 |
printf("ISO 9660: %i blocks, label `%.32s'\n",
|
|
Packit |
dd8086 |
cdio_iso_analysis.isofs_size, cdio_iso_analysis.iso_label);
|
|
Packit |
dd8086 |
break;
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (first_data == 1 && num_audio > 0)
|
|
Packit |
dd8086 |
printf("mixed mode CD ");
|
|
Packit |
dd8086 |
if (fs & CDIO_FS_ANAL_XA)
|
|
Packit |
dd8086 |
printf("XA sectors ");
|
|
Packit |
dd8086 |
if (fs & CDIO_FS_ANAL_MULTISESSION)
|
|
Packit |
dd8086 |
printf("Multisession");
|
|
Packit |
dd8086 |
if (fs & CDIO_FS_ANAL_HIDDEN_TRACK)
|
|
Packit |
dd8086 |
printf("Hidden Track ");
|
|
Packit |
dd8086 |
if (fs & CDIO_FS_ANAL_PHOTO_CD)
|
|
Packit |
dd8086 |
printf("%sPhoto CD ",
|
|
Packit |
dd8086 |
num_audio > 0 ? " Portfolio " : "");
|
|
Packit |
dd8086 |
if (fs & CDIO_FS_ANAL_CDTV)
|
|
Packit |
dd8086 |
printf("Commodore CDTV ");
|
|
Packit |
dd8086 |
if (first_data > 1)
|
|
Packit |
dd8086 |
printf("CD-Plus/Extra ");
|
|
Packit |
dd8086 |
if (fs & CDIO_FS_ANAL_BOOTABLE)
|
|
Packit |
dd8086 |
printf("bootable CD ");
|
|
Packit |
dd8086 |
if (fs & CDIO_FS_ANAL_VIDEOCD && num_audio == 0) {
|
|
Packit |
dd8086 |
printf("Video CD ");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
if (fs & CDIO_FS_ANAL_SVCD)
|
|
Packit |
dd8086 |
printf("Super Video CD (SVCD) or Chaoji Video CD (CVD)");
|
|
Packit |
dd8086 |
if (fs & CDIO_FS_ANAL_CVD)
|
|
Packit |
dd8086 |
printf("Chaoji Video CD (CVD)");
|
|
Packit |
dd8086 |
printf("\n");
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
int
|
|
Packit |
dd8086 |
main(int argc, const char *argv[])
|
|
Packit |
dd8086 |
{
|
|
Packit |
dd8086 |
CdIo_t *p_cdio;
|
|
Packit |
dd8086 |
cdio_fs_anal_t fs=0;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
track_t num_tracks;
|
|
Packit |
dd8086 |
track_t first_track_num;
|
|
Packit |
dd8086 |
lsn_t start_track; /* first sector of track */
|
|
Packit |
dd8086 |
lsn_t data_start =0; /* start of data area */
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
int first_data = -1; /* # of first data track */
|
|
Packit |
dd8086 |
int first_audio = -1; /* # of first audio track */
|
|
Packit |
dd8086 |
unsigned int num_data = 0; /* # of data tracks */
|
|
Packit |
dd8086 |
unsigned int num_audio = 0; /* # of audio tracks */
|
|
Packit |
dd8086 |
unsigned int i;
|
|
Packit |
dd8086 |
char *cd_image_name = NULL;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
if (argc > 1)
|
|
Packit |
dd8086 |
cd_image_name = strdup(argv[1]);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
cdio_log_set_handler (log_handler);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
p_cdio = cdio_open (cd_image_name, DRIVER_UNKNOWN);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
if (NULL == p_cdio) {
|
|
Packit |
dd8086 |
printf("-- Problem in trying to find a driver.\n\n");
|
|
Packit |
dd8086 |
free(cd_image_name);
|
|
Packit |
dd8086 |
return 77;
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
first_track_num = cdio_get_first_track_num(p_cdio);
|
|
Packit |
dd8086 |
num_tracks = cdio_get_num_tracks(p_cdio);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/* Count the number of data and audio tracks. */
|
|
Packit |
dd8086 |
for (i = first_track_num; i <= num_tracks; i++) {
|
|
Packit |
dd8086 |
if (TRACK_FORMAT_AUDIO == cdio_get_track_format(p_cdio, i)) {
|
|
Packit |
dd8086 |
num_audio++;
|
|
Packit |
dd8086 |
if (-1 == first_audio) first_audio = i;
|
|
Packit |
dd8086 |
} else {
|
|
Packit |
dd8086 |
num_data++;
|
|
Packit |
dd8086 |
if (-1 == first_data) first_data = i;
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/* try to find out what sort of CD we have */
|
|
Packit |
dd8086 |
if (0 == num_data) {
|
|
Packit |
dd8086 |
printf("-- Audio CD\n");
|
|
Packit |
dd8086 |
} else {
|
|
Packit |
dd8086 |
/* we have data track(s) */
|
|
Packit |
dd8086 |
cdio_iso_analysis_t cdio_iso_analysis;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
memset(&cdio_iso_analysis, 0, sizeof(cdio_iso_analysis));
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
for (i = first_data; i <= num_tracks; i++) {
|
|
Packit |
dd8086 |
lsn_t lsn;
|
|
Packit |
dd8086 |
track_format_t track_format = cdio_get_track_format(p_cdio, i);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
lsn = cdio_get_track_lsn(p_cdio, i);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
switch ( track_format ) {
|
|
Packit |
dd8086 |
case TRACK_FORMAT_AUDIO:
|
|
Packit |
dd8086 |
case TRACK_FORMAT_ERROR:
|
|
Packit |
dd8086 |
break;
|
|
Packit |
dd8086 |
case TRACK_FORMAT_CDI:
|
|
Packit |
dd8086 |
case TRACK_FORMAT_XA:
|
|
Packit |
dd8086 |
case TRACK_FORMAT_DATA:
|
|
Packit |
dd8086 |
case TRACK_FORMAT_PSX:
|
|
Packit |
dd8086 |
;
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
start_track = (i == 1) ? 0 : lsn;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/* save the start of the data area */
|
|
Packit |
dd8086 |
if (i == first_data)
|
|
Packit |
dd8086 |
data_start = start_track;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
/* skip tracks which belong to the current walked session */
|
|
Packit |
dd8086 |
if (start_track < data_start + cdio_iso_analysis.isofs_size)
|
|
Packit |
dd8086 |
continue;
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
fs = cdio_guess_cd_type(p_cdio, start_track, i, &cdio_iso_analysis);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
print_analysis(cdio_iso_analysis, fs, first_data, num_audio);
|
|
Packit |
dd8086 |
|
|
Packit |
dd8086 |
if ( !(CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660 ||
|
|
Packit |
dd8086 |
CDIO_FSTYPE(fs) == CDIO_FS_ISO_HFS ||
|
|
Packit |
dd8086 |
CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660_INTERACTIVE) )
|
|
Packit |
dd8086 |
/* no method for non-ISO9660 multisessions */
|
|
Packit |
dd8086 |
break;
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
}
|
|
Packit |
dd8086 |
free(cd_image_name);
|
|
Packit |
dd8086 |
cdio_destroy(p_cdio);
|
|
Packit |
dd8086 |
return 0;
|
|
Packit |
dd8086 |
}
|