summaryrefslogtreecommitdiff
path: root/src/input/vcd/libcdio/iso9660.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/input/vcd/libcdio/iso9660.c')
-rw-r--r--src/input/vcd/libcdio/iso9660.c1007
1 files changed, 0 insertions, 1007 deletions
diff --git a/src/input/vcd/libcdio/iso9660.c b/src/input/vcd/libcdio/iso9660.c
deleted file mode 100644
index 91b89d516..000000000
--- a/src/input/vcd/libcdio/iso9660.c
+++ /dev/null
@@ -1,1007 +0,0 @@
-/*
- $Id: iso9660.c,v 1.4 2006/09/26 18:13:11 dgp85 Exp $
-
- Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org>
- Copyright (C) 2003, 2004 Rocky Bernstein <rocky@panix.com>
-
- 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
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-*/
-
-/* Private headers */
-#include "iso9660_private.h"
-#include "cdio_assert.h"
-
-/* Public headers */
-#include <cdio/bytesex.h>
-#include <cdio/iso9660.h>
-#include <cdio/util.h>
-
-#include <time.h>
-#include <ctype.h>
-#ifdef HAVE_STRING_H
-#include <string.h>
-#endif
-#ifdef HAVE_STDIO_H
-#include <stdio.h>
-#endif
-
-static const char _rcsid[] = "$Id: iso9660.c,v 1.4 2006/09/26 18:13:11 dgp85 Exp $";
-
-/* some parameters... */
-#define SYSTEM_ID "CD-RTOS CD-BRIDGE"
-#define VOLUME_SET_ID ""
-
-/*!
- Change trailing blanks in str to nulls. Str has a maximum size of
- n characters.
-*/
-static char *
-strip_trail (const char str[], size_t n)
-{
- static char buf[1025];
- int j;
-
- cdio_assert (n < 1024);
-
- strncpy (buf, str, n);
- buf[n] = '\0';
-
- for (j = strlen (buf) - 1; j >= 0; j--)
- {
- if (buf[j] != ' ')
- break;
-
- buf[j] = '\0';
- }
-
- return buf;
-}
-
-static void
-pathtable_get_size_and_entries(const void *pt, unsigned int *size,
- unsigned int *entries);
-
-/*!
- 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 b_localtime true, otherwise
- tm will reported in GMT.
-*/
-void
-iso9660_get_dtime (const iso9660_dtime_t *idr_date, bool b_localtime,
- /*out*/ struct tm *p_tm)
-{
- time_t t;
- struct tm *p_temp_tm;
-
- if (!idr_date) return;
-
- memset(p_tm, 0, sizeof(struct tm));
- p_tm->tm_year = idr_date->dt_year;
- p_tm->tm_mon = idr_date->dt_month - 1;
- p_tm->tm_mday = idr_date->dt_day;
- p_tm->tm_hour = idr_date->dt_hour;
- p_tm->tm_min = idr_date->dt_minute;
- p_tm->tm_sec = idr_date->dt_second;
-
-#if defined(HAVE_TM_GMTOFF) && defined(HAVE_TZSET)
- if (b_localtime) {
- tzset();
-#if defined(HAVE_TZNAME)
- p_tm->tm_zone = (char *) tzname;
-#endif
-#if defined(HAVE_DAYLIGHT)
- p_tm->tm_isdst = daylight;
- p_tm->tm_gmtoff = timezone;
-#endif
- }
-#endif
-
- /* Recompute tm_wday and tm_yday via mktime. */
- t = mktime(p_tm);
-
- if (b_localtime)
- p_temp_tm = localtime(&t);
- else
- p_temp_tm = gmtime(&t);
-
- memcpy(p_tm, p_temp_tm, sizeof(struct tm));
-}
-
-/*!
- Set time in format used in ISO 9660 directory index record
- from a Unix time structure. */
-void
-iso9660_set_dtime (const struct tm *p_tm, /*out*/ iso9660_dtime_t *p_idr_date)
-{
- memset (p_idr_date, 0, 7);
-
- if (!p_tm) return;
-
- p_idr_date->dt_year = p_tm->tm_year;
- p_idr_date->dt_month = p_tm->tm_mon + 1;
- p_idr_date->dt_day = p_tm->tm_mday;
- p_idr_date->dt_hour = p_tm->tm_hour;
- p_idr_date->dt_minute = p_tm->tm_min;
- p_idr_date->dt_second = p_tm->tm_sec;
-
-#ifdef HAVE_TM_GMTOFF
- /* The ISO 9660 timezone is in the range -48..+52 and each unit
- represents a 15-minute interval. */
- p_idr_date->dt_gmtoff = p_tm->tm_gmtoff / (15 * 60);
-
- if (p_tm->tm_isdst) p_idr_date->dt_gmtoff -= 4;
-
- if (p_idr_date->dt_gmtoff < -48 ) {
-
- cdio_warn ("Converted ISO 9660 timezone %d is less than -48. Adjusted",
- p_idr_date->dt_gmtoff);
- p_idr_date->dt_gmtoff = -48;
- } else if (p_idr_date->dt_gmtoff > 52) {
- cdio_warn ("Converted ISO 9660 timezone %d is over 52. Adjusted",
- p_idr_date->dt_gmtoff);
- p_idr_date->dt_gmtoff = 52;
- }
-#else
- p_idr_date->dt_gmtoff = 0;
-#endif
-}
-
-/*!
- Set "long" time in format used in ISO 9660 primary volume descriptor
- from a Unix time structure. */
-void
-iso9660_set_ltime (const struct tm *_tm, /*out*/ iso9660_ltime_t *pvd_date)
-{
- char *_pvd_date = (char *) pvd_date;
-
- memset (_pvd_date, '0', 16);
- _pvd_date[16] = (int8_t) 0; /* tz */
-
- if (!_tm) return;
-
- snprintf(_pvd_date, 17,
- "%4.4d%2.2d%2.2d" "%2.2d%2.2d%2.2d" "%2.2d",
- _tm->tm_year + 1900, _tm->tm_mon + 1, _tm->tm_mday,
- _tm->tm_hour, _tm->tm_min, _tm->tm_sec,
- 0 /* 1/100 secs */ );
-
- _pvd_date[16] = (int8_t) 0; /* tz */
-}
-
-/*!
- Convert ISO-9660 file name that stored in a directory entry into
- what's usually listed as the file name in a listing.
- Lowercase name, and remove trailing ;1's or .;1's and
- turn the other ;'s into version numbers.
-
- The length of the translated string is returned.
-*/
-int
-iso9660_name_translate(const char *old, char *new)
-{
- return iso9660_name_translate_ext(old, new, 0);
-}
-
-/*!
- Convert ISO-9660 file name that stored in a directory entry into
- what's usually listed as the file name in a listing. Lowercase
- name if not using Joliet extension. Remove trailing ;1's or .;1's and
- turn the other ;'s into version numbers.
-
- The length of the translated string is returned.
-*/
-int
-iso9660_name_translate_ext(const char *old, char *new, uint8_t i_joliet_level)
-{
- int len = strlen(old);
- int i;
-
- for (i = 0; i < len; i++) {
- unsigned char c = old[i];
- if (!c)
- break;
-
- /* Lower case, unless we have Joliet extensions. */
- if (!i_joliet_level && isupper(c)) c = tolower(c);
-
- /* Drop trailing '.;1' (ISO 9660:1988 7.5.1 requires period) */
- if (c == '.' && i == len - 3 && old[i + 1] == ';' && old[i + 2] == '1')
- break;
-
- /* Drop trailing ';1' */
- if (c == ';' && i == len - 2 && old[i + 1] == '1')
- break;
-
- /* Convert remaining ';' to '.' */
- if (c == ';')
- c = '.';
-
- new[i] = c;
- }
- new[i] = '\0';
- return i;
-}
-
-/*!
- Pad string src with spaces to size len and copy this to dst. If
- len is less than the length of src, dst will be truncated to the
- first len characters of src.
-
- src can also be scanned to see if it contains only ACHARs, DCHARs,
- 7-bit ASCII chars depending on the enumeration _check.
-
- In addition to getting changed, dst is the return value.
- Note: this string might not be NULL terminated.
- */
-char *
-iso9660_strncpy_pad(char dst[], const char src[], size_t len,
- enum strncpy_pad_check _check)
-{
- size_t rlen;
-
- cdio_assert (dst != NULL);
- cdio_assert (src != NULL);
- cdio_assert (len > 0);
-
- switch (_check)
- {
- int idx;
- case ISO9660_NOCHECK:
- break;
-
- case ISO9660_7BIT:
- for (idx = 0; src[idx]; idx++)
- if ((int8_t) src[idx] < 0)
- {
- cdio_warn ("string '%s' fails 7bit constraint (pos = %d)",
- src, idx);
- break;
- }
- break;
-
- case ISO9660_ACHARS:
- for (idx = 0; src[idx]; idx++)
- if (!iso9660_isachar (src[idx]))
- {
- cdio_warn ("string '%s' fails a-character constraint (pos = %d)",
- src, idx);
- break;
- }
- break;
-
- case ISO9660_DCHARS:
- for (idx = 0; src[idx]; idx++)
- if (!iso9660_isdchar (src[idx]))
- {
- cdio_warn ("string '%s' fails d-character constraint (pos = %d)",
- src, idx);
- break;
- }
- break;
-
- default:
- cdio_assert_not_reached ();
- break;
- }
-
- rlen = strlen (src);
-
- if (rlen > len)
- cdio_warn ("string '%s' is getting truncated to %d characters",
- src, (unsigned int) len);
-
- strncpy (dst, src, len);
- if (rlen < len)
- memset(dst+rlen, ' ', len-rlen);
- return dst;
-}
-
-/*!
- Return true if c is a DCHAR - a valid ISO-9660 level 1 character.
- These are the ASCSII capital letters A-Z, the digits 0-9 and an
- underscore.
-*/
-bool
-iso9660_isdchar (int c)
-{
- if (!IN (c, 0x30, 0x5f)
- || IN (c, 0x3a, 0x40)
- || IN (c, 0x5b, 0x5e))
- return false;
-
- return true;
-}
-
-
-/*!
- Return true if c is an ACHAR -
- These are the DCHAR's plus some ASCII symbols including the space
- symbol.
-*/
-bool
-iso9660_isachar (int c)
-{
- if (!IN (c, 0x20, 0x5f)
- || IN (c, 0x23, 0x24)
- || c == 0x40
- || IN (c, 0x5b, 0x5e))
- return false;
-
- return true;
-}
-
-void
-iso9660_set_evd(void *pd)
-{
- struct iso_volume_descriptor ied;
-
- cdio_assert (sizeof(struct iso_volume_descriptor) == ISO_BLOCKSIZE);
-
- cdio_assert (pd != NULL);
-
- memset(&ied, 0, sizeof(ied));
-
- ied.type = to_711(ISO_VD_END);
- iso9660_strncpy_pad (ied.id, ISO_STANDARD_ID, sizeof(ied.id), ISO9660_DCHARS);
- ied.version = to_711(ISO_VERSION);
-
- memcpy(pd, &ied, sizeof(ied));
-}
-
-void
-iso9660_set_pvd(void *pd,
- const char volume_id[],
- const char publisher_id[],
- const char preparer_id[],
- const char application_id[],
- uint32_t iso_size,
- const void *root_dir,
- uint32_t path_table_l_extent,
- uint32_t path_table_m_extent,
- uint32_t path_table_size,
- const time_t *pvd_time
- )
-{
- iso9660_pvd_t ipd;
-
- cdio_assert (sizeof(iso9660_pvd_t) == ISO_BLOCKSIZE);
-
- cdio_assert (pd != NULL);
- cdio_assert (volume_id != NULL);
- cdio_assert (application_id != NULL);
-
- memset(&ipd,0,sizeof(ipd)); /* paranoia? */
-
- /* magic stuff ... thatis CD XA marker... */
- strcpy(((char*)&ipd)+ISO_XA_MARKER_OFFSET, ISO_XA_MARKER_STRING);
-
- ipd.type = to_711(ISO_VD_PRIMARY);
- iso9660_strncpy_pad (ipd.id, ISO_STANDARD_ID, 5, ISO9660_DCHARS);
- ipd.version = to_711(ISO_VERSION);
-
- iso9660_strncpy_pad (ipd.system_id, SYSTEM_ID, 32, ISO9660_ACHARS);
- iso9660_strncpy_pad (ipd.volume_id, volume_id, 32, ISO9660_DCHARS);
-
- ipd.volume_space_size = to_733(iso_size);
-
- ipd.volume_set_size = to_723(1);
- ipd.volume_sequence_number = to_723(1);
- ipd.logical_block_size = to_723(ISO_BLOCKSIZE);
-
- ipd.path_table_size = to_733(path_table_size);
- ipd.type_l_path_table = to_731(path_table_l_extent);
- ipd.type_m_path_table = to_732(path_table_m_extent);
-
- /* root_directory_record doesn't contain the 1-byte filename,
- so we add one for that. */
- cdio_assert (sizeof(ipd.root_directory_record) == 33);
- memcpy(&(ipd.root_directory_record), root_dir,
- sizeof(ipd.root_directory_record));
- ipd.root_directory_filename='\0';
- ipd.root_directory_record.length = 33+1;
- iso9660_strncpy_pad (ipd.volume_set_id, VOLUME_SET_ID, 128, ISO9660_DCHARS);
-
- iso9660_strncpy_pad (ipd.publisher_id, publisher_id, 128, ISO9660_ACHARS);
- iso9660_strncpy_pad (ipd.preparer_id, preparer_id, 128, ISO9660_ACHARS);
- iso9660_strncpy_pad (ipd.application_id, application_id, 128, ISO9660_ACHARS);
-
- iso9660_strncpy_pad (ipd.copyright_file_id , "", 37, ISO9660_DCHARS);
- iso9660_strncpy_pad (ipd.abstract_file_id , "", 37, ISO9660_DCHARS);
- iso9660_strncpy_pad (ipd.bibliographic_file_id, "", 37, ISO9660_DCHARS);
-
- iso9660_set_ltime (gmtime (pvd_time), &(ipd.creation_date));
- iso9660_set_ltime (gmtime (pvd_time), &(ipd.modification_date));
- iso9660_set_ltime (NULL, &(ipd.expiration_date));
- iso9660_set_ltime (NULL, &(ipd.effective_date));
-
- ipd.file_structure_version = to_711(1);
-
- /* we leave ipd.application_data = 0 */
-
- memcpy(pd, &ipd, sizeof(ipd)); /* copy stuff to arg ptr */
-}
-
-unsigned int
-iso9660_dir_calc_record_size(unsigned int namelen, unsigned int su_len)
-{
- unsigned int length;
-
- length = sizeof(iso9660_dir_t);
- length += namelen;
- if (length % 2) /* pad to word boundary */
- length++;
- length += su_len;
- if (length % 2) /* pad to word boundary again */
- length++;
-
- return length;
-}
-
-void
-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)
-{
- iso9660_dir_t *idr = dir;
- uint8_t *dir8 = dir;
- unsigned int offset = 0;
- uint32_t dsize = from_733(idr->size);
- int length, su_offset;
- cdio_assert (sizeof(iso9660_dir_t) == 33);
-
- if (!dsize && !idr->length)
- dsize = ISO_BLOCKSIZE; /* for when dir lacks '.' entry */
-
- cdio_assert (dsize > 0 && !(dsize % ISO_BLOCKSIZE));
- cdio_assert (dir != NULL);
- cdio_assert (extent > 17);
- cdio_assert (filename != NULL);
- cdio_assert (strlen(filename) <= MAX_ISOPATHNAME);
-
- length = sizeof(iso9660_dir_t);
- length += strlen(filename);
- length = _cdio_ceil2block (length, 2); /* pad to word boundary */
- su_offset = length;
- length += su_size;
- length = _cdio_ceil2block (length, 2); /* pad to word boundary again */
-
- /* find the last entry's end */
- {
- unsigned int ofs_last_rec = 0;
-
- offset = 0;
- while (offset < dsize)
- {
- if (!dir8[offset])
- {
- offset++;
- continue;
- }
-
- offset += dir8[offset];
- ofs_last_rec = offset;
- }
-
- cdio_assert (offset == dsize);
-
- offset = ofs_last_rec;
- }
-
- /* be sure we don't cross sectors boundaries */
- offset = _cdio_ofs_add (offset, length, ISO_BLOCKSIZE);
- offset -= length;
-
- cdio_assert (offset + length <= dsize);
-
- idr = (iso9660_dir_t *) &dir8[offset];
-
- cdio_assert (offset+length < dsize);
-
- memset(idr, 0, length);
-
- idr->length = to_711(length);
- idr->extent = to_733(extent);
- idr->size = to_733(size);
-
- iso9660_set_dtime (gmtime(entry_time), &(idr->recording_time));
-
- idr->file_flags = to_711(file_flags);
-
- idr->volume_sequence_number = to_723(1);
-
- idr->filename_len = to_711(strlen(filename)
- ? strlen(filename) : 1); /* working hack! */
-
- memcpy(idr->filename, filename, from_711(idr->filename_len));
- memcpy(&dir8[offset] + su_offset, su_data, su_size);
-}
-
-void
-iso9660_dir_init_new (void *dir,
- uint32_t self,
- uint32_t ssize,
- uint32_t parent,
- uint32_t psize,
- const time_t *dir_time)
-{
- iso9660_dir_init_new_su (dir, self, ssize, NULL, 0, parent, psize, NULL,
- 0, dir_time);
-}
-
-void
-iso9660_dir_init_new_su (void *dir,
- uint32_t self,
- uint32_t ssize,
- const void *ssu_data,
- unsigned int ssu_size,
- uint32_t parent,
- uint32_t psize,
- const void *psu_data,
- unsigned int psu_size,
- const time_t *dir_time)
-{
- cdio_assert (ssize > 0 && !(ssize % ISO_BLOCKSIZE));
- cdio_assert (psize > 0 && !(psize % ISO_BLOCKSIZE));
- cdio_assert (dir != NULL);
-
- memset (dir, 0, ssize);
-
- /* "\0" -- working hack due to padding */
- iso9660_dir_add_entry_su (dir, "\0", self, ssize, ISO_DIRECTORY, ssu_data,
- ssu_size, dir_time);
-
- iso9660_dir_add_entry_su (dir, "\1", parent, psize, ISO_DIRECTORY, psu_data,
- psu_size, dir_time);
-}
-
-/* Zero's out pathable. Do this first. */
-void
-iso9660_pathtable_init (void *pt)
-{
- cdio_assert (sizeof (struct iso_path_table) == 8);
-
- cdio_assert (pt != NULL);
-
- memset (pt, 0, ISO_BLOCKSIZE); /* fixme */
-}
-
-static const struct iso_path_table*
-pathtable_get_entry (const void *pt, unsigned int entrynum)
-{
- const uint8_t *tmp = pt;
- unsigned int offset = 0;
- unsigned int count = 0;
-
- cdio_assert (pt != NULL);
-
- while (from_711 (*tmp))
- {
- if (count == entrynum)
- break;
-
- cdio_assert (count < entrynum);
-
- offset += sizeof (struct iso_path_table);
- offset += from_711 (*tmp);
- if (offset % 2)
- offset++;
- tmp = (uint8_t *)pt + offset;
- count++;
- }
-
- if (!from_711 (*tmp))
- return NULL;
-
- return (const void *) tmp;
-}
-
-void
-pathtable_get_size_and_entries (const void *pt,
- unsigned int *size,
- unsigned int *entries)
-{
- const uint8_t *tmp = pt;
- unsigned int offset = 0;
- unsigned int count = 0;
-
- cdio_assert (pt != NULL);
-
- while (from_711 (*tmp))
- {
- offset += sizeof (struct iso_path_table);
- offset += from_711 (*tmp);
- if (offset % 2)
- offset++;
- tmp = (uint8_t *)pt + offset;
- count++;
- }
-
- if (size)
- *size = offset;
-
- if (entries)
- *entries = count;
-}
-
-unsigned int
-iso9660_pathtable_get_size (const void *pt)
-{
- unsigned int size = 0;
- pathtable_get_size_and_entries (pt, &size, NULL);
- return size;
-}
-
-uint16_t
-iso9660_pathtable_l_add_entry (void *pt,
- const char name[],
- uint32_t extent,
- uint16_t parent)
-{
- struct iso_path_table *ipt =
- (struct iso_path_table*)((char *)pt + iso9660_pathtable_get_size (pt));
- size_t name_len = strlen (name) ? strlen (name) : 1;
- unsigned int entrynum = 0;
-
- cdio_assert (iso9660_pathtable_get_size (pt) < ISO_BLOCKSIZE); /*fixme */
-
- memset (ipt, 0, sizeof (struct iso_path_table) + name_len); /* paranoia */
-
- ipt->name_len = to_711 (name_len);
- ipt->extent = to_731 (extent);
- ipt->parent = to_721 (parent);
- memcpy (ipt->name, name, name_len);
-
- pathtable_get_size_and_entries (pt, NULL, &entrynum);
-
- if (entrynum > 1)
- {
- const struct iso_path_table *ipt2
- = pathtable_get_entry (pt, entrynum - 2);
-
- cdio_assert (ipt2 != NULL);
-
- cdio_assert (from_721 (ipt2->parent) <= parent);
- }
-
- return entrynum;
-}
-
-uint16_t
-iso9660_pathtable_m_add_entry (void *pt,
- const char name[],
- uint32_t extent,
- uint16_t parent)
-{
- struct iso_path_table *ipt =
- (struct iso_path_table*)((char *)pt + iso9660_pathtable_get_size (pt));
- size_t name_len = strlen (name) ? strlen (name) : 1;
- unsigned int entrynum = 0;
-
- cdio_assert (iso9660_pathtable_get_size(pt) < ISO_BLOCKSIZE); /* fixme */
-
- memset(ipt, 0, sizeof (struct iso_path_table) + name_len); /* paranoia */
-
- ipt->name_len = to_711 (name_len);
- ipt->extent = to_732 (extent);
- ipt->parent = to_722 (parent);
- memcpy (ipt->name, name, name_len);
-
- pathtable_get_size_and_entries (pt, NULL, &entrynum);
-
- if (entrynum > 1)
- {
- const struct iso_path_table *ipt2
- = pathtable_get_entry (pt, entrynum - 2);
-
- cdio_assert (ipt2 != NULL);
-
- cdio_assert (from_722 (ipt2->parent) <= parent);
- }
-
- return entrynum;
-}
-
-/*!
- Check that pathname is a valid ISO-9660 directory name.
-
- A valid directory name should not start out with a slash (/),
- dot (.) or null byte, should be less than 37 characters long,
- have no more than 8 characters in a directory component
- which is separated by a /, and consist of only DCHARs.
- */
-bool
-iso9660_dirname_valid_p (const char pathname[])
-{
- const char *p = pathname;
- int len;
-
- cdio_assert (pathname != NULL);
-
- if (*p == '/' || *p == '.' || *p == '\0')
- return false;
-
- if (strlen (pathname) > MAX_ISOPATHNAME)
- return false;
-
- len = 0;
- for (; *p; p++)
- if (iso9660_isdchar (*p))
- {
- len++;
- if (len > 8)
- return false;
- }
- else if (*p == '/')
- {
- if (!len)
- return false;
- len = 0;
- }
- else
- return false; /* unexpected char */
-
- if (!len)
- return false; /* last char may not be '/' */
-
- return true;
-}
-
-/*!
- Check that pathname is a valid ISO-9660 pathname.
-
- A valid pathname contains a valid directory name, if one appears and
- the filename portion should be no more than 8 characters for the
- file prefix and 3 characters in the extension (or portion after a
- dot). There should be exactly one dot somewhere in the filename
- portion and the filename should be composed of only DCHARs.
-
- True is returned if pathname is valid.
- */
-bool
-iso9660_pathname_valid_p (const char pathname[])
-{
- const char *p = NULL;
-
- cdio_assert (pathname != NULL);
-
- if ((p = strrchr (pathname, '/')))
- {
- bool rc;
- char *_tmp = strdup (pathname);
-
- *strrchr (_tmp, '/') = '\0';
-
- rc = iso9660_dirname_valid_p (_tmp);
-
- free (_tmp);
-
- if (!rc)
- return false;
-
- p++;
- }
- else
- p = pathname;
-
- if (strlen (pathname) > (MAX_ISOPATHNAME - 6))
- return false;
-
- {
- int len = 0;
- int dots = 0;
-
- for (; *p; p++)
- if (iso9660_isdchar (*p))
- {
- len++;
- if (dots == 0 ? len > 8 : len > 3)
- return false;
- }
- else if (*p == '.')
- {
- dots++;
- if (dots > 1)
- return false;
- if (!len)
- return false;
- len = 0;
- }
- else
- return false;
-
- if (dots != 1)
- return false;
- }
-
- return true;
-}
-
-/*!
- Take pathname and a version number and turn that into a ISO-9660
- pathname. (That's just the pathname followd by ";" and the version
- number. For example, mydir/file.ext -> mydir/file.ext;1 for version
- 1. The resulting ISO-9660 pathname is returned.
-*/
-char *
-iso9660_pathname_isofy (const char pathname[], uint16_t version)
-{
- char tmpbuf[1024] = { 0, };
-
- cdio_assert (strlen (pathname) < (sizeof (tmpbuf) - sizeof (";65535")));
-
- snprintf (tmpbuf, sizeof(tmpbuf), "%s;%d", pathname, version);
-
- return strdup (tmpbuf);
-}
-
-/*!
- Return the PVD's application ID.
- NULL is returned if there is some problem in getting this.
-*/
-char *
-iso9660_get_application_id(iso9660_pvd_t *p_pvd)
-{
- if (NULL==p_pvd) return NULL;
- return strdup(strip_trail(p_pvd->application_id, ISO_MAX_APPLICATION_ID));
-}
-
-#if FIXME
-lsn_t
-iso9660_get_dir_extent(const iso9660_dir_t *idr)
-{
- if (NULL == idr) return 0;
- return from_733(idr->extent);
-}
-#endif
-
-uint8_t
-iso9660_get_dir_len(const iso9660_dir_t *idr)
-{
- if (NULL == idr) return 0;
- return idr->length;
-}
-
-#if FIXME
-uint8_t
-iso9660_get_dir_size(const iso9660_dir_t *idr)
-{
- if (NULL == idr) return 0;
- return from_733(idr->size);
-}
-#endif
-
-uint8_t
-iso9660_get_pvd_type(const iso9660_pvd_t *pvd)
-{
- if (NULL == pvd) return 255;
- return(pvd->type);
-}
-
-const char *
-iso9660_get_pvd_id(const iso9660_pvd_t *pvd)
-{
- if (NULL == pvd) return "ERR";
- return(pvd->id);
-}
-
-int
-iso9660_get_pvd_space_size(const iso9660_pvd_t *pvd)
-{
- if (NULL == pvd) return 0;
- return from_733(pvd->volume_space_size);
-}
-
-int
-iso9660_get_pvd_block_size(const iso9660_pvd_t *pvd)
-{
- if (NULL == pvd) return 0;
- 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)
-{
- if (NULL == pvd) return 0;
- 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)
-{
- if (NULL == pvd)
- return CDIO_INVALID_LSN;
- else {
- const iso9660_dir_t *idr = &(pvd->root_directory_record);
- if (NULL == idr) return CDIO_INVALID_LSN;
- return(from_733 (idr->extent));
- }
-}
-
-/*!
- Return a string containing the preparer id with trailing
- blanks removed.
-*/
-char *
-iso9660_get_preparer_id(const iso9660_pvd_t *pvd)
-{
- if (NULL==pvd) return NULL;
- return strdup(strip_trail(pvd->preparer_id, ISO_MAX_PREPARER_ID));
-}
-
-/*!
- Return a string containing the publisher id with trailing
- blanks removed.
-*/
-char *
-iso9660_get_publisher_id(const iso9660_pvd_t *pvd)
-{
- if (NULL==pvd) return NULL;
- return strdup(strip_trail(pvd->publisher_id, ISO_MAX_PUBLISHER_ID));
-}
-
-/*!
- Return a string containing the PVD's system id with trailing
- blanks removed.
-*/
-char *
-iso9660_get_system_id(const iso9660_pvd_t *pvd)
-{
- if (NULL==pvd) return NULL;
- return strdup(strip_trail(pvd->system_id, ISO_MAX_SYSTEM_ID));
-}
-
-/*!
- Return the PVD's volume ID.
-*/
-char *
-iso9660_get_volume_id(const iso9660_pvd_t *pvd)
-{
- if (NULL == pvd) return NULL;
- return strdup(strip_trail(pvd->volume_id, ISO_MAX_VOLUME_ID));
-}
-
-/*!
- Return the PVD's volumeset ID.
- NULL is returned if there is some problem in getting this.
-*/
-char *
-iso9660_get_volumeset_id(const iso9660_pvd_t *pvd)
-{
- if ( NULL == pvd ) return NULL;
- return strdup(strip_trail(pvd->volume_set_id, ISO_MAX_VOLUMESET_ID));
-}
-
-
-/*
- * Local variables:
- * c-file-style: "gnu"
- * tab-width: 8
- * indent-tabs-mode: nil
- * End:
- */