diff --git a/include/cdio/iso9660.h b/include/cdio/iso9660.h index 36787790..87016d7c 100644 --- a/include/cdio/iso9660.h +++ b/include/cdio/iso9660.h @@ -1,5 +1,5 @@ /* - $Id: iso9660.h,v 1.23 2003/09/20 12:33:14 rocky Exp $ + $Id: iso9660.h,v 1.24 2003/09/21 01:14:30 rocky Exp $ Copyright (C) 2000 Herbert Valerio Riedel Copyright (C) 2003 Rocky Bernstein @@ -178,18 +178,22 @@ typedef struct iso9660_stat iso9660_stat_t; /* Format of an ISO-9660 directory record */ struct iso9660_dir { uint8_t length; /* 711 */ - uint8_t ext_attr_length; /* 711 */ + uint8_t xa_length; /* 711 */ uint64_t extent; /* 733 */ uint64_t size; /* 733 */ - iso9660_dtime_t date; /* 7 by 711 */ - uint8_t flags; + iso9660_dtime_t recording_time; /* 7 by 711 */ + uint8_t file_flags; uint8_t file_unit_size; /* 711 */ - uint8_t interleave; /* 711 */ + uint8_t interleave_gap; /* 711 */ uint32_t volume_sequence_number; /* 723 */ - uint8_t name_len; /* 711 */ - char name[EMPTY_ARRAY_SIZE]; + uint8_t filename_len; /* 711 */ + char filename[EMPTY_ARRAY_SIZE]; } GNUC_PACKED; + +/* The following structure is not part of ISO 9660. We just use it + for our own purposes for communicating info back that's pulled out. +*/ struct iso9660_stat { /* big endian!! */ enum { _STAT_FILE = 1, _STAT_DIR = 2 } type; lsn_t lsn; /* start logical sector number */ @@ -260,9 +264,12 @@ char *iso9660_strncpy_pad(char dst[], const char src[], size_t len, Get time structure from structure in an ISO 9660 directory index record. Even though tm_wday and tm_yday fields are not explicitly in idr_date, the are calculated from the other fields. + + If tm is to reflect the localtime set use_localtime true, otherwise + tm will reported in GMT. */ -void iso9660_get_time (const iso9660_dtime_t *idr_date, - /*out*/ struct tm *tm); + void iso9660_get_dtime (const iso9660_dtime_t *idr_date, bool use_localtime, + /*out*/ struct tm *tm); /*===================================================================== @@ -319,8 +326,9 @@ iso9660_dir_init_new_su (void *dir, uint32_t self, uint32_t ssize, const time_t *dir_time); void -iso9660_dir_add_entry_su (void *dir, const char name[], uint32_t extent, - uint32_t size, uint8_t flags, const void *su_data, +iso9660_dir_add_entry_su (void *dir, const char filename[], uint32_t extent, + uint32_t size, uint8_t file_flags, + const void *su_data, unsigned int su_size, const time_t *entry_time); unsigned int @@ -368,19 +376,22 @@ iso9660_get_pvd_space_size(const iso9660_pvd_t *pvd); int iso9660_get_pvd_block_size(const iso9660_pvd_t *pvd) ; -int -iso9660_get_pvd_version(const iso9660_pvd_t *pvd) ; +/*! Return the primary volume id version number (of pvd). + If there is an error 0 is returned. + */ +int iso9660_get_pvd_version(const iso9660_pvd_t *pvd) ; -lsn_t -iso9660_get_root_lsn(const iso9660_pvd_t *pvd); +/*! Return the LSN of the root directory for pvd. + If there is an error CDIO_INVALID_LSN is returned. + */ +lsn_t iso9660_get_root_lsn(const iso9660_pvd_t *pvd); /* pathtable */ -void -iso9660_pathtable_init (void *pt); +/*! Zero's out pathable. Do this first. */ +void iso9660_pathtable_init (void *pt); -unsigned int -iso9660_pathtable_get_size (const void *pt); +unsigned int iso9660_pathtable_get_size (const void *pt); uint16_t iso9660_pathtable_l_add_entry (void *pt, const char name[], uint32_t extent, @@ -388,7 +399,7 @@ iso9660_pathtable_l_add_entry (void *pt, const char name[], uint32_t extent, uint16_t iso9660_pathtable_m_add_entry (void *pt, const char name[], uint32_t extent, - uint16_t parent); + uint16_t parent); /* volume descriptors */ diff --git a/include/cdio/xa.h b/include/cdio/xa.h index 6cb703a5..600a794a 100644 --- a/include/cdio/xa.h +++ b/include/cdio/xa.h @@ -1,10 +1,11 @@ /* - $Id: xa.h,v 1.4 2003/09/01 02:08:59 rocky Exp $ + $Id: xa.h,v 1.5 2003/09/21 01:14:30 rocky Exp $ Copyright (C) 2000 Herbert Valerio Riedel Copyright (C) 2003 Rocky Bernstein - See also iso9660.h by Eric Youngdale (1993). + See also iso9660.h by Eric Youngdale (1993) and in cdrtools. These + are Copyright 1993 Yggdrasil Computing, Incorporated Copyright (c) 1999,2000 J. Schilling @@ -33,17 +34,17 @@ #define ISO_XA_MARKER_OFFSET 1024 /* XA attribute definitions */ -#define XA_ATTR_G_READ 0x0001 /* System Group Read */ -#define XA_ATTR_G_EXEC 0x0004 /* System Group Execute */ +#define XA_PERM_RSYS 0x0001 /* System Group Read */ +#define XA_PERM_XSYS 0x0004 /* System Group Execute */ -#define XA_ATTR_U_READ 0x0010 /* Owner Read */ -#define XA_ATTR_U_EXEC 0x0040 /* Owner Execute */ +#define XA_PERM_RUSR 0x0010 /* User (owner) Read */ +#define XA_PERM_XUSR 0x0040 /* User (owner) Execute */ -#define XA_ATTR_O_READ 0x0100 /* Group Read */ -#define XA_ATTR_O_EXEC 0x0400 /* Group Execute */ +#define XA_PERM_RGRP 0x0100 /* Group Read */ +#define XA_PERM_XGRP 0x0400 /* Group Execute */ -#define XA_ATTR_W_READ 0x1000 /* World (other) Read */ -#define XA_ATTR_W_EXEC 0x4000 /* World (other) Execute */ +#define XA_PERM_ROTH 0x1000 /* Other (world) Read */ +#define XA_PERM_XOTH 0x4000 /* Other (world) Execute */ #define XA_ATTR_MODE2FORM1 (1 << 11) #define XA_ATTR_MODE2FORM2 (1 << 12) @@ -52,8 +53,8 @@ #define XA_ATTR_DIRECTORY (1 << 15) /* some aggregations */ -#define XA_PERM_ALL_READ (XA_ATTR_U_READ | XA_ATTR_G_READ | XA_ATTR_O_READ) -#define XA_PERM_ALL_EXEC (XA_ATTR_U_EXEC | XA_ATTR_G_EXEC | XA_ATTR_O_EXEC) +#define XA_PERM_ALL_READ (XA_PERM_RUSR | XA_PERM_RSYS | XA_PERM_RGRP) +#define XA_PERM_ALL_EXEC (XA_PERM_XUSR | XA_PERM_XSYS | XA_PERM_XGRP) #define XA_PERM_ALL_ALL (XA_PERM_ALL_READ | XA_PERM_ALL_EXEC) #define XA_FORM1_DIR (XA_ATTR_DIRECTORY | XA_ATTR_MODE2FORM1 | XA_PERM_ALL_ALL) @@ -92,9 +93,9 @@ typedef struct iso9660_xa /* big endian!! */ Note that an entry will either be in mode2 form1 or mode form2. That is you will either see "2-" or "-1" in the 4th & 5th positions. - The 6th and 7th characters refer to permissions for everyone while the + The 6th and 7th characters refer to permissions for a user while the the 8th and 9th characters refer to permissions for a group while, and - the 10th and 11th characters refer to permissions for a user. + the 10th and 11th characters refer to permissions for everyone. In each of these pairs the first character (6, 8, 10) is "x" if the entry is executable. For a directory this means the directory is diff --git a/lib/iso9660.c b/lib/iso9660.c index 40dd660d..18cc4100 100644 --- a/lib/iso9660.c +++ b/lib/iso9660.c @@ -1,5 +1,5 @@ /* - $Id: iso9660.c,v 1.13 2003/09/20 17:47:29 rocky Exp $ + $Id: iso9660.c,v 1.14 2003/09/21 01:14:30 rocky Exp $ Copyright (C) 2000 Herbert Valerio Riedel Copyright (C) 2003 Rocky Bernstein @@ -37,7 +37,7 @@ #include #endif -static const char _rcsid[] = "$Id: iso9660.c,v 1.13 2003/09/20 17:47:29 rocky Exp $"; +static const char _rcsid[] = "$Id: iso9660.c,v 1.14 2003/09/21 01:14:30 rocky Exp $"; /* some parameters... */ #define SYSTEM_ID "CD-RTOS CD-BRIDGE" @@ -51,10 +51,17 @@ pathtable_get_size_and_entries(const void *pt, unsigned int *size, Get time structure from structure in an ISO 9660 directory index record. Even though tm_wday and tm_yday fields are not explicitly in idr_date, the are calculated from the other fields. + + If tm is to reflect the localtime set use_localtime true, otherwise + tm will reported in GMT. */ void -iso9660_get_time (const iso9660_dtime_t *idr_date, /*out*/ struct tm *tm) +iso9660_get_dtime (const iso9660_dtime_t *idr_date, bool use_localtime, + /*out*/ struct tm *tm) { + time_t t; + struct tm *temp_tm; + if (!idr_date) return; tm->tm_year = idr_date->dt_year; @@ -63,10 +70,16 @@ iso9660_get_time (const iso9660_dtime_t *idr_date, /*out*/ struct tm *tm) tm->tm_hour = idr_date->dt_hour; tm->tm_min = idr_date->dt_minute; tm->tm_sec = idr_date->dt_second; - tm->tm_gmtoff = 0; - - /* Recompute tm_wday and tm_yday */ - mktime(tm); + + /* Recompute tm_wday and tm_yday via mktime. */ + t = mktime(tm); + + if (use_localtime) + temp_tm = localtime(&t); + else + temp_tm = gmtime(&t); + + memcpy(tm, temp_tm, sizeof(struct tm)); } /*! @@ -85,7 +98,23 @@ iso9660_set_dtime (const struct tm *tm, /*out*/ iso9660_dtime_t *idr_date) idr_date->dt_hour = tm->tm_hour; idr_date->dt_minute = tm->tm_min; idr_date->dt_second = tm->tm_sec; - idr_date->dt_gmtoff = 0x00; /* tz, GMT -48 +52 in 15min intervals */ + + /* The ISO 9660 timezone is in the range -48..+52 and each unit + represents a 15-minute interval. */ + idr_date->dt_gmtoff = tm->tm_gmtoff / (15 * 60); + + if (tm->tm_isdst) idr_date->dt_gmtoff -= 4; + + if (idr_date->dt_gmtoff < -48 ) { + + cdio_warn ("Converted ISO 9660 timezone %d is less than -48. Adjusted", + idr_date->dt_gmtoff); + idr_date->dt_gmtoff = -48; + } else if (idr_date->dt_gmtoff > 52) { + cdio_warn ("Converted ISO 9660 timezone %d is over 52. Adjusted", + idr_date->dt_gmtoff); + idr_date->dt_gmtoff = 52; + } } /*! @@ -364,10 +393,10 @@ iso9660_dir_calc_record_size(unsigned int namelen, unsigned int su_len) void iso9660_dir_add_entry_su(void *dir, - const char name[], + const char filename[], uint32_t extent, uint32_t size, - uint8_t flags, + uint8_t file_flags, const void *su_data, unsigned int su_size, const time_t *entry_time) @@ -385,11 +414,11 @@ iso9660_dir_add_entry_su(void *dir, cdio_assert (dsize > 0 && !(dsize % ISO_BLOCKSIZE)); cdio_assert (dir != NULL); cdio_assert (extent > 17); - cdio_assert (name != NULL); - cdio_assert (strlen(name) <= MAX_ISOPATHNAME); + cdio_assert (filename != NULL); + cdio_assert (strlen(filename) <= MAX_ISOPATHNAME); length = sizeof(iso9660_dir_t); - length += strlen(name); + length += strlen(filename); length = _cdio_ceil2block (length, 2); /* pad to word boundary */ su_offset = length; length += su_size; @@ -433,15 +462,16 @@ iso9660_dir_add_entry_su(void *dir, idr->extent = to_733(extent); idr->size = to_733(size); - iso9660_set_dtime (gmtime(entry_time), &(idr->date)); + iso9660_set_dtime (gmtime(entry_time), &(idr->recording_time)); - idr->flags = to_711(flags); + idr->file_flags = to_711(file_flags); idr->volume_sequence_number = to_723(1); - idr->name_len = to_711(strlen(name) ? strlen(name) : 1); /* working hack! */ + idr->filename_len = to_711(strlen(filename) + ? strlen(filename) : 1); /* working hack! */ - memcpy(idr->name, name, from_711(idr->name_len)); + memcpy(idr->filename, filename, from_711(idr->filename_len)); memcpy(&dir8[offset] + su_offset, su_data, su_size); } @@ -483,6 +513,7 @@ iso9660_dir_init_new_su (void *dir, psu_size, dir_time); } +/* Zero's out pathable. Do this first. */ void iso9660_pathtable_init (void *pt) { @@ -815,6 +846,9 @@ iso9660_get_pvd_block_size(const iso9660_pvd_t *pvd) return from_723(pvd->logical_block_size); } +/*! Return the primary volume id version number (of pvd). + If there is an error 0 is returned. + */ int iso9660_get_pvd_version(const iso9660_pvd_t *pvd) { @@ -822,6 +856,9 @@ iso9660_get_pvd_version(const iso9660_pvd_t *pvd) return pvd->version; } +/*! Return the LSN of the root directory for pvd. + If there is an error CDIO_INVALID_LSN is returned. + */ lsn_t iso9660_get_root_lsn(const iso9660_pvd_t *pvd) { diff --git a/lib/iso9660_fs.c b/lib/iso9660_fs.c index 933a55e5..c2d45eff 100644 --- a/lib/iso9660_fs.c +++ b/lib/iso9660_fs.c @@ -1,5 +1,5 @@ /* - $Id: iso9660_fs.c,v 1.10 2003/09/20 11:53:09 rocky Exp $ + $Id: iso9660_fs.c,v 1.11 2003/09/21 01:14:30 rocky Exp $ Copyright (C) 2001 Herbert Valerio Riedel Copyright (C) 2003 Rocky Bernstein @@ -38,7 +38,7 @@ #include -static const char _rcsid[] = "$Id: iso9660_fs.c,v 1.10 2003/09/20 11:53:09 rocky Exp $"; +static const char _rcsid[] = "$Id: iso9660_fs.c,v 1.11 2003/09/21 01:14:30 rocky Exp $"; static void _idr2statbuf (const iso9660_dir_t *idr, iso9660_stat_t *stat, bool is_mode2) @@ -50,18 +50,18 @@ _idr2statbuf (const iso9660_dir_t *idr, iso9660_stat_t *stat, bool is_mode2) if (!dir_len) return; - stat->type = (idr->flags & ISO_DIRECTORY) ? _STAT_DIR : _STAT_FILE; + stat->type = (idr->file_flags & ISO_DIRECTORY) ? _STAT_DIR : _STAT_FILE; stat->lsn = from_733 (idr->extent); stat->size = from_733 (idr->size); stat->secsize = _cdio_len2blocks (stat->size, ISO_BLOCKSIZE); - iso9660_get_time(&(idr->date), &(stat->tm)); + iso9660_get_dtime(&(idr->recording_time), true, &(stat->tm)); cdio_assert (dir_len >= sizeof (iso9660_dir_t)); if (is_mode2) { int su_length = iso9660_get_dir_len(idr) - sizeof (iso9660_dir_t); - su_length -= idr->name_len; + su_length -= idr->filename_len; if (su_length % 2) su_length--; @@ -77,7 +77,7 @@ _idr2statbuf (const iso9660_dir_t *idr, iso9660_stat_t *stat, bool is_mode2) cdio_warn ("XA signature not found in ISO9660's system use area;" " ignoring XA attributes for this file entry."); cdio_debug ("%d %d %d, '%c%c' (%d, %d)", iso9660_get_dir_len(idr), - idr->name_len, + idr->filename_len, su_length, xa_data->signature[0], xa_data->signature[1], xa_data->signature[0], xa_data->signature[1]); @@ -98,14 +98,14 @@ _idr2name (const iso9660_dir_t *idr) cdio_assert (len >= sizeof (iso9660_dir_t)); - /* (idr->flags & ISO_DIRECTORY) */ + /* (idr->file_flags & ISO_DIRECTORY) */ - if (idr->name[0] == '\0') + if (idr->filename[0] == '\0') strcpy (namebuf, "."); - else if (idr->name[0] == '\1') + else if (idr->filename[0] == '\1') strcpy (namebuf, ".."); else - strncpy (namebuf, idr->name, idr->name_len); + strncpy (namebuf, idr->filename, idr->filename_len); return strdup (namebuf); } diff --git a/lib/xa.c b/lib/xa.c index 9daacd5d..76d5d83f 100644 --- a/lib/xa.c +++ b/lib/xa.c @@ -1,5 +1,5 @@ /* - $Id: xa.c,v 1.3 2003/08/31 09:11:25 rocky Exp $ + $Id: xa.c,v 1.4 2003/09/21 01:14:30 rocky Exp $ Copyright (C) 2000 Herbert Valerio Riedel Copyright (C) 2003 Rocky Bernstein @@ -72,9 +72,9 @@ _getbuf (void) Note that an entry will either be in mode2 form1 or mode form2. That is you will either see "2-" or "-1" in the 4th & 5th positions. - The 6th and 7th characters refer to permissions for everyone while the + The 6th and 7th characters refer to permissions for a user while the the 8th and 9th characters refer to permissions for a group while, and - the 10th and 11th characters refer to permissions for a user. + the 10th and 11th characters refer to permissions for a others. In each of these pairs the first character (6, 8, 10) is "x" if the entry is executable. For a directory this means the directory is @@ -90,20 +90,21 @@ iso9660_get_xa_attr_str (uint16_t xa_attr) xa_attr = uint16_from_be (xa_attr); - result[0] = (xa_attr & XA_ATTR_DIRECTORY) ? 'd' : '-'; - result[1] = (xa_attr & XA_ATTR_CDDA) ? 'a' : '-'; - result[2] = (xa_attr & XA_ATTR_INTERLEAVED) ? 'i' : '-'; - result[3] = (xa_attr & XA_ATTR_MODE2FORM2) ? '2' : '-'; - result[4] = (xa_attr & XA_ATTR_MODE2FORM1) ? '1' : '-'; + result[ 0] = (xa_attr & XA_ATTR_DIRECTORY) ? 'd' : '-'; + result[ 1] = (xa_attr & XA_ATTR_CDDA) ? 'a' : '-'; + result[ 2] = (xa_attr & XA_ATTR_INTERLEAVED) ? 'i' : '-'; + result[ 3] = (xa_attr & XA_ATTR_MODE2FORM2) ? '2' : '-'; + result[ 4] = (xa_attr & XA_ATTR_MODE2FORM1) ? '1' : '-'; - result[5] = (xa_attr & XA_ATTR_O_EXEC) ? 'x' : '-'; - result[6] = (xa_attr & XA_ATTR_O_READ) ? 'r' : '-'; + result[ 5] = (xa_attr & XA_PERM_XUSR) ? 'x' : '-'; + result[ 6] = (xa_attr & XA_PERM_RUSR) ? 'r' : '-'; - result[7] = (xa_attr & XA_ATTR_G_EXEC) ? 'x' : '-'; - result[8] = (xa_attr & XA_ATTR_G_READ) ? 'r' : '-'; + result[ 7] = (xa_attr & XA_PERM_XGRP) ? 'x' : '-'; + result[ 8] = (xa_attr & XA_PERM_RGRP) ? 'r' : '-'; - result[9] = (xa_attr & XA_ATTR_U_EXEC) ? 'x' : '-'; - result[10] = (xa_attr & XA_ATTR_U_READ) ? 'r' : '-'; + /* Hack alert: wonder if this should be ROTH and XOTH? */ + result[ 9] = (xa_attr & XA_PERM_XSYS) ? 'x' : '-'; + result[10] = (xa_attr & XA_PERM_RSYS) ? 'r' : '-'; result[11] = '\0'; diff --git a/test/monvoisin.right b/test/monvoisin.right index 4e1e9df6..504ef675 100644 --- a/test/monvoisin.right +++ b/test/monvoisin.right @@ -15,8 +15,8 @@ ISO9660 filesystem root dir in PVD set to lsn 18 /: - d d---1xrxrxr 0 0 [fn 00] [LSN 18] 2048 Saturday 0 1900 00:00 . - d d---1xrxrxr 0 0 [fn 00] [LSN 18] 2048 Saturday 0 1900 00:00 .. + d d---1xrxrxr 0 0 [fn 00] [LSN 18] 2048 Dec 31 1969 23:59 . + d d---1xrxrxr 0 0 [fn 00] [LSN 18] 2048 Dec 31 1969 23:59 .. d d---1xrxrxr 0 0 [fn 00] [LSN 19] 2048 Feb 19 2001 16:37 cdi d d---1xrxrxr 0 0 [fn 00] [LSN 20] 2048 Feb 19 2001 16:37 ext d d---1xrxrxr 0 0 [fn 00] [LSN 21] 2048 Feb 19 2001 16:37 mpegav @@ -24,32 +24,32 @@ ISO9660 filesystem d d---1xrxrxr 0 0 [fn 00] [LSN 23] 2048 Feb 19 2001 16:37 vcd /CDI/: - d d---1xrxrxr 0 0 [fn 00] [LSN 19] 2048 Saturday 0 1900 00:00 . - d d---1xrxrxr 0 0 [fn 00] [LSN 18] 2048 Saturday 0 1900 00:00 .. + d d---1xrxrxr 0 0 [fn 00] [LSN 19] 2048 Dec 31 1969 23:59 . + d d---1xrxrxr 0 0 [fn 00] [LSN 18] 2048 Dec 31 1969 23:59 .. - ---2-xrxrxr 0 0 [fn 01] [LSN 211] 1494332 ( 1315168) Feb 19 2001 16:37 cdi_imag.rtf - ----1xrxrxr 0 0 [fn 01] [LSN 854] 13616 Feb 19 2001 16:37 cdi_text.fnt - ----1xrxrxr 0 0 [fn 01] [LSN 861] 102400 Feb 19 2001 16:37 cdi_vcd.app - ----1xrxrxr 0 0 [fn 01] [LSN 911] 279 Feb 19 2001 16:37 cdi_vcd.cfg /EXT/: - d d---1xrxrxr 0 0 [fn 00] [LSN 20] 2048 Saturday 0 1900 00:00 . - d d---1xrxrxr 0 0 [fn 00] [LSN 18] 2048 Saturday 0 1900 00:00 .. + d d---1xrxrxr 0 0 [fn 00] [LSN 20] 2048 Dec 31 1969 23:59 . + d d---1xrxrxr 0 0 [fn 00] [LSN 18] 2048 Dec 31 1969 23:59 .. - ----1xrxrxr 0 0 [fn 01] [LSN 912] 65536 Feb 19 2001 16:37 lot_x.vcd - ----1xrxrxr 0 0 [fn 01] [LSN 944] 24 Feb 19 2001 16:37 psd_x.vcd - ----1xrxrxr 0 0 [fn 01] [LSN 945] 114 Feb 19 2001 16:37 scandata.dat /MPEGAV/: - d d---1xrxrxr 0 0 [fn 00] [LSN 21] 2048 Saturday 0 1900 00:00 . - d d---1xrxrxr 0 0 [fn 00] [LSN 18] 2048 Saturday 0 1900 00:00 .. + d d---1xrxrxr 0 0 [fn 00] [LSN 21] 2048 Dec 31 1969 23:59 . + d d---1xrxrxr 0 0 [fn 00] [LSN 18] 2048 Dec 31 1969 23:59 .. - ---2-xrxrxr 0 0 [fn 01] [LSN 1251] 3655652 ( 3221504) Feb 19 2001 16:37 avseq01.dat /SEGMENT/: - d d---1xrxrxr 0 0 [fn 00] [LSN 22] 2048 Saturday 0 1900 00:00 . - d d---1xrxrxr 0 0 [fn 00] [LSN 18] 2048 Saturday 0 1900 00:00 .. + d d---1xrxrxr 0 0 [fn 00] [LSN 22] 2048 Dec 31 1969 23:59 . + d d---1xrxrxr 0 0 [fn 00] [LSN 18] 2048 Dec 31 1969 23:59 .. /VCD/: - d d---1xrxrxr 0 0 [fn 00] [LSN 23] 2048 Saturday 0 1900 00:00 . - d d---1xrxrxr 0 0 [fn 00] [LSN 18] 2048 Saturday 0 1900 00:00 .. + d d---1xrxrxr 0 0 [fn 00] [LSN 23] 2048 Dec 31 1969 23:59 . + d d---1xrxrxr 0 0 [fn 00] [LSN 18] 2048 Dec 31 1969 23:59 .. - ----1xrxrxr 0 0 [fn 00] [LSN 151] 2048 Feb 19 2001 16:37 entries.vcd - ----1xrxrxr 0 0 [fn 00] [LSN 150] 2048 Feb 19 2001 16:37 info.vcd - ----1xrxrxr 0 0 [fn 00] [LSN 152] 65536 Feb 19 2001 16:37 lot.vcd @@ -67,5 +67,5 @@ publisher id: `' preparer id: `' application id: `CDI/CDI_VCD.APP;1' -session #2 starts at track 2, LSN: 1251, ISO 9660 blocks: 1101 +session #2 starts at track 2, LSN: 1251, ISO 9660 blocks: 1101 ISO 9660: 1101 blocks, label `MONVOISIN ' diff --git a/test/svcdgs.right b/test/svcdgs.right index 465dbc95..f0a38688 100644 --- a/test/svcdgs.right +++ b/test/svcdgs.right @@ -54,13 +54,13 @@ ISO9660 filesystem /SVCD/: d d---1xrxrxr 0 0 [fn 00] [LSN 26] 2048 Jan 6 2001 21:29 . d d---1xrxrxr 0 0 [fn 00] [LSN 20] 2048 Jan 6 2001 21:29 .. - - ----1-rxrxr 0 0 [fn 00] [LSN 151] 2048 Jan 6 2001 21:29 entries.svd - - ----1-rxrxr 0 0 [fn 00] [LSN 150] 2048 Jan 6 2001 21:29 info.svd - - ----1-rxrxr 0 0 [fn 00] [LSN 152] 65536 Jan 6 2001 21:29 lot.svd - - ----1-rxrxr 0 0 [fn 00] [LSN 184] 16 Jan 6 2001 21:29 psd.svd - - ----1-rxrxr 0 0 [fn 00] [LSN 188] 427 Jan 6 2001 21:29 search.dat - - ----1-rxrxr 0 0 [fn 00] [LSN 186] 4096 Jan 6 2001 21:29 spicontx.svd - - ----1-rxrxr 0 0 [fn 00] [LSN 185] 2048 Jan 6 2001 21:29 tracks.svd + - ----1xr-rxr 0 0 [fn 00] [LSN 151] 2048 Jan 6 2001 21:29 entries.svd + - ----1xr-rxr 0 0 [fn 00] [LSN 150] 2048 Jan 6 2001 21:29 info.svd + - ----1xr-rxr 0 0 [fn 00] [LSN 152] 65536 Jan 6 2001 21:29 lot.svd + - ----1xr-rxr 0 0 [fn 00] [LSN 184] 16 Jan 6 2001 21:29 psd.svd + - ----1xr-rxr 0 0 [fn 00] [LSN 188] 427 Jan 6 2001 21:29 search.dat + - ----1xr-rxr 0 0 [fn 00] [LSN 186] 4096 Jan 6 2001 21:29 spicontx.svd + - ----1xr-rxr 0 0 [fn 00] [LSN 185] 2048 Jan 6 2001 21:29 tracks.svd /VMP/: d d---1xrxrxr 0 0 [fn 00] [LSN 27] 2048 Jan 6 2001 21:29 . diff --git a/test/testiso9660.c b/test/testiso9660.c index f18bca99..39333387 100644 --- a/test/testiso9660.c +++ b/test/testiso9660.c @@ -1,5 +1,5 @@ /* - $Id: testiso9660.c,v 1.1 2003/09/01 15:08:15 rocky Exp $ + $Id: testiso9660.c,v 1.2 2003/09/21 01:14:30 rocky Exp $ Copyright (C) 2003 Rocky Bernstein @@ -41,8 +41,6 @@ main (int argc, const char *argv[]) char *dst_p; int achars[] = {'!', '"', '%', '&', '(', ')', '*', '+', ',', '-', '.', '/', '?', '<', '=', '>'}; - - for (c='A'; c<='Z'; c++ ) { if (!iso9660_isdchar(c)) { printf("Failed iso9660_isdchar test on %d\n", c); @@ -126,5 +124,30 @@ main (int argc, const char *argv[]) return 10; } + /* Test get/set date */ + { + struct tm *p_tm, tm; + iso9660_dtime_t dtime; + time_t now = time(NULL); + + memset(&dtime, 0, sizeof(dtime)); + p_tm = localtime(&now); + iso9660_set_dtime(p_tm, &dtime); + iso9660_get_dtime(&dtime, true, &tm); + if ( memcmp(p_tm, &tm, sizeof(tm)) != 0 ) { + printf("Time retrieved with iso0660_get_dtime not same as that set with " + "iso9660_set_dtime.\n"); + return 11; + } + p_tm = gmtime(&now); + iso9660_set_dtime(p_tm, &dtime); + iso9660_get_dtime(&dtime, false, &tm); + if ( memcmp(p_tm, &tm, sizeof(tm)) != 0 ) { + printf("Time retrieved with iso0660_get_dtime not same as that set with " + "iso9660_set_dtime.\n"); + return 12; + } + } + return 0; }