Add scsi_mmc_get_hwinfo.

This commit is contained in:
rocky
2004-07-31 07:43:26 +00:00
parent 3af90f3d7b
commit b1616ea6d5
8 changed files with 210 additions and 116 deletions

View File

@@ -1,5 +1,5 @@
/*
$Id: cd-info.c,v 1.79 2004/07/28 22:03:35 rocky Exp $
$Id: cd-info.c,v 1.80 2004/07/31 07:43:26 rocky Exp $
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
Copyright (C) 1996, 1997, 1998 Gerd Knorr <kraxel@bytesex.org>
@@ -41,6 +41,7 @@
#include <cdio/cd_types.h>
#include <cdio/cdtext.h>
#include <cdio/iso9660.h>
#include <cdio/scsi_mmc.h>
#include "cdio_assert.h"
#include "bytesex.h"
@@ -344,19 +345,19 @@ msf_seconds(msf_t *msf)
the number of tracks.
*/
static unsigned long
cddb_discid(CdIo *cdio, int i_tracks)
cddb_discid(CdIo *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(cdio, i, &msf);
cdio_get_track_msf(p_cdio, i, &msf);
n += cddb_dec_digit_sum(msf_seconds(&msf));
}
cdio_get_track_msf(cdio, 1, &start_msf);
cdio_get_track_msf(cdio, CDIO_CDROM_LEADOUT_TRACK, &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);
@@ -390,8 +391,8 @@ _log_handler (cdio_log_level_t level, const char message[])
}
static void
print_cdtext_track_info(CdIo *cdio, track_t i_track, const char *message) {
const cdtext_t *cdtext = cdio_get_cdtext(cdio, 0);
print_cdtext_track_info(CdIo *p_cdio, track_t i_track, const char *message) {
const cdtext_t *cdtext = cdio_get_cdtext(p_cdio, 0);
if (NULL != cdtext) {
cdtext_field_t i;
@@ -407,20 +408,20 @@ print_cdtext_track_info(CdIo *cdio, track_t i_track, const char *message) {
}
static void
print_cdtext_info(CdIo *cdio, track_t i_tracks, track_t i_first_track) {
print_cdtext_info(CdIo *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(cdio, 0, "\nCD-TEXT for Disc:");
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(cdio, i_first_track, msg);
print_cdtext_track_info(p_cdio, i_first_track, msg);
}
}
#ifdef HAVE_CDDB
static void
print_cddb_info(CdIo *cdio, track_t i_tracks, track_t i_first_track) {
print_cddb_info(CdIo *p_cdio, track_t i_tracks, track_t i_first_track) {
int i, matches;
cddb_conn_t *conn = cddb_new();
@@ -464,12 +465,12 @@ print_cddb_info(CdIo *cdio, track_t i_tracks, track_t i_first_track) {
}
for(i = 0; i < i_tracks; i++) {
cddb_track_t *t = cddb_track_new();
t->frame_offset = cdio_get_track_lba(cdio, i+i_first_track);
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(cdio, CDIO_CDROM_LEADOUT_TRACK)
cdio_get_track_lba(p_cdio, CDIO_CDROM_LEADOUT_TRACK)
/ CDIO_CD_FRAMES_PER_SEC;
if (!cddb_disc_calc_discid(disc)) {
@@ -532,7 +533,7 @@ print_vcd_info(driver_id_t driver) {
#endif
static void
print_iso9660_recurse (const CdIo *cdio, const char pathname[],
print_iso9660_recurse (const CdIo *p_cdio, const char pathname[],
cdio_fs_anal_t fs,
bool b_mode2)
{
@@ -540,7 +541,7 @@ print_iso9660_recurse (const CdIo *cdio, const char pathname[],
CdioList *dirlist = _cdio_list_new ();
CdioListNode *entnode;
entlist = iso9660_fs_readdir (cdio, pathname, b_mode2);
entlist = iso9660_fs_readdir (p_cdio, pathname, b_mode2);
printf ("%s:\n", pathname);
@@ -603,7 +604,7 @@ print_iso9660_recurse (const CdIo *cdio, const char pathname[],
{
char *_fullname = _cdio_list_node_data (entnode);
print_iso9660_recurse (cdio, _fullname, fs, b_mode2);
print_iso9660_recurse (p_cdio, _fullname, fs, b_mode2);
}
_cdio_list_free (dirlist, true);
@@ -842,7 +843,7 @@ int
main(int argc, const char *argv[])
{
CdIo *cdio=NULL;
CdIo *p_cdio=NULL;
cdio_fs_anal_t fs=CDIO_FS_AUDIO;
int i;
lsn_t start_track_lsn; /* lsn of first track */
@@ -882,8 +883,8 @@ main(int argc, const char *argv[])
switch (opts.source_image) {
case IMAGE_UNKNOWN:
case IMAGE_AUTO:
cdio = cdio_open_am (source_name, DRIVER_UNKNOWN, opts.access_mode);
if (cdio==NULL) {
p_cdio = cdio_open_am (source_name, DRIVER_UNKNOWN, opts.access_mode);
if (p_cdio==NULL) {
if (source_name) {
err_exit("%s: Error in automatically selecting driver for input %s.\n",
program_name, source_name);
@@ -894,8 +895,8 @@ main(int argc, const char *argv[])
}
break;
case IMAGE_DEVICE:
cdio = cdio_open_am (source_name, DRIVER_DEVICE, opts.access_mode);
if (cdio==NULL) {
p_cdio = cdio_open_am (source_name, DRIVER_DEVICE, opts.access_mode);
if (p_cdio==NULL) {
if (source_name) {
err_exit("%s: Error in automatically selecting CD-image driver for input %s\n",
program_name, source_name);
@@ -906,8 +907,8 @@ main(int argc, const char *argv[])
}
break;
case IMAGE_BIN:
cdio = cdio_open_am (source_name, DRIVER_BINCUE, opts.access_mode);
if (cdio==NULL) {
p_cdio = cdio_open_am (source_name, DRIVER_BINCUE, opts.access_mode);
if (p_cdio==NULL) {
if (source_name) {
err_exit("%s: Error in opening bin/cue for input %s\n",
program_name, source_name);
@@ -918,8 +919,8 @@ main(int argc, const char *argv[])
}
break;
case IMAGE_CUE:
cdio = cdio_open_cue(source_name);
if (cdio==NULL) {
p_cdio = cdio_open_cue(source_name);
if (p_cdio==NULL) {
if (source_name) {
err_exit("%s: Error in opening cue/bin with input %s\n",
program_name, source_name);
@@ -930,8 +931,8 @@ main(int argc, const char *argv[])
}
break;
case IMAGE_NRG:
cdio = cdio_open_am (source_name, DRIVER_NRG, opts.access_mode);
if (cdio==NULL) {
p_cdio = cdio_open_am (source_name, DRIVER_NRG, opts.access_mode);
if (p_cdio==NULL) {
if (source_name) {
err_exit("%s: Error in opening NRG with input %s\n",
program_name, source_name);
@@ -943,8 +944,8 @@ main(int argc, const char *argv[])
break;
case IMAGE_CDRDAO:
cdio = cdio_open_am (source_name, DRIVER_CDRDAO, opts.access_mode);
if (cdio==NULL) {
p_cdio = cdio_open_am (source_name, DRIVER_CDRDAO, opts.access_mode);
if (p_cdio==NULL) {
if (source_name) {
err_exit("%s: Error in opening TOC with input %s.\n",
program_name, source_name);
@@ -956,7 +957,7 @@ main(int argc, const char *argv[])
break;
}
if (cdio==NULL) {
if (p_cdio==NULL) {
if (source_name) {
err_exit("%s: Error in opening device driver for input %s.\n",
program_name, source_name);
@@ -968,7 +969,7 @@ main(int argc, const char *argv[])
}
if (source_name==NULL) {
source_name=strdup(cdio_get_arg(cdio, "source"));
source_name=strdup(cdio_get_arg(p_cdio, "source"));
if (NULL == source_name) {
err_exit("%s: No input device given/found\n", program_name);
}
@@ -976,16 +977,22 @@ main(int argc, const char *argv[])
if (0 == opts.silent) {
printf("CD location : %s\n", source_name);
printf("CD driver name: %s\n", cdio_get_driver_name(cdio));
printf(" access mode: %s\n\n", cdio_get_arg(cdio, "access-mode"));
printf("CD driver name: %s\n", cdio_get_driver_name(p_cdio));
printf(" access mode: %s\n\n", cdio_get_arg(p_cdio, "access-mode"));
}
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_get_drive_cap(cdio, &i_read_cap, &i_write_cap, &i_misc_cap);
scsi_mmc_hwinfo_t scsi_mmc_hwinfo;
if (scsi_mmc_get_hwinfo(p_cdio, &scsi_mmc_hwinfo)) {
printf("%-28s: %s\n%-28s: %s\n%-28s: %s\n",
"Vendor" , scsi_mmc_hwinfo.vendor,
"Model" , scsi_mmc_hwinfo.model,
"Revision", scsi_mmc_hwinfo.revision);
}
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);
}
@@ -996,7 +1003,16 @@ main(int argc, const char *argv[])
printf("list of devices found:\n");
if (NULL != d) {
for ( ; *d != NULL ; d++ ) {
printf("%s\n", *d);
CdIo *p_cdio = cdio_open(source_name, DRIVER_UNKNOWN);
scsi_mmc_hwinfo_t scsi_mmc_hwinfo;
printf("Drive %s\n", *d);
if (scsi_mmc_get_hwinfo(p_cdio, &scsi_mmc_hwinfo)) {
printf("%-8s: %s\n%-8s: %s\n%-8s: %s\n",
"Vendor" , scsi_mmc_hwinfo.vendor,
"Model" , scsi_mmc_hwinfo.model,
"Revision", scsi_mmc_hwinfo.revision);
}
if (p_cdio) cdio_destroy(p_cdio);
}
}
cdio_free_device_list(device_list);
@@ -1008,11 +1024,11 @@ main(int argc, const char *argv[])
if ( 0 == opts.no_disc_mode ) {
printf("Disc mode is listed as: %s\n",
discmode2str[cdio_get_discmode(cdio)]);
discmode2str[cdio_get_discmode(p_cdio)]);
}
i_first_track = cdio_get_first_track_num(cdio);
i_tracks = cdio_get_num_tracks(cdio);
i_first_track = cdio_get_first_track_num(p_cdio);
i_tracks = cdio_get_num_tracks(p_cdio);
if (!opts.no_tracks) {
printf("CD-ROM Track List (%i - %i)\n" NORMAL,
@@ -1026,7 +1042,7 @@ main(int argc, const char *argv[])
msf_t msf;
char *psz_msf;
if (!cdio_get_track_msf(cdio, i, &msf)) {
if (!cdio_get_track_msf(p_cdio, i, &msf)) {
err_exit("cdio_track_msf for track %i failed, I give up.\n", i);
}
@@ -1039,11 +1055,11 @@ main(int argc, const char *argv[])
} else if (!opts.no_tracks) {
printf("%3d: %8s %06lu %-5s %s\n", (int) i, psz_msf,
(long unsigned int) cdio_msf_to_lsn(&msf),
track_format2str[cdio_get_track_format(cdio, i)],
cdio_get_track_green(cdio, i)? "true" : "false");
track_format2str[cdio_get_track_format(p_cdio, i)],
cdio_get_track_green(p_cdio, i)? "true" : "false");
}
if (TRACK_FORMAT_AUDIO == cdio_get_track_format(cdio, i)) {
if (TRACK_FORMAT_AUDIO == cdio_get_track_format(p_cdio, i)) {
num_audio++;
if (-1 == first_audio) first_audio = i;
} else {
@@ -1056,7 +1072,7 @@ main(int argc, const char *argv[])
if (cdio_is_discmode_cdrom(discmode)) {
/* get and print MCN */
media_catalog_number = cdio_get_mcn(cdio);
media_catalog_number = cdio_get_mcn(p_cdio);
printf("Media Catalog Number (MCN): "); fflush(stdout);
if (NULL == media_catalog_number)
@@ -1121,12 +1137,12 @@ main(int argc, const char *argv[])
/* no data track, may be a "real" audio CD or hidden track CD */
msf_t msf;
cdio_get_track_msf(cdio, 1, &msf);
cdio_get_track_msf(p_cdio, 1, &msf);
start_track_lsn = cdio_msf_to_lsn(&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(cdio, 0, 1, &cdio_iso_analysis);
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 {
@@ -1138,16 +1154,16 @@ main(int argc, const char *argv[])
}
print_analysis(ms_offset, cdio_iso_analysis, fs, first_data, num_audio,
i_tracks, i_first_track,
cdio_get_track_format(cdio, 1), cdio);
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(cdio, i);
track_format_t track_format = cdio_get_track_format(p_cdio, i);
cdio_get_track_msf(cdio, i, &msf);
cdio_get_track_msf(p_cdio, i, &msf);
switch ( track_format ) {
case TRACK_FORMAT_AUDIO:
@@ -1170,7 +1186,8 @@ main(int argc, const char *argv[])
if (start_track_lsn < data_start + cdio_iso_analysis.isofs_size)
continue;
fs = cdio_guess_cd_type(cdio, start_track_lsn, i, &cdio_iso_analysis);
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 */
@@ -1185,7 +1202,7 @@ main(int argc, const char *argv[])
} else {
print_analysis(ms_offset, cdio_iso_analysis, fs, first_data,
num_audio, i_tracks, i_first_track,
track_format, cdio);
track_format, p_cdio);
}
if ( !(CDIO_FSTYPE(fs) == CDIO_FS_ISO_9660 ||
@@ -1199,7 +1216,7 @@ main(int argc, const char *argv[])
}
}
myexit(cdio, EXIT_SUCCESS);
myexit(p_cdio, EXIT_SUCCESS);
/* Not reached:*/
return(EXIT_SUCCESS);
}