diff --git a/src/Makefile.am b/src/Makefile.am index 7b049a07..5036f268 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -1,4 +1,4 @@ -# $Id: Makefile.am,v 1.10 2003/08/14 13:41:26 rocky Exp $ +# $Id: Makefile.am,v 1.11 2003/08/16 12:59:03 rocky Exp $ # # Copyright (C) 2003 Rocky Bernstein # @@ -24,12 +24,14 @@ CDDB_LIBS=@CDDB_LIBS@ if BUILD_CDINFO cd_info_SOURCES = cd-info.c analyze.c analyze.h cd_info_LDADD = $(LIBCDIO_LIBS) $(LIBPOPT_LIBS) $(CDDB_LIBS) $(VCDINFO_LIBS) +cd_info_old_SOURCES = cd-info-old.c +cd_info_old_LDADD = $(LIBCDIO_LIBS) $(LIBPOPT_LIBS) $(CDDB_LIBS) $(VCDINFO_LIBS) if BUILD_CDINFO_LINUX cdinfo_linux_SOURCES = cdinfo-linux.c cdinfo_linux_LDADD = $(LIBCDIO_LIBS) $(LIBPOPT_LIBS) bin_PROGRAMS = cd-info cdinfo-linux else -bin_PROGRAMS = cd-info +bin_PROGRAMS = cd-info cd-info-old EXTRA_DIST = cdinfo-linux.c endif else diff --git a/src/analyze.c b/src/analyze.c index 81d508ff..bf487324 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -1,9 +1,9 @@ /* - $Id: analyze.c,v 1.1 2003/08/14 13:41:26 rocky Exp $ + $Id: analyze.c,v 1.2 2003/08/16 12:59:03 rocky Exp $ Copyright (C) 2003 Rocky Bernstein Copyright (C) 1996,1997,1998 Gerd Knorr - and Heiko Eifeldt + and Heiko Eifeldt 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 @@ -117,9 +117,8 @@ static signature_t sigs[] = #define IS_UFS 9 #define IS_BOOTABLE 10 #define IS_VIDEO_CD 11 /* Video CD */ -#define IS_SVCD 12 /* Chinese Video CD - slightly incompatible with SVCD */ - -cdio_analysis_t cdio_analysis; +#define IS_SVCD 12 /* CVD *or* SVCD */ +#define IS_CVD 13 /* CVD - slightly incompatible with SVCD */ /* ------------------------------------------------------------------------ */ /* some ISO 9660 fiddling */ @@ -153,7 +152,7 @@ read_block(CdIo *cdio, int superblock, uint32_t offset, uint8_t bufnum, } static bool -is_it(int num) +_cdio_is_it(int num) { signature_t *sigp=&sigs[num]; int len=strlen(sigp->sig_str); @@ -163,7 +162,7 @@ is_it(int num) } static int -is_hfs(void) +_cdio_is_hfs(void) { return (0 == memcmp(&buffer[1][512],"PM",2)) || (0 == memcmp(&buffer[1][512],"TS",2)) || @@ -171,29 +170,32 @@ is_hfs(void) } static int -is_3do(void) +_cdio_is_3do(void) { return (0 == memcmp(&buffer[1][0],"\x01\x5a\x5a\x5a\x5a\x5a\x01", 7)) && (0 == memcmp(&buffer[1][40], "CD-ROM", 6)); } -static int is_joliet(void) +static int +_cdio_is_joliet(void) { return 2 == buffer[3][0] && buffer[3][88] == 0x25 && buffer[3][89] == 0x2f; } /* ISO 9660 volume space in M2F1_SECTOR_SIZE byte units */ static int -get_size(void) +_cdio_get_iso9660_fs_sec_count(void) { - return ((buffer[0][80] & 0xff) | - ((buffer[0][81] & 0xff) << 8) | - ((buffer[0][82] & 0xff) << 16) | - ((buffer[0][83] & 0xff) << 24)); + int sec_count = + ((buffer[0][80] & 0xff) | + ((buffer[0][81] & 0xff) << 8) | + ((buffer[0][82] & 0xff) << 16) | + ((buffer[0][83] & 0xff) << 24)); + return sec_count; } static int -get_joliet_level( void ) +_cdio_get_joliet_level( void ) { switch (buffer[3][90]) { case 0x40: return 1; @@ -207,78 +209,81 @@ get_joliet_level( void ) if (is_it(sig)) printf("%s, ", sigs[sig].description) int -guess_filesystem(CdIo *cdio, int start_session, track_t track_num) +cdio_guess_filesystem(/*in*/ CdIo *cdio, int start_session, track_t track_num, + /*out*/ cdio_analysis_t *cdio_analysis) { int ret = 0; if (read_block(cdio, ISO_SUPERBLOCK_SECTOR, start_session, 0, track_num) < 0) - return FS_UNKNOWN; + return CDIO_FS_UNKNOWN; /* filesystem */ - if (is_it(IS_CD_I) && is_it(IS_CD_RTOS) - && !is_it(IS_BRIDGE) && !is_it(IS_XA)) { - return FS_INTERACTIVE; - } else { /* read sector 0 ONLY, when NO greenbook CD-I !!!! */ + if (_cdio_is_it(IS_CD_I) && _cdio_is_it(IS_CD_RTOS) + && !_cdio_is_it(IS_BRIDGE) && !_cdio_is_it(IS_XA)) { + return CDIO_FS_INTERACTIVE; + } else { + /* read sector 0 ONLY, when NO greenbook CD-I !!!! */ if (read_block(cdio, 0, start_session, 1, track_num) < 0) return ret; - if (is_it(IS_HS)) - ret |= FS_HIGH_SIERRA; - else if (is_it(IS_ISOFS)) { - if (is_it(IS_CD_RTOS) && is_it(IS_BRIDGE)) - ret = FS_ISO_9660_INTERACTIVE; - else if (is_hfs()) - ret = FS_ISO_HFS; + if (_cdio_is_it(IS_HS)) + ret |= CDIO_FS_HIGH_SIERRA; + else if (_cdio_is_it(IS_ISOFS)) { + if (_cdio_is_it(IS_CD_RTOS) && _cdio_is_it(IS_BRIDGE)) + ret = CDIO_FS_ISO_9660_INTERACTIVE; + else if (_cdio_is_hfs()) + ret = CDIO_FS_ISO_HFS; else - ret = FS_ISO_9660; - cdio_analysis.isofs_size = get_size(); - sprintf(cdio_analysis.iso_label, buffer[0]+40); + ret = CDIO_FS_ISO_9660; + cdio_analysis->isofs_size = _cdio_get_iso9660_fs_sec_count(); + sprintf(cdio_analysis->iso_label, buffer[0]+40); #if 0 - if (is_rockridge()) + if (_cdio_is_rockridge()) ret |= ROCKRIDGE; #endif if (read_block(cdio, BOOT_SECTOR, start_session, 3, track_num) < 0) return ret; - if (is_joliet()) { - cdio_analysis.joliet_level = get_joliet_level(); + if (_cdio_is_joliet()) { + cdio_analysis->joliet_level = _cdio_get_joliet_level(); ret |= JOLIET; } - if (is_it(IS_BOOTABLE)) + if (_cdio_is_it(IS_BOOTABLE)) ret |= BOOTABLE; - if (is_it(IS_XA) && is_it(IS_ISOFS) - && !is_it(IS_PHOTO_CD)) { + if (_cdio_is_it(IS_XA) && _cdio_is_it(IS_ISOFS) + && !_cdio_is_it(IS_PHOTO_CD)) { if (read_block(cdio, VCD_INFO_SECTOR, start_session, 4, track_num) < 0) return ret; - if (is_it(IS_BRIDGE) && is_it(IS_CD_RTOS)) { - if (is_it(IS_VIDEO_CD)) ret |= VIDEOCDI; - else if (is_it(IS_SVCD)) ret |= SVCD; - } + if (_cdio_is_it(IS_BRIDGE) && _cdio_is_it(IS_CD_RTOS)) { + if (_cdio_is_it(IS_VIDEO_CD)) ret |= VIDEOCDI; + else if (_cdio_is_it(IS_SVCD)) ret |= SVCD; + } else if (_cdio_is_it(IS_SVCD)) ret |= CVD; + } } - else if (is_hfs()) ret |= FS_HFS; - else if (is_it(IS_EXT2)) ret |= FS_EXT2; - else if (is_3do()) ret |= FS_3DO; + else if (_cdio_is_hfs()) ret |= CDIO_FS_HFS; + else if (_cdio_is_it(IS_EXT2)) ret |= CDIO_FS_EXT2; + else if (_cdio_is_3do()) ret |= CDIO_FS_3DO; else { if (read_block(cdio, UFS_SUPERBLOCK_SECTOR, start_session, 2, track_num) < 0) return ret; - if (is_it(IS_UFS)) - ret |= FS_UFS; + if (_cdio_is_it(IS_UFS)) + ret |= CDIO_FS_UFS; else - ret |= FS_UNKNOWN; + ret |= CDIO_FS_UNKNOWN; } } /* other checks */ - if (is_it(IS_XA)) ret |= XA; - if (is_it(IS_PHOTO_CD)) ret |= PHOTO_CD; - if (is_it(IS_CDTV)) ret |= CDTV; + if (_cdio_is_it(IS_XA)) ret |= XA; + if (_cdio_is_it(IS_PHOTO_CD)) ret |= PHOTO_CD; + if (_cdio_is_it(IS_CDTV)) ret |= CDTV; return ret; } diff --git a/src/analyze.h b/src/analyze.h index d1ef40d0..de65000b 100644 --- a/src/analyze.h +++ b/src/analyze.h @@ -1,5 +1,5 @@ /* - $Id: analyze.h,v 1.1 2003/08/14 13:41:26 rocky Exp $ + $Id: analyze.h,v 1.2 2003/08/16 12:59:03 rocky Exp $ Copyright (C) 2003 Rocky Bernstein Copyright (C) 1996,1997,1998 Gerd Knorr @@ -29,30 +29,33 @@ #define VIDEOCDI 1024 #define ROCKRIDGE 2048 #define JOLIET 4096 -#define SVCD 8192 /* Choiji Video CD */ +#define SVCD 8192 /* Super VCD or Choiji Video CD */ +#define CVD 16384 /* Choiji Video CD */ -#define FS_NO_DATA 0 /* audio only */ -#define FS_HIGH_SIERRA 1 -#define FS_ISO_9660 2 -#define FS_INTERACTIVE 3 -#define FS_HFS 4 -#define FS_UFS 5 -#define FS_EXT2 6 -#define FS_ISO_HFS 7 /* both hfs & isofs filesystem */ -#define FS_ISO_9660_INTERACTIVE 8 /* both CD-RTOS and isofs filesystem */ -#define FS_3DO 9 -#define FS_UNKNOWN 15 -#define FS_MASK 15 +#define CDIO_FS_NO_DATA 0 /* audio only */ +#define CDIO_FS_HIGH_SIERRA 1 +#define CDIO_FS_ISO_9660 2 +#define CDIO_FS_INTERACTIVE 3 +#define CDIO_FS_HFS 4 +#define CDIO_FS_UFS 5 +#define CDIO_FS_EXT2 6 +#define CDIO_FS_ISO_HFS 7 /* both hfs & isofs filesystem */ +#define CDIO_FS_ISO_9660_INTERACTIVE 8 /* both CD-RTOS and isofs filesystem */ +#define CDIO_FS_3DO 9 +#define CDIO_FS_UNKNOWN 15 +#define CDIO_FS_MASK 15 typedef struct { int joliet_level; - char iso_label[32]; + char iso_label[33]; /* 32 + 1 for null byte at the end in formatting */ int isofs_size; } cdio_analysis_t; -extern cdio_analysis_t cdio_analysis; - - -int guess_filesystem(CdIo *cdio, int start_session, track_t track_num); +/* + Try to determine what kind of filesystem is at track track_num +*/ +int cdio_guess_filesystem(/*in*/ CdIo *cdio, int start_session, + track_t track_num, + /*out*/ cdio_analysis_t *cdio_analysis); diff --git a/src/cd-info.c b/src/cd-info.c index 9521268a..fdaabbdf 100644 --- a/src/cd-info.c +++ b/src/cd-info.c @@ -1,5 +1,5 @@ /* - $Id: cd-info.c,v 1.18 2003/08/14 13:41:26 rocky Exp $ + $Id: cd-info.c,v 1.19 2003/08/16 12:59:03 rocky Exp $ Copyright (C) 2003 Rocky Bernstein Copyright (C) 1996,1997,1998 Gerd Knorr @@ -109,8 +109,7 @@ #endif CdIo *cdio; -track_t num_tracks; -track_t first_track_num; +cdio_analysis_t cdio_analysis; #if CDIO_IOCTL_FINISHED struct cdrom_mcn mcn; @@ -480,7 +479,7 @@ _log_handler (cdio_log_level_t level, const char message[]) #ifdef HAVE_CDDB static void -print_cddb_info() { +print_cddb_info(track_t num_tracks, track_t first_track_num) { int i, matches; cddb_conn_t *conn = cddb_new(); @@ -600,21 +599,21 @@ print_vcd_info(void) { static void print_analysis(int ms_offset, cdio_analysis_t cdio_analysis, int fs, int first_data, int num_audio, - int num_tracks, CdIo *cdio) + track_t num_tracks, track_t first_track_num, CdIo *cdio) { int need_lf; - switch(fs & FS_MASK) { - case FS_NO_DATA: + switch(fs & CDIO_FS_MASK) { + case CDIO_FS_NO_DATA: if (num_audio > 0) { printf("Audio CD, CDDB disc ID is %08lx\n", cddb_discid(cdio, num_tracks)); #ifdef HAVE_CDDB - if (!opts.no_cddb) print_cddb_info(); + if (!opts.no_cddb) print_cddb_info(num_tracks, first_track_num); #endif } break; - case FS_ISO_9660: + case CDIO_FS_ISO_9660: printf("CD-ROM with ISO 9660 filesystem"); if (fs & JOLIET) { printf(" and joliet extension level %d", cdio_analysis.joliet_level); @@ -623,38 +622,38 @@ print_analysis(int ms_offset, cdio_analysis_t cdio_analysis, printf(" and rockridge extensions"); printf("\n"); break; - case FS_ISO_9660_INTERACTIVE: + case CDIO_FS_ISO_9660_INTERACTIVE: printf("CD-ROM with CD-RTOS and ISO 9660 filesystem\n"); break; - case FS_HIGH_SIERRA: + case CDIO_FS_HIGH_SIERRA: printf("CD-ROM with High Sierra filesystem\n"); break; - case FS_INTERACTIVE: + case CDIO_FS_INTERACTIVE: printf("CD-Interactive%s\n", num_audio > 0 ? "/Ready" : ""); break; - case FS_HFS: + case CDIO_FS_HFS: printf("CD-ROM with Macintosh HFS\n"); break; - case FS_ISO_HFS: + case CDIO_FS_ISO_HFS: printf("CD-ROM with both Macintosh HFS and ISO 9660 filesystem\n"); break; - case FS_UFS: + case CDIO_FS_UFS: printf("CD-ROM with Unix UFS\n"); break; - case FS_EXT2: + case CDIO_FS_EXT2: printf("CD-ROM with Linux second extended filesystem\n"); break; - case FS_3DO: + case CDIO_FS_3DO: printf("CD-ROM with Panasonic 3DO filesystem\n"); break; - case FS_UNKNOWN: + case CDIO_FS_UNKNOWN: printf("CD-ROM with unknown filesystem\n"); break; } - switch(fs & FS_MASK) { - case FS_ISO_9660: - case FS_ISO_9660_INTERACTIVE: - case FS_ISO_HFS: + switch(fs & CDIO_FS_MASK) { + case CDIO_FS_ISO_9660: + case CDIO_FS_ISO_9660_INTERACTIVE: + case CDIO_FS_ISO_HFS: printf("ISO 9660: %i blocks, label `%.32s'\n", cdio_analysis.isofs_size, cdio_analysis.iso_label); break; @@ -688,6 +687,8 @@ print_analysis(int ms_offset, cdio_analysis_t cdio_analysis, } if (fs & SVCD) need_lf += printf("Super Video CD (SVCD) or Chaoji Video CD (CVD)"); + if (fs & CVD) + need_lf += printf("Chaoji Video CD (CVD)"); if (need_lf) printf("\n"); } @@ -699,9 +700,11 @@ main(int argc, const char *argv[]) int fs=0; int i; - lsn_t start_track; /* first sector of track */ - lsn_t data_start =0; /* start of data area */ - int ms_offset = 0; + lsn_t start_track; /* first sector of track */ + lsn_t data_start =0; /* start of data area */ + int ms_offset = 0; + track_t num_tracks=0; + track_t first_track_num=0; poptContext optCon = poptGetContext (NULL, argc, argv, optionsTable, 0); @@ -925,18 +928,18 @@ main(int argc, const char *argv[]) /* CD-I/Ready says start_track <= 30*75 then CDDA */ if (start_track > 100 /* 100 is just a guess */) { - fs = guess_filesystem(cdio, 0, 1); - if ((fs & FS_MASK) != FS_UNKNOWN) + fs = cdio_guess_filesystem(cdio, 0, 1, &cdio_analysis); + if ((fs & CDIO_FS_MASK) != CDIO_FS_UNKNOWN) fs |= HIDDEN_TRACK; else { - fs &= ~FS_MASK; /* del filesystem info */ + fs &= ~CDIO_FS_MASK; /* del filesystem info */ printf("Oops: %i unused sectors at start, " "but hidden track check failed.\n", start_track); } } print_analysis(ms_offset, cdio_analysis, fs, first_data, num_audio, - num_tracks, cdio); + num_tracks, first_track_num, cdio); } else { /* we have data track(s) */ int j; @@ -968,7 +971,7 @@ main(int argc, const char *argv[]) if (start_track < data_start + cdio_analysis.isofs_size) continue; - fs = guess_filesystem(cdio, start_track, i); + fs = cdio_guess_filesystem(cdio, start_track, i, &cdio_analysis); if (i > 1) { /* track is beyond last session -> new session found */ @@ -981,13 +984,14 @@ main(int argc, const char *argv[]) fs |= MULTISESSION; } else { print_analysis(ms_offset, cdio_analysis, fs, first_data, num_audio, - num_tracks, cdio); + num_tracks, first_track_num, cdio); } - if (!(((fs & FS_MASK) == FS_ISO_9660 || - (fs & FS_MASK) == FS_ISO_HFS || - /* (fs & FS_MASK) == FS_ISO_9660_INTERACTIVE) && (fs & XA))) */ - (fs & FS_MASK) == FS_ISO_9660_INTERACTIVE))) + if (!(((fs & CDIO_FS_MASK) == CDIO_FS_ISO_9660 || + (fs & CDIO_FS_MASK) == CDIO_FS_ISO_HFS || + /* (fs & CDIO_FS_MASK) == CDIO_FS_ISO_9660_INTERACTIVE) + && (fs & XA))) */ + (fs & CDIO_FS_MASK) == CDIO_FS_ISO_9660_INTERACTIVE))) break; /* no method for non-iso9660 multisessions */ } } diff --git a/test/check_cue.sh b/test/check_cue.sh index e50ac145..b8137bac 100644 --- a/test/check_cue.sh +++ b/test/check_cue.sh @@ -1,5 +1,5 @@ #!/bin/sh -#$Id: check_cue.sh,v 1.1 2003/08/10 14:33:28 rocky Exp $ +#$Id: check_cue.sh,v 1.2 2003/08/16 12:59:03 rocky Exp $ if test -n "@CDDB_LIB@" ; then cddb_opt='--no-cddb' fi @@ -21,12 +21,12 @@ testnum=CD-DA test_cdinfo "--cue-file ${srcdir}/${fname}.cue $cddb_opt" \ ${fname}.dump ${srcdir}/${fname}.right RC=$? -check_result $RC "cd-info CUE test $testnum" +check_result $RC "cdinfo CUE test $testnum" test_cdinfo "--bin-file ${srcdir}/${fname}.bin $cddb_opt" \ ${fname}.dump ${srcdir}/${fname}.right RC=$? -check_result $RC "cd-info BIN test $testnum" +check_result $RC "cdinfo BIN test $testnum" fname=isofs-m1 testnum='ISO 9660 mode1' @@ -34,7 +34,7 @@ if test -f ${srcdir}/${fname}.bin ; then test_cdinfo "--cue-file ${srcdir}/${fname}.cue" \ ${fname}.dump ${srcdir}/${fname}.right RC=$? - check_result $RC "cd-info CUE test $testnum" + check_result $RC "cdinfo CUE test $testnum" else echo "Don't see CUE file ${srcdir}/${fname}.bin. Test $testum skipped." fi @@ -45,7 +45,7 @@ if test -f ${srcdir}/${fname}.cue ; then test_cdinfo "-c ${srcdir}/vcd_demo.cue $vcd_opt" \ ${fname}.dump ${srcdir}/${fname}.right RC=$? - check_result $RC "cd-info CUE test $testnum" + check_result $RC "cdinfo CUE test $testnum" else echo "Don't see CUE file ${srcdir}/${fname}.cue. Test $testum skipped." fi @@ -56,7 +56,7 @@ if test -f ${srcdir}/${fname}.bin ; then test_cdinfo "--cue-file ${srcdir}/${fname}.cue $vcd_opt" \ ${fname}.dump ${srcdir}/${fname}.right RC=$? - check_result $RC "cd-info CUE test $testnum" + check_result $RC "cdinfo CUE test $testnum" else echo "Don't see CUE file ${srcdir}/${fname}.bin. Test $testnum skipped." fi diff --git a/test/monvoisin.right b/test/monvoisin.right index 5b849973..f6485eb1 100644 --- a/test/monvoisin.right +++ b/test/monvoisin.right @@ -13,4 +13,4 @@ CD-ROM with CD-RTOS and ISO 9660 filesystem ISO 9660: 1101 blocks, label `MONVOISIN ' XA sectors Video CD session #2 starts at track 2, LSN: 1251, ISO 9660 blocks: 1101 -ISO 9660: 1101 blocks, label `' +ISO 9660: 1101 blocks, label `MONVOISIN ' diff --git a/test/svcd_ogt_test_ntsc.right b/test/svcd_ogt_test_ntsc.right index f4f7d8de..5acb6e20 100644 --- a/test/svcd_ogt_test_ntsc.right +++ b/test/svcd_ogt_test_ntsc.right @@ -11,6 +11,6 @@ __________________________________ CD Analysis Report CD-ROM with CD-RTOS and ISO 9660 filesystem ISO 9660: 376 blocks, label `SVCD_OGT_TEST_NTSC ' -XA sectors +XA sectors Super Video CD (SVCD) or Chaoji Video CD (CVD) session #2 starts at track 2, LSN: 526, ISO 9660 blocks: 376 -ISO 9660: 376 blocks, label `DD3#3"C"$@' +ISO 9660: 376 blocks, label `SVCD_OGT_TEST_NTSC ' diff --git a/test/svcdgs.right b/test/svcdgs.right index 5513d1cb..7ad97bab 100644 --- a/test/svcdgs.right +++ b/test/svcdgs.right @@ -11,4 +11,4 @@ __________________________________ CD Analysis Report CD-ROM with ISO 9660 filesystem ISO 9660: 6610 blocks, label `SVCD ' -XA sectors Chaoji Video CD +XA sectors Chaoji Video CD (CVD) diff --git a/test/vcd_demo.right b/test/vcd_demo.right index a6cfeb55..de72e6c9 100644 --- a/test/vcd_demo.right +++ b/test/vcd_demo.right @@ -14,4 +14,4 @@ CD-ROM with CD-RTOS and ISO 9660 filesystem ISO 9660: 1032 blocks, label `V0469 ' XA sectors Video CD session #2 starts at track 2, LSN: 1182, ISO 9660 blocks: 1032 -ISO 9660: 1032 blocks, label `' +ISO 9660: 1032 blocks, label `V0469 ' diff --git a/test/videocd.right b/test/videocd.right index ef399f14..5dfa0b52 100644 --- a/test/videocd.right +++ b/test/videocd.right @@ -14,6 +14,6 @@ __________________________________ CD Analysis Report CD-ROM with CD-RTOS and ISO 9660 filesystem ISO 9660: 676 blocks, label `SVIDEOCD ' -XA sectors +XA sectors Super Video CD (SVCD) or Chaoji Video CD (CVD) session #2 starts at track 2, LSN: 826, ISO 9660 blocks: 676 -ISO 9660: 676 blocks, label `9 P @M4H' +ISO 9660: 676 blocks, label `SVIDEOCD '