iso9660*.{c,h}: Add PVD read for ISO 9660 images.
iso-info now shows this info.
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
$Id: iso9660.h,v 1.41 2004/06/18 23:00:05 rocky Exp $
|
$Id: iso9660.h,v 1.42 2004/06/19 00:10:23 rocky Exp $
|
||||||
|
|
||||||
Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org>
|
Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org>
|
||||||
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
|
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
|
||||||
@@ -284,15 +284,21 @@ typedef struct _iso9660 iso9660_t;
|
|||||||
True is unconditionally returned. If there was an error false would
|
True is unconditionally returned. If there was an error false would
|
||||||
be returned.
|
be returned.
|
||||||
*/
|
*/
|
||||||
bool iso9660_close (iso9660_t * iso);
|
bool iso9660_close (iso9660_t * p_iso);
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Seek to a position and then read n bytes. Size read is returned.
|
Seek to a position and then read n bytes. Size read is returned.
|
||||||
*/
|
*/
|
||||||
long int iso9660_iso_seek_read (iso9660_t *iso, void *ptr, lsn_t start,
|
long int iso9660_iso_seek_read (iso9660_t *p_iso, void *ptr, lsn_t start,
|
||||||
long int size);
|
long int size);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Read the Primary Volume Descriptor for an ISO 9660 image.
|
||||||
|
True is returned if read, and false if there was an error.
|
||||||
|
*/
|
||||||
|
bool iso9660_iso_read_pvd (iso9660_t *p_iso, iso9660_pvd_t *p_pvd);
|
||||||
|
|
||||||
/*====================================================
|
/*====================================================
|
||||||
Time conversion
|
Time conversion
|
||||||
====================================================*/
|
====================================================*/
|
||||||
@@ -307,7 +313,7 @@ typedef struct _iso9660 iso9660_t;
|
|||||||
Set "long" time in format used in ISO 9660 primary volume descriptor
|
Set "long" time in format used in ISO 9660 primary volume descriptor
|
||||||
from a Unix time structure. */
|
from a Unix time structure. */
|
||||||
void iso9660_set_ltime (const struct tm *_tm,
|
void iso9660_set_ltime (const struct tm *_tm,
|
||||||
/*out*/ iso9660_ltime_t *pvd_date);
|
/*out*/ iso9660_ltime_t *p_pvd_date);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Get Unix time structure from format use in an ISO 9660 directory index
|
Get Unix time structure from format use in an ISO 9660 directory index
|
||||||
@@ -490,7 +496,7 @@ void * iso9660_ifs_readdir (iso9660_t *iso, const char pathname[]);
|
|||||||
Return the PVD's application ID.
|
Return the PVD's application ID.
|
||||||
NULL is returned if there is some problem in getting this.
|
NULL is returned if there is some problem in getting this.
|
||||||
*/
|
*/
|
||||||
const char * iso9660_get_application_id(const iso9660_pvd_t *pvd);
|
const char * iso9660_get_application_id(const iso9660_pvd_t *p_pvd);
|
||||||
|
|
||||||
|
|
||||||
uint8_t iso9660_get_dir_len(const iso9660_dir_t *idr);
|
uint8_t iso9660_get_dir_len(const iso9660_dir_t *idr);
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
$Id: iso9660_fs.c,v 1.19 2004/03/21 00:51:49 rocky Exp $
|
$Id: iso9660_fs.c,v 1.20 2004/06/19 00:10:23 rocky Exp $
|
||||||
|
|
||||||
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
|
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
|
||||||
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
|
Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
|
||||||
@@ -40,7 +40,7 @@
|
|||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
static const char _rcsid[] = "$Id: iso9660_fs.c,v 1.19 2004/03/21 00:51:49 rocky Exp $";
|
static const char _rcsid[] = "$Id: iso9660_fs.c,v 1.20 2004/06/19 00:10:23 rocky Exp $";
|
||||||
|
|
||||||
/* Implementation of iso9660_t type */
|
/* Implementation of iso9660_t type */
|
||||||
struct _iso9660 {
|
struct _iso9660 {
|
||||||
@@ -76,28 +76,50 @@ iso9660_open (const char *pathname /*flags, mode */)
|
|||||||
be returned.
|
be returned.
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
iso9660_close (iso9660_t *iso)
|
iso9660_close (iso9660_t *p_iso)
|
||||||
{
|
{
|
||||||
if (NULL != iso) {
|
if (NULL != p_iso) {
|
||||||
cdio_stdio_destroy(iso->stream);
|
cdio_stdio_destroy(p_iso->stream);
|
||||||
free(iso);
|
free(p_iso);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Read the Primary Volume Descriptor for an ISO 9660 image.
|
||||||
|
*/
|
||||||
|
bool iso9660_iso_read_pvd (iso9660_t *p_iso, iso9660_pvd_t *p_pvd)
|
||||||
|
{
|
||||||
|
if (0 == iso9660_iso_seek_read (p_iso, p_pvd, ISO_PVD_SECTOR, 1)) {
|
||||||
|
cdio_warn ("error reading PVD sector (%d)", ISO_PVD_SECTOR);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p_pvd->type != ISO_VD_PRIMARY) {
|
||||||
|
cdio_warn ("unexpected PVD type %d", p_pvd->type);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (strncmp (p_pvd->id, ISO_STANDARD_ID, strlen (ISO_STANDARD_ID)))
|
||||||
|
{
|
||||||
|
cdio_warn ("unexpected ID encountered (expected `"
|
||||||
|
ISO_STANDARD_ID "', got `%.5s'", p_pvd->id);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Seek to a position and then read n blocks. Size read is returned.
|
Seek to a position and then read n blocks. Size read is returned.
|
||||||
*/
|
*/
|
||||||
long int
|
long int
|
||||||
iso9660_iso_seek_read (iso9660_t *iso, void *ptr, lsn_t start, long int size)
|
iso9660_iso_seek_read (iso9660_t *p_iso, void *ptr, lsn_t start, long int size)
|
||||||
{
|
{
|
||||||
long int ret;
|
long int ret;
|
||||||
if (NULL == iso) return 0;
|
if (NULL == p_iso) return 0;
|
||||||
ret = cdio_stream_seek (iso->stream, start * ISO_BLOCKSIZE, SEEK_SET);
|
ret = cdio_stream_seek (p_iso->stream, start * ISO_BLOCKSIZE, SEEK_SET);
|
||||||
if (ret!=0) return 0;
|
if (ret!=0) return 0;
|
||||||
return cdio_stream_read (iso->stream, ptr, ISO_BLOCKSIZE, size);
|
return cdio_stream_read (p_iso->stream, ptr, ISO_BLOCKSIZE, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
$Id: iso-info.c,v 1.5 2004/03/13 03:31:47 rocky Exp $
|
$Id: iso-info.c,v 1.6 2004/06/19 00:10:23 rocky Exp $
|
||||||
|
|
||||||
Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
|
Copyright (C) 2004 Rocky Bernstein <rocky@panix.com>
|
||||||
|
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
#define err_exit(fmt, args...) \
|
#define err_exit(fmt, args...) \
|
||||||
fprintf(stderr, "%s: "fmt, program_name, ##args); \
|
fprintf(stderr, "%s: "fmt, program_name, ##args); \
|
||||||
iso9660_close(iso); \
|
iso9660_close(p_iso); \
|
||||||
return(EXIT_FAILURE);
|
return(EXIT_FAILURE);
|
||||||
|
|
||||||
#ifdef HAVE_CONFIG_H
|
#ifdef HAVE_CONFIG_H
|
||||||
@@ -252,7 +252,7 @@ int
|
|||||||
main(int argc, const char *argv[])
|
main(int argc, const char *argv[])
|
||||||
{
|
{
|
||||||
|
|
||||||
iso9660_t *iso=NULL;
|
iso9660_t *p_iso=NULL;
|
||||||
|
|
||||||
init();
|
init();
|
||||||
|
|
||||||
@@ -272,24 +272,33 @@ main(int argc, const char *argv[])
|
|||||||
err_exit("%s: No input device given/found\n", program_name);
|
err_exit("%s: No input device given/found\n", program_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
iso = iso9660_open (source_name);
|
p_iso = iso9660_open (source_name);
|
||||||
|
|
||||||
if (iso==NULL) {
|
if (p_iso==NULL) {
|
||||||
free(source_name);
|
free(source_name);
|
||||||
err_exit("%s: Error in opening device driver\n", program_name);
|
err_exit("%s: Error in opening device driver\n", program_name);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (opts.silent == 0) {
|
if (opts.silent == 0) {
|
||||||
printf("ISO 9660 image: %s\n", source_name);
|
iso9660_pvd_t pvd;
|
||||||
|
|
||||||
|
printf(STRONG "ISO 9660 image: %s\n", source_name);
|
||||||
|
|
||||||
|
if (iso9660_iso_read_pvd(p_iso, &pvd)) {
|
||||||
|
printf("Application ID: %s\n", iso9660_get_application_id(&pvd));
|
||||||
|
printf("System ID : %s\n", iso9660_get_system_id(&pvd));
|
||||||
|
printf("Volume ID : %s\n", iso9660_get_volume_id(&pvd));
|
||||||
|
printf("Volume Set ID : %s\n", iso9660_get_volumeset_id(&pvd));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!opts.no_analysis) {
|
if (!opts.no_analysis) {
|
||||||
printf(STRONG "ISO-9660 Information\n" NORMAL);
|
printf(STRONG "ISO-9660 Information\n" NORMAL);
|
||||||
print_iso9660_fs(iso);
|
print_iso9660_fs(p_iso);
|
||||||
}
|
}
|
||||||
|
|
||||||
free(source_name);
|
free(source_name);
|
||||||
iso9660_close(iso);
|
iso9660_close(p_iso);
|
||||||
/* Not reached:*/
|
/* Not reached:*/
|
||||||
free(program_name);
|
free(program_name);
|
||||||
return(EXIT_SUCCESS);
|
return(EXIT_SUCCESS);
|
||||||
|
|||||||
Reference in New Issue
Block a user