/*! Open an ISO 9660 image for reading. Maybe in the future we will have a mode. NULL is returned on error. */ iso9660_t * iso9660_open_ext (const char *pathname, iso_extension_mask_t iso_extension_mask) { iso9660_t *p_iso = (iso9660_t *) _cdio_malloc(sizeof(struct _iso9660)) ; if (NULL == p_iso) return NULL; p_iso->stream = cdio_stdio_new( pathname ); if (NULL == p_iso->stream) goto error; if ( !iso9660_ifs_read_superblock(p_iso, iso_extension_mask) ) goto error; /* Determine if image has XA attributes. */ p_iso->b_xa = !strncmp ((char *) &(p_iso->pvd) + ISO_XA_MARKER_OFFSET, ISO_XA_MARKER_STRING, strlen (ISO_XA_MARKER_STRING)); p_iso->iso_extension_mask = iso_extension_mask; return p_iso; error: free(p_iso); return NULL; }
/*! Open an ISO 9660 image for reading in either fuzzy mode or not. */ static iso9660_t * iso9660_open_ext_private (const char *psz_path, iso_extension_mask_t iso_extension_mask, uint16_t i_fuzz, bool b_fuzzy) { iso9660_t *p_iso = (iso9660_t *) calloc(1, sizeof(iso9660_t)) ; bool b_have_superblock; if (!p_iso) return NULL; p_iso->stream = cdio_stdio_new( psz_path ); if (NULL == p_iso->stream) goto error; p_iso->i_framesize = ISO_BLOCKSIZE; b_have_superblock = (b_fuzzy) ? iso9660_ifs_fuzzy_read_superblock(p_iso, iso_extension_mask, i_fuzz) : iso9660_ifs_read_superblock(p_iso, iso_extension_mask) ; if ( ! b_have_superblock ) goto error; /* Determine if image has XA attributes. */ p_iso->b_xa = strncmp ((char *) &(p_iso->pvd) + ISO_XA_MARKER_OFFSET, ISO_XA_MARKER_STRING, sizeof (ISO_XA_MARKER_STRING)) ? nope : yep; p_iso->iso_extension_mask = iso_extension_mask; return p_iso; error: if (p_iso && p_iso->stream) { cdio_stdio_destroy(p_iso->stream); free(p_iso); } return NULL; }