mirror of
https://github.com/pbatard/rufus.git
synced 2025-05-20 18:05:21 -04:00
[iso] update libcdio to latest
* Also clean up some of the code in iso.c
This commit is contained in:
parent
b274388f95
commit
b80f7c0785
19 changed files with 930 additions and 300 deletions
92
src/iso.c
92
src/iso.c
|
@ -94,7 +94,7 @@ static const char* stupid_antivirus = " NOTE: This is usually caused by a poorl
|
||||||
"look into using a *SMARTER* antivirus solution.";
|
"look into using a *SMARTER* antivirus solution.";
|
||||||
const char* old_c32_name[NB_OLD_C32] = OLD_C32_NAMES;
|
const char* old_c32_name[NB_OLD_C32] = OLD_C32_NAMES;
|
||||||
static const int64_t old_c32_threshold[NB_OLD_C32] = OLD_C32_THRESHOLD;
|
static const int64_t old_c32_threshold[NB_OLD_C32] = OLD_C32_THRESHOLD;
|
||||||
static uint8_t i_joliet_level = 0;
|
static uint8_t joliet_level = 0;
|
||||||
static uint64_t total_blocks, nb_blocks;
|
static uint64_t total_blocks, nb_blocks;
|
||||||
static BOOL scan_only = FALSE;
|
static BOOL scan_only = FALSE;
|
||||||
static StrArray config_path, isolinux_path;
|
static StrArray config_path, isolinux_path;
|
||||||
|
@ -140,7 +140,7 @@ static void log_handler (cdio_log_level_t level, const char *message)
|
||||||
* Scan and set ISO properties
|
* Scan and set ISO properties
|
||||||
* Returns true if the the current file does not need to be processed further
|
* Returns true if the the current file does not need to be processed further
|
||||||
*/
|
*/
|
||||||
static BOOL check_iso_props(const char* psz_dirname, int64_t i_file_length, const char* psz_basename,
|
static BOOL check_iso_props(const char* psz_dirname, int64_t file_length, const char* psz_basename,
|
||||||
const char* psz_fullpath, EXTRACT_PROPS *props)
|
const char* psz_fullpath, EXTRACT_PROPS *props)
|
||||||
{
|
{
|
||||||
size_t i, j, len;
|
size_t i, j, len;
|
||||||
|
@ -157,7 +157,7 @@ static BOOL check_iso_props(const char* psz_dirname, int64_t i_file_length, cons
|
||||||
|
|
||||||
// Check for an old incompatible c32 file anywhere
|
// Check for an old incompatible c32 file anywhere
|
||||||
for (i=0; i<NB_OLD_C32; i++) {
|
for (i=0; i<NB_OLD_C32; i++) {
|
||||||
if ((safe_stricmp(psz_basename, old_c32_name[i]) == 0) && (i_file_length <= old_c32_threshold[i]))
|
if ((safe_stricmp(psz_basename, old_c32_name[i]) == 0) && (file_length <= old_c32_threshold[i]))
|
||||||
props->is_old_c32[i] = TRUE;
|
props->is_old_c32[i] = TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -244,12 +244,12 @@ static BOOL check_iso_props(const char* psz_dirname, int64_t i_file_length, cons
|
||||||
if (props->is_old_c32[i])
|
if (props->is_old_c32[i])
|
||||||
img_report.has_old_c32[i] = TRUE;
|
img_report.has_old_c32[i] = TRUE;
|
||||||
}
|
}
|
||||||
if (i_file_length >= FOUR_GIGABYTES)
|
if (file_length >= FOUR_GIGABYTES)
|
||||||
img_report.has_4GB_file = TRUE;
|
img_report.has_4GB_file = TRUE;
|
||||||
// Compute projected size needed
|
// Compute projected size needed
|
||||||
total_blocks += i_file_length / ISO_BLOCKSIZE;
|
total_blocks += file_length / ISO_BLOCKSIZE;
|
||||||
// NB: ISO_BLOCKSIZE = UDF_BLOCKSIZE
|
// NB: ISO_BLOCKSIZE = UDF_BLOCKSIZE
|
||||||
if ((i_file_length != 0) && (i_file_length % ISO_BLOCKSIZE != 0))
|
if ((file_length != 0) && (file_length % ISO_BLOCKSIZE != 0))
|
||||||
total_blocks++;
|
total_blocks++;
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
@ -315,7 +315,7 @@ static void fix_config(const char* psz_fullpath, const char* psz_path, const cha
|
||||||
free(src);
|
free(src);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void print_extracted_file(char* psz_fullpath, int64_t i_file_length)
|
static void print_extracted_file(char* psz_fullpath, int64_t file_length)
|
||||||
{
|
{
|
||||||
size_t i, nul_pos;
|
size_t i, nul_pos;
|
||||||
|
|
||||||
|
@ -325,9 +325,9 @@ static void print_extracted_file(char* psz_fullpath, int64_t i_file_length)
|
||||||
nul_pos = strlen(psz_fullpath);
|
nul_pos = strlen(psz_fullpath);
|
||||||
for (i=0; i<nul_pos; i++)
|
for (i=0; i<nul_pos; i++)
|
||||||
if (psz_fullpath[i] == '/') psz_fullpath[i] = '\\';
|
if (psz_fullpath[i] == '/') psz_fullpath[i] = '\\';
|
||||||
safe_sprintf(&psz_fullpath[nul_pos], 24, " (%s)", SizeToHumanReadable(i_file_length, TRUE, FALSE));
|
safe_sprintf(&psz_fullpath[nul_pos], 24, " (%s)", SizeToHumanReadable(file_length, TRUE, FALSE));
|
||||||
uprintf("Extracting: %s\n", psz_fullpath);
|
uprintf("Extracting: %s\n", psz_fullpath);
|
||||||
safe_sprintf(&psz_fullpath[nul_pos], 24, " (%s)", SizeToHumanReadable(i_file_length, FALSE, FALSE));
|
safe_sprintf(&psz_fullpath[nul_pos], 24, " (%s)", SizeToHumanReadable(file_length, FALSE, FALSE));
|
||||||
PrintStatus(0, MSG_000, psz_fullpath); // MSG_000 is "%s"
|
PrintStatus(0, MSG_000, psz_fullpath); // MSG_000 is "%s"
|
||||||
// ISO9660 cannot handle backslashes
|
// ISO9660 cannot handle backslashes
|
||||||
for (i=0; i<nul_pos; i++)
|
for (i=0; i<nul_pos; i++)
|
||||||
|
@ -368,13 +368,13 @@ static int udf_extract_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const cha
|
||||||
DWORD buf_size, wr_size, err;
|
DWORD buf_size, wr_size, err;
|
||||||
EXTRACT_PROPS props;
|
EXTRACT_PROPS props;
|
||||||
BOOL r, is_identical;
|
BOOL r, is_identical;
|
||||||
int i_length;
|
int length;
|
||||||
size_t i;
|
size_t i;
|
||||||
char tmp[128], *psz_fullpath = NULL, *psz_sanpath = NULL;
|
char tmp[128], *psz_fullpath = NULL, *psz_sanpath = NULL;
|
||||||
const char* psz_basename;
|
const char* psz_basename;
|
||||||
udf_dirent_t *p_udf_dirent2;
|
udf_dirent_t *p_udf_dirent2;
|
||||||
uint8_t buf[UDF_BLOCKSIZE];
|
uint8_t buf[UDF_BLOCKSIZE];
|
||||||
int64_t i_read, i_file_length;
|
int64_t read, file_length;
|
||||||
|
|
||||||
if ((p_udf_dirent == NULL) || (psz_path == NULL))
|
if ((p_udf_dirent == NULL) || (psz_path == NULL))
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -384,14 +384,14 @@ static int udf_extract_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const cha
|
||||||
psz_basename = udf_get_filename(p_udf_dirent);
|
psz_basename = udf_get_filename(p_udf_dirent);
|
||||||
if (strlen(psz_basename) == 0)
|
if (strlen(psz_basename) == 0)
|
||||||
continue;
|
continue;
|
||||||
i_length = (int)(3 + strlen(psz_path) + strlen(psz_basename) + strlen(psz_extract_dir) + 24);
|
length = (int)(3 + strlen(psz_path) + strlen(psz_basename) + strlen(psz_extract_dir) + 24);
|
||||||
psz_fullpath = (char*)calloc(sizeof(char), i_length);
|
psz_fullpath = (char*)calloc(sizeof(char), length);
|
||||||
if (psz_fullpath == NULL) {
|
if (psz_fullpath == NULL) {
|
||||||
uprintf("Error allocating file name");
|
uprintf("Error allocating file name");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
i_length = _snprintf(psz_fullpath, i_length, "%s%s/%s", psz_extract_dir, psz_path, psz_basename);
|
length = _snprintf(psz_fullpath, length, "%s%s/%s", psz_extract_dir, psz_path, psz_basename);
|
||||||
if (i_length < 0) {
|
if (length < 0) {
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
if (udf_is_dir(p_udf_dirent)) {
|
if (udf_is_dir(p_udf_dirent)) {
|
||||||
|
@ -410,12 +410,12 @@ static int udf_extract_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const cha
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
i_file_length = udf_get_file_length(p_udf_dirent);
|
file_length = udf_get_file_length(p_udf_dirent);
|
||||||
if (check_iso_props(psz_path, i_file_length, psz_basename, psz_fullpath, &props)) {
|
if (check_iso_props(psz_path, file_length, psz_basename, psz_fullpath, &props)) {
|
||||||
safe_free(psz_fullpath);
|
safe_free(psz_fullpath);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
print_extracted_file(psz_fullpath, i_file_length);
|
print_extracted_file(psz_fullpath, file_length);
|
||||||
for (i=0; i<NB_OLD_C32; i++) {
|
for (i=0; i<NB_OLD_C32; i++) {
|
||||||
if (props.is_old_c32[i] && use_own_c32[i]) {
|
if (props.is_old_c32[i] && use_own_c32[i]) {
|
||||||
static_sprintf(tmp, "%s/syslinux-%s/%s", FILES_DIR, embedded_sl_version_str[0], old_c32_name[i]);
|
static_sprintf(tmp, "%s/syslinux-%s/%s", FILES_DIR, embedded_sl_version_str[0], old_c32_name[i]);
|
||||||
|
@ -440,21 +440,21 @@ static int udf_extract_files(udf_t *p_udf, udf_dirent_t *p_udf_dirent, const cha
|
||||||
uprintf(stupid_antivirus);
|
uprintf(stupid_antivirus);
|
||||||
else
|
else
|
||||||
goto out;
|
goto out;
|
||||||
} else while (i_file_length > 0) {
|
} else while (file_length > 0) {
|
||||||
if (FormatStatus) goto out;
|
if (FormatStatus) goto out;
|
||||||
memset(buf, 0, UDF_BLOCKSIZE);
|
memset(buf, 0, UDF_BLOCKSIZE);
|
||||||
i_read = udf_read_block(p_udf_dirent, buf, 1);
|
read = udf_read_block(p_udf_dirent, buf, 1);
|
||||||
if (i_read < 0) {
|
if (read < 0) {
|
||||||
uprintf(" Error reading UDF file %s", &psz_fullpath[strlen(psz_extract_dir)]);
|
uprintf(" Error reading UDF file %s", &psz_fullpath[strlen(psz_extract_dir)]);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
buf_size = (DWORD)MIN(i_file_length, i_read);
|
buf_size = (DWORD)MIN(file_length, read);
|
||||||
ISO_BLOCKING(r = WriteFileWithRetry(file_handle, buf, buf_size, &wr_size, WRITE_RETRIES));
|
ISO_BLOCKING(r = WriteFileWithRetry(file_handle, buf, buf_size, &wr_size, WRITE_RETRIES));
|
||||||
if (!r) {
|
if (!r) {
|
||||||
uprintf(" Error writing file: %s", WindowsErrorString());
|
uprintf(" Error writing file: %s", WindowsErrorString());
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
i_file_length -= i_read;
|
file_length -= read;
|
||||||
if (nb_blocks++ % PROGRESS_THRESHOLD == 0)
|
if (nb_blocks++ % PROGRESS_THRESHOLD == 0)
|
||||||
UpdateProgress(OP_DOS, 100.0f*nb_blocks/total_blocks);
|
UpdateProgress(OP_DOS, 100.0f*nb_blocks/total_blocks);
|
||||||
}
|
}
|
||||||
|
@ -491,24 +491,24 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path)
|
||||||
DWORD buf_size, wr_size, err;
|
DWORD buf_size, wr_size, err;
|
||||||
EXTRACT_PROPS props;
|
EXTRACT_PROPS props;
|
||||||
BOOL is_symlink, is_identical;
|
BOOL is_symlink, is_identical;
|
||||||
int i_length, r = 1;
|
int length, r = 1;
|
||||||
char tmp[128], psz_fullpath[MAX_PATH], *psz_basename, *psz_sanpath;
|
char tmp[128], psz_fullpath[MAX_PATH], *psz_basename, *psz_sanpath;
|
||||||
const char *psz_iso_name = &psz_fullpath[strlen(psz_extract_dir)];
|
const char *psz_iso_name = &psz_fullpath[strlen(psz_extract_dir)];
|
||||||
unsigned char buf[ISO_BLOCKSIZE];
|
unsigned char buf[ISO_BLOCKSIZE];
|
||||||
CdioListNode_t* p_entnode;
|
CdioListNode_t* p_entnode;
|
||||||
iso9660_stat_t *p_statbuf;
|
iso9660_stat_t *p_statbuf;
|
||||||
CdioList_t* p_entlist;
|
CdioISO9660FileList_t* p_entlist;
|
||||||
size_t i, j;
|
size_t i, j;
|
||||||
lsn_t lsn;
|
lsn_t lsn;
|
||||||
int64_t i_file_length;
|
int64_t file_length, extent_length;
|
||||||
|
|
||||||
if ((p_iso == NULL) || (psz_path == NULL))
|
if ((p_iso == NULL) || (psz_path == NULL))
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
i_length = _snprintf(psz_fullpath, sizeof(psz_fullpath), "%s%s/", psz_extract_dir, psz_path);
|
length = _snprintf(psz_fullpath, sizeof(psz_fullpath), "%s%s/", psz_extract_dir, psz_path);
|
||||||
if (i_length < 0)
|
if (length < 0)
|
||||||
return 1;
|
return 1;
|
||||||
psz_basename = &psz_fullpath[i_length];
|
psz_basename = &psz_fullpath[length];
|
||||||
|
|
||||||
p_entlist = iso9660_ifs_readdir(p_iso, psz_path);
|
p_entlist = iso9660_ifs_readdir(p_iso, psz_path);
|
||||||
if (!p_entlist) {
|
if (!p_entlist) {
|
||||||
|
@ -526,7 +526,7 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path)
|
||||||
// Rock Ridge requires an exception
|
// Rock Ridge requires an exception
|
||||||
is_symlink = FALSE;
|
is_symlink = FALSE;
|
||||||
if ((p_statbuf->rr.b3_rock == yep) && enable_rockridge) {
|
if ((p_statbuf->rr.b3_rock == yep) && enable_rockridge) {
|
||||||
safe_strcpy(psz_basename, sizeof(psz_fullpath)-i_length-1, p_statbuf->filename);
|
safe_strcpy(psz_basename, sizeof(psz_fullpath) - length - 1, p_statbuf->filename);
|
||||||
if (safe_strlen(p_statbuf->filename) > 64)
|
if (safe_strlen(p_statbuf->filename) > 64)
|
||||||
img_report.has_long_filename = TRUE;
|
img_report.has_long_filename = TRUE;
|
||||||
// libcdio has a memleak for Rock Ridge symlinks. It doesn't look like there's an easy fix there as
|
// libcdio has a memleak for Rock Ridge symlinks. It doesn't look like there's an easy fix there as
|
||||||
|
@ -537,7 +537,7 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path)
|
||||||
if (scan_only)
|
if (scan_only)
|
||||||
safe_free(p_statbuf->rr.psz_symlink);
|
safe_free(p_statbuf->rr.psz_symlink);
|
||||||
} else {
|
} else {
|
||||||
iso9660_name_translate_ext(p_statbuf->filename, psz_basename, i_joliet_level);
|
iso9660_name_translate_ext(p_statbuf->filename, psz_basename, joliet_level);
|
||||||
}
|
}
|
||||||
if (p_statbuf->type == _STAT_DIR) {
|
if (p_statbuf->type == _STAT_DIR) {
|
||||||
if (!scan_only) {
|
if (!scan_only) {
|
||||||
|
@ -552,11 +552,11 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path)
|
||||||
if (iso_extract_files(p_iso, psz_iso_name))
|
if (iso_extract_files(p_iso, psz_iso_name))
|
||||||
goto out;
|
goto out;
|
||||||
} else {
|
} else {
|
||||||
i_file_length = p_statbuf->total_size;
|
file_length = p_statbuf->size;
|
||||||
if (check_iso_props(psz_path, i_file_length, psz_basename, psz_fullpath, &props)) {
|
if (check_iso_props(psz_path, file_length, psz_basename, psz_fullpath, &props)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
print_extracted_file(psz_fullpath, i_file_length);
|
print_extracted_file(psz_fullpath, file_length);
|
||||||
for (i=0; i<NB_OLD_C32; i++) {
|
for (i=0; i<NB_OLD_C32; i++) {
|
||||||
if (props.is_old_c32[i] && use_own_c32[i]) {
|
if (props.is_old_c32[i] && use_own_c32[i]) {
|
||||||
static_sprintf(tmp, "%s/syslinux-%s/%s", FILES_DIR, embedded_sl_version_str[0], old_c32_name[i]);
|
static_sprintf(tmp, "%s/syslinux-%s/%s", FILES_DIR, embedded_sl_version_str[0], old_c32_name[i]);
|
||||||
|
@ -573,7 +573,7 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path)
|
||||||
if (!is_identical)
|
if (!is_identical)
|
||||||
uprintf(" File name sanitized to '%s'", psz_sanpath);
|
uprintf(" File name sanitized to '%s'", psz_sanpath);
|
||||||
if (is_symlink) {
|
if (is_symlink) {
|
||||||
if (i_file_length == 0)
|
if (file_length == 0)
|
||||||
uprintf(" Ignoring Rock Ridge symbolic link to '%s'", p_statbuf->rr.psz_symlink);
|
uprintf(" Ignoring Rock Ridge symbolic link to '%s'", p_statbuf->rr.psz_symlink);
|
||||||
safe_free(p_statbuf->rr.psz_symlink);
|
safe_free(p_statbuf->rr.psz_symlink);
|
||||||
}
|
}
|
||||||
|
@ -587,8 +587,8 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path)
|
||||||
else
|
else
|
||||||
goto out;
|
goto out;
|
||||||
} else for (j=0; j<p_statbuf->extents; j++) {
|
} else for (j=0; j<p_statbuf->extents; j++) {
|
||||||
i_file_length = p_statbuf->size[j];
|
extent_length = p_statbuf->extsize[j];
|
||||||
for (i=0; i_file_length>0; i++) {
|
for (i=0; extent_length>0; i++) {
|
||||||
if (FormatStatus) goto out;
|
if (FormatStatus) goto out;
|
||||||
memset(buf, 0, ISO_BLOCKSIZE);
|
memset(buf, 0, ISO_BLOCKSIZE);
|
||||||
lsn = p_statbuf->lsn[j] + (lsn_t)i;
|
lsn = p_statbuf->lsn[j] + (lsn_t)i;
|
||||||
|
@ -597,13 +597,13 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path)
|
||||||
psz_iso_name, (long unsigned int)lsn);
|
psz_iso_name, (long unsigned int)lsn);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
buf_size = (DWORD)MIN(i_file_length, ISO_BLOCKSIZE);
|
buf_size = (DWORD)MIN(extent_length, ISO_BLOCKSIZE);
|
||||||
ISO_BLOCKING(r = WriteFileWithRetry(file_handle, buf, buf_size, &wr_size, WRITE_RETRIES));
|
ISO_BLOCKING(r = WriteFileWithRetry(file_handle, buf, buf_size, &wr_size, WRITE_RETRIES));
|
||||||
if (!r) {
|
if (!r) {
|
||||||
uprintf(" Error writing file: %s", WindowsErrorString());
|
uprintf(" Error writing file: %s", WindowsErrorString());
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
i_file_length -= ISO_BLOCKSIZE;
|
extent_length -= ISO_BLOCKSIZE;
|
||||||
if (nb_blocks++ % PROGRESS_THRESHOLD == 0)
|
if (nb_blocks++ % PROGRESS_THRESHOLD == 0)
|
||||||
UpdateProgress(OP_DOS, 100.0f*nb_blocks/total_blocks);
|
UpdateProgress(OP_DOS, 100.0f*nb_blocks/total_blocks);
|
||||||
}
|
}
|
||||||
|
@ -623,7 +623,7 @@ static int iso_extract_files(iso9660_t* p_iso, const char *psz_path)
|
||||||
|
|
||||||
out:
|
out:
|
||||||
ISO_BLOCKING(safe_closehandle(file_handle));
|
ISO_BLOCKING(safe_closehandle(file_handle));
|
||||||
_cdio_list_free(p_entlist, true);
|
iso9660_filelist_free(p_entlist);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -738,7 +738,7 @@ try_iso:
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
uprintf("%sImage is an ISO9660 image", spacing);
|
uprintf("%sImage is an ISO9660 image", spacing);
|
||||||
i_joliet_level = iso9660_ifs_get_joliet_level(p_iso);
|
joliet_level = iso9660_ifs_get_joliet_level(p_iso);
|
||||||
if (scan_only) {
|
if (scan_only) {
|
||||||
if (iso9660_ifs_get_volume_id(p_iso, &tmp)) {
|
if (iso9660_ifs_get_volume_id(p_iso, &tmp)) {
|
||||||
static_strcpy(img_report.label, tmp);
|
static_strcpy(img_report.label, tmp);
|
||||||
|
@ -949,7 +949,7 @@ int64_t ExtractISOFile(const char* iso, const char* iso_file, const char* dest_f
|
||||||
{
|
{
|
||||||
size_t i, j;
|
size_t i, j;
|
||||||
ssize_t read_size;
|
ssize_t read_size;
|
||||||
int64_t file_length, r = 0;
|
int64_t file_length, extent_length, r = 0;
|
||||||
char buf[UDF_BLOCKSIZE];
|
char buf[UDF_BLOCKSIZE];
|
||||||
DWORD buf_size, wr_size;
|
DWORD buf_size, wr_size;
|
||||||
iso9660_t* p_iso = NULL;
|
iso9660_t* p_iso = NULL;
|
||||||
|
@ -1013,20 +1013,20 @@ try_iso:
|
||||||
}
|
}
|
||||||
|
|
||||||
for (j = 0; j < p_statbuf->extents; j++) {
|
for (j = 0; j < p_statbuf->extents; j++) {
|
||||||
file_length = p_statbuf->size[j];
|
extent_length = p_statbuf->extsize[j];
|
||||||
for (i = 0; file_length > 0; i++) {
|
for (i = 0; extent_length > 0; i++) {
|
||||||
memset(buf, 0, ISO_BLOCKSIZE);
|
memset(buf, 0, ISO_BLOCKSIZE);
|
||||||
lsn = p_statbuf->lsn[j] + (lsn_t)i;
|
lsn = p_statbuf->lsn[j] + (lsn_t)i;
|
||||||
if (iso9660_iso_seek_read(p_iso, buf, lsn, 1) != ISO_BLOCKSIZE) {
|
if (iso9660_iso_seek_read(p_iso, buf, lsn, 1) != ISO_BLOCKSIZE) {
|
||||||
uprintf(" Error reading ISO9660 file %s at LSN %lu", iso_file, (long unsigned int)lsn);
|
uprintf(" Error reading ISO9660 file %s at LSN %lu", iso_file, (long unsigned int)lsn);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
buf_size = (DWORD)MIN(file_length, ISO_BLOCKSIZE);
|
buf_size = (DWORD)MIN(extent_length, ISO_BLOCKSIZE);
|
||||||
if (!WriteFileWithRetry(file_handle, buf, buf_size, &wr_size, WRITE_RETRIES)) {
|
if (!WriteFileWithRetry(file_handle, buf, buf_size, &wr_size, WRITE_RETRIES)) {
|
||||||
uprintf(" Error writing file %s: %s", dest_file, WindowsErrorString());
|
uprintf(" Error writing file %s: %s", dest_file, WindowsErrorString());
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
file_length -= ISO_BLOCKSIZE;
|
extent_length -= ISO_BLOCKSIZE;
|
||||||
r += ISO_BLOCKSIZE;
|
r += ISO_BLOCKSIZE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -171,6 +171,20 @@ to_723(uint16_t i)
|
||||||
static CDIO_INLINE uint16_t
|
static CDIO_INLINE uint16_t
|
||||||
from_723 (uint32_t p)
|
from_723 (uint32_t p)
|
||||||
{
|
{
|
||||||
|
uint8_t *u = (uint8_t *) &p;
|
||||||
|
/* Return the little-endian part always, to handle non-specs-compliant images */
|
||||||
|
return (u[0] | (u[1] << 8));
|
||||||
|
}
|
||||||
|
|
||||||
|
static CDIO_INLINE uint16_t
|
||||||
|
from_723_with_err (uint32_t p, bool *err)
|
||||||
|
{
|
||||||
|
if (uint32_swap_le_be (p) != p) {
|
||||||
|
cdio_warn ("from_723: broken byte order");
|
||||||
|
*err = true;
|
||||||
|
} else {
|
||||||
|
*err = false;
|
||||||
|
}
|
||||||
return (0xFFFF & p);
|
return (0xFFFF & p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -197,7 +211,9 @@ to_733(uint32_t i)
|
||||||
static CDIO_INLINE uint32_t
|
static CDIO_INLINE uint32_t
|
||||||
from_733 (uint64_t p)
|
from_733 (uint64_t p)
|
||||||
{
|
{
|
||||||
return (UINT32_C(0xFFFFFFFF) & p);
|
uint8_t *u = (uint8_t *) &p;
|
||||||
|
/* Return the little-endian part always, to handle non-specs-compliant images */
|
||||||
|
return (u[0] | (u[1] << 8) | (u[2] << 16) | (u[3] << 24));
|
||||||
}
|
}
|
||||||
|
|
||||||
static CDIO_INLINE uint32_t
|
static CDIO_INLINE uint32_t
|
||||||
|
|
|
@ -1,2 +1,337 @@
|
||||||
/* Placeholder */
|
/*
|
||||||
|
Copyright (C) 2004, 2005, 2008, 2012 Rocky Bernstein <rocky@gnu.org>
|
||||||
|
adapted from cuetools
|
||||||
|
Copyright (C) 2003 Svend Sanjay Sorensen <ssorensen@fastmail.fm>
|
||||||
|
|
||||||
|
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 3 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, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
/*!
|
||||||
|
* \file cdtext.h
|
||||||
|
*
|
||||||
|
* \brief The top-level header for CD-Text information. Applications
|
||||||
|
* include this for CD-Text access.
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef CDIO_CDTEXT_H_
|
||||||
|
#define CDIO_CDTEXT_H_
|
||||||
|
|
||||||
|
#include <cdio/types.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#define MIN_CDTEXT_FIELD 0
|
||||||
|
#define MAX_CDTEXT_FIELDS 10
|
||||||
|
|
||||||
|
/*! Enumeration of CD-TEXT text fields. */
|
||||||
|
typedef enum {
|
||||||
|
CDTEXT_FIELD_TITLE = 0, /**< title of album name or track titles */
|
||||||
|
CDTEXT_FIELD_PERFORMER = 1, /**< name(s) of the performer(s) */
|
||||||
|
CDTEXT_FIELD_SONGWRITER = 2, /**< name(s) of the songwriter(s) */
|
||||||
|
CDTEXT_FIELD_COMPOSER = 3, /**< name(s) of the composer(s) */
|
||||||
|
CDTEXT_FIELD_MESSAGE = 4, /**< message(s) from content provider or artist, ISO-8859-1 encoded*/
|
||||||
|
CDTEXT_FIELD_ARRANGER = 5, /**< name(s) of the arranger(s) */
|
||||||
|
CDTEXT_FIELD_ISRC = 6, /**< ISRC code of each track */
|
||||||
|
CDTEXT_FIELD_UPC_EAN = 7, /**< upc/european article number of disc, ISO-8859-1 encoded */
|
||||||
|
CDTEXT_FIELD_GENRE = 8, /**< genre identification and genre information, ASCII encoded */
|
||||||
|
CDTEXT_FIELD_DISCID = 9, /**< disc identification, ASCII encoded (may be non-printable) */
|
||||||
|
CDTEXT_FIELD_INVALID = MAX_CDTEXT_FIELDS /**< INVALID FIELD*/
|
||||||
|
} cdtext_field_t;
|
||||||
|
|
||||||
|
/*! Enumeration of possible genre codes. */
|
||||||
|
typedef enum {
|
||||||
|
CDTEXT_GENRE_UNUSED = 0, /**< field is not used. default */
|
||||||
|
CDTEXT_GENRE_UNDEFINED = 1, /**< not defined */
|
||||||
|
CDTEXT_GENRE_ADULT_CONTEMP = 2, /**< Adult Contemporary */
|
||||||
|
CDTEXT_GENRE_ALT_ROCK = 3, /**< Alternative Rock */
|
||||||
|
CDTEXT_GENRE_CHILDRENS = 4, /**< Childrens Music */
|
||||||
|
CDTEXT_GENRE_CLASSIC = 5, /**< Classical */
|
||||||
|
CDTEXT_GENRE_CHRIST_CONTEMP = 6, /**< Contemporary Christian */
|
||||||
|
CDTEXT_GENRE_COUNTRY = 7, /**< Country */
|
||||||
|
CDTEXT_GENRE_DANCE = 8, /**< Dance */
|
||||||
|
CDTEXT_GENRE_EASY_LISTENING = 9, /**< Easy Listening */
|
||||||
|
CDTEXT_GENRE_EROTIC = 10, /**< Erotic */
|
||||||
|
CDTEXT_GENRE_FOLK = 11, /**< Folk */
|
||||||
|
CDTEXT_GENRE_GOSPEL = 12, /**< Gospel */
|
||||||
|
CDTEXT_GENRE_HIPHOP = 13, /**< Hip Hop */
|
||||||
|
CDTEXT_GENRE_JAZZ = 14, /**< Jazz */
|
||||||
|
CDTEXT_GENRE_LATIN = 15, /**< Latin */
|
||||||
|
CDTEXT_GENRE_MUSICAL = 16, /**< Musical */
|
||||||
|
CDTEXT_GENRE_NEWAGE = 17, /**< New Age */
|
||||||
|
CDTEXT_GENRE_OPERA = 18, /**< Opera */
|
||||||
|
CDTEXT_GENRE_OPERETTA = 19, /**< Operetta */
|
||||||
|
CDTEXT_GENRE_POP = 20, /**< Pop Music */
|
||||||
|
CDTEXT_GENRE_RAP = 21, /**< RAP */
|
||||||
|
CDTEXT_GENRE_REGGAE = 22, /**< Reggae */
|
||||||
|
CDTEXT_GENRE_ROCK = 23, /**< Rock Music */
|
||||||
|
CDTEXT_GENRE_RYTHMANDBLUES = 24, /**< Rhythm & Blues */
|
||||||
|
CDTEXT_GENRE_SOUNDEFFECTS = 25, /**< Sound Effects */
|
||||||
|
CDTEXT_GENRE_SOUNDTRACK = 26, /**< Soundtrack */
|
||||||
|
CDTEXT_GENRE_SPOKEN_WORD = 27, /**< Spoken Word */
|
||||||
|
CDTEXT_GENRE_WORLD_MUSIC = 28 /**< World Music */
|
||||||
|
} cdtext_genre_t;
|
||||||
|
|
||||||
|
/*! Enumeration of possible CD-TEXT languages.
|
||||||
|
*
|
||||||
|
* The language code is encoded as specified in ANNEX 1 to part 5 of EBU
|
||||||
|
* Tech 32 58 -E (1991).
|
||||||
|
*/
|
||||||
|
typedef enum {
|
||||||
|
CDTEXT_LANGUAGE_UNKNOWN = 0x00,
|
||||||
|
CDTEXT_LANGUAGE_ALBANIAN = 0x01,
|
||||||
|
CDTEXT_LANGUAGE_BRETON = 0x02,
|
||||||
|
CDTEXT_LANGUAGE_CATALAN = 0x03,
|
||||||
|
CDTEXT_LANGUAGE_CROATIAN = 0x04,
|
||||||
|
CDTEXT_LANGUAGE_WELSH = 0x05,
|
||||||
|
CDTEXT_LANGUAGE_CZECH = 0x06,
|
||||||
|
CDTEXT_LANGUAGE_DANISH = 0x07,
|
||||||
|
CDTEXT_LANGUAGE_GERMAN = 0x08,
|
||||||
|
CDTEXT_LANGUAGE_ENGLISH = 0x09,
|
||||||
|
CDTEXT_LANGUAGE_SPANISH = 0x0A,
|
||||||
|
CDTEXT_LANGUAGE_ESPERANTO = 0x0B,
|
||||||
|
CDTEXT_LANGUAGE_ESTONIAN = 0x0C,
|
||||||
|
CDTEXT_LANGUAGE_BASQUE = 0x0D,
|
||||||
|
CDTEXT_LANGUAGE_FAROESE = 0x0E,
|
||||||
|
CDTEXT_LANGUAGE_FRENCH = 0x0F,
|
||||||
|
CDTEXT_LANGUAGE_FRISIAN = 0x10,
|
||||||
|
CDTEXT_LANGUAGE_IRISH = 0x11,
|
||||||
|
CDTEXT_LANGUAGE_GAELIC = 0x12,
|
||||||
|
CDTEXT_LANGUAGE_GALICIAN = 0x13,
|
||||||
|
CDTEXT_LANGUAGE_ICELANDIC = 0x14,
|
||||||
|
CDTEXT_LANGUAGE_ITALIAN = 0x15,
|
||||||
|
CDTEXT_LANGUAGE_LAPPISH = 0x16,
|
||||||
|
CDTEXT_LANGUAGE_LATIN = 0x17,
|
||||||
|
CDTEXT_LANGUAGE_LATVIAN = 0x18,
|
||||||
|
CDTEXT_LANGUAGE_LUXEMBOURGIAN = 0x19,
|
||||||
|
CDTEXT_LANGUAGE_LITHUANIAN = 0x1A,
|
||||||
|
CDTEXT_LANGUAGE_HUNGARIAN = 0x1B,
|
||||||
|
CDTEXT_LANGUAGE_MALTESE = 0x1C,
|
||||||
|
CDTEXT_LANGUAGE_DUTCH = 0x1D,
|
||||||
|
CDTEXT_LANGUAGE_NORWEGIAN = 0x1E,
|
||||||
|
CDTEXT_LANGUAGE_OCCITAN = 0x1F,
|
||||||
|
CDTEXT_LANGUAGE_POLISH = 0x20,
|
||||||
|
CDTEXT_LANGUAGE_PORTUGUESE = 0x21,
|
||||||
|
CDTEXT_LANGUAGE_ROMANIAN = 0x22,
|
||||||
|
CDTEXT_LANGUAGE_ROMANSH = 0x23,
|
||||||
|
CDTEXT_LANGUAGE_SERBIAN = 0x24,
|
||||||
|
CDTEXT_LANGUAGE_SLOVAK = 0x25,
|
||||||
|
CDTEXT_LANGUAGE_SLOVENIAN = 0x26,
|
||||||
|
CDTEXT_LANGUAGE_FINNISH = 0x27,
|
||||||
|
CDTEXT_LANGUAGE_SWEDISH = 0x28,
|
||||||
|
CDTEXT_LANGUAGE_TURKISH = 0x29,
|
||||||
|
CDTEXT_LANGUAGE_FLEMISH = 0x2A,
|
||||||
|
CDTEXT_LANGUAGE_WALLON = 0x2B,
|
||||||
|
CDTEXT_LANGUAGE_ZULU = 0x45,
|
||||||
|
CDTEXT_LANGUAGE_VIETNAMESE = 0x46,
|
||||||
|
CDTEXT_LANGUAGE_UZBEK = 0x47,
|
||||||
|
CDTEXT_LANGUAGE_URDU = 0x48,
|
||||||
|
CDTEXT_LANGUAGE_UKRAINIAN = 0x49,
|
||||||
|
CDTEXT_LANGUAGE_THAI = 0x4A,
|
||||||
|
CDTEXT_LANGUAGE_TELUGU = 0x4B,
|
||||||
|
CDTEXT_LANGUAGE_TATAR = 0x4C,
|
||||||
|
CDTEXT_LANGUAGE_TAMIL = 0x4D,
|
||||||
|
CDTEXT_LANGUAGE_TADZHIK = 0x4E,
|
||||||
|
CDTEXT_LANGUAGE_SWAHILI = 0x4F,
|
||||||
|
CDTEXT_LANGUAGE_SRANANTONGO = 0x50,
|
||||||
|
CDTEXT_LANGUAGE_SOMALI = 0x51,
|
||||||
|
CDTEXT_LANGUAGE_SINHALESE = 0x52,
|
||||||
|
CDTEXT_LANGUAGE_SHONA = 0x53,
|
||||||
|
CDTEXT_LANGUAGE_SERBO_CROAT = 0x54,
|
||||||
|
CDTEXT_LANGUAGE_RUTHENIAN = 0x55,
|
||||||
|
CDTEXT_LANGUAGE_RUSSIAN = 0x56,
|
||||||
|
CDTEXT_LANGUAGE_QUECHUA = 0x57,
|
||||||
|
CDTEXT_LANGUAGE_PUSHTU = 0x58,
|
||||||
|
CDTEXT_LANGUAGE_PUNJABI = 0x59,
|
||||||
|
CDTEXT_LANGUAGE_PERSIAN = 0x5A,
|
||||||
|
CDTEXT_LANGUAGE_PAPAMIENTO = 0x5B,
|
||||||
|
CDTEXT_LANGUAGE_ORIYA = 0x5C,
|
||||||
|
CDTEXT_LANGUAGE_NEPALI = 0x5D,
|
||||||
|
CDTEXT_LANGUAGE_NDEBELE = 0x5E,
|
||||||
|
CDTEXT_LANGUAGE_MARATHI = 0x5F,
|
||||||
|
CDTEXT_LANGUAGE_MOLDAVIAN = 0x60,
|
||||||
|
CDTEXT_LANGUAGE_MALAYSIAN = 0x61,
|
||||||
|
CDTEXT_LANGUAGE_MALAGASAY = 0x62,
|
||||||
|
CDTEXT_LANGUAGE_MACEDONIAN = 0x63,
|
||||||
|
CDTEXT_LANGUAGE_LAOTIAN = 0x64,
|
||||||
|
CDTEXT_LANGUAGE_KOREAN = 0x65,
|
||||||
|
CDTEXT_LANGUAGE_KHMER = 0x66,
|
||||||
|
CDTEXT_LANGUAGE_KAZAKH = 0x67,
|
||||||
|
CDTEXT_LANGUAGE_KANNADA = 0x68,
|
||||||
|
CDTEXT_LANGUAGE_JAPANESE = 0x69,
|
||||||
|
CDTEXT_LANGUAGE_INDONESIAN = 0x6A,
|
||||||
|
CDTEXT_LANGUAGE_HINDI = 0x6B,
|
||||||
|
CDTEXT_LANGUAGE_HEBREW = 0x6C,
|
||||||
|
CDTEXT_LANGUAGE_HAUSA = 0x6D,
|
||||||
|
CDTEXT_LANGUAGE_GURANI = 0x6E,
|
||||||
|
CDTEXT_LANGUAGE_GUJURATI = 0x6F,
|
||||||
|
CDTEXT_LANGUAGE_GREEK = 0x70,
|
||||||
|
CDTEXT_LANGUAGE_GEORGIAN = 0x71,
|
||||||
|
CDTEXT_LANGUAGE_FULANI = 0x72,
|
||||||
|
CDTEXT_LANGUAGE_DARI = 0x73,
|
||||||
|
CDTEXT_LANGUAGE_CHURASH = 0x74,
|
||||||
|
CDTEXT_LANGUAGE_CHINESE = 0x75,
|
||||||
|
CDTEXT_LANGUAGE_BURMESE = 0x76,
|
||||||
|
CDTEXT_LANGUAGE_BULGARIAN = 0x77,
|
||||||
|
CDTEXT_LANGUAGE_BENGALI = 0x78,
|
||||||
|
CDTEXT_LANGUAGE_BIELORUSSIAN = 0x79,
|
||||||
|
CDTEXT_LANGUAGE_BAMBORA = 0x7A,
|
||||||
|
CDTEXT_LANGUAGE_AZERBAIJANI = 0x7B,
|
||||||
|
CDTEXT_LANGUAGE_ASSAMESE = 0x7C,
|
||||||
|
CDTEXT_LANGUAGE_ARMENIAN = 0x7D,
|
||||||
|
CDTEXT_LANGUAGE_ARABIC = 0x7E,
|
||||||
|
CDTEXT_LANGUAGE_AMHARIC = 0x7F
|
||||||
|
} cdtext_lang_t;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Opaque type for CD-Text.
|
||||||
|
*/
|
||||||
typedef struct cdtext_s cdtext_t;
|
typedef struct cdtext_s cdtext_t;
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Return string representation of the given genre code.
|
||||||
|
*/
|
||||||
|
const char *cdtext_genre2str (cdtext_genre_t i);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Return string representation of the given language code.
|
||||||
|
*/
|
||||||
|
const char *cdtext_lang2str (cdtext_lang_t i);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Return string representation of given field type.
|
||||||
|
*/
|
||||||
|
const char *cdtext_field2str (cdtext_field_t i);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Initialize a new cdtext structure.
|
||||||
|
|
||||||
|
When the structure is no longer needed, release the
|
||||||
|
resources using cdtext_delete.
|
||||||
|
*/
|
||||||
|
cdtext_t *cdtext_init (void);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Read a binary CD-TEXT and fill a cdtext struct.
|
||||||
|
|
||||||
|
@param p_cdtext the CD-TEXT object
|
||||||
|
@param wdata the data
|
||||||
|
@param i_data size of wdata
|
||||||
|
|
||||||
|
@returns 0 on success, non-zero on failure
|
||||||
|
*/
|
||||||
|
int cdtext_data_init(cdtext_t *p_cdtext, uint8_t *wdata, size_t i_data);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Free memory associated with the given cdtext_t object.
|
||||||
|
|
||||||
|
@param p_cdtext the CD-TEXT object
|
||||||
|
*/
|
||||||
|
void cdtext_destroy (cdtext_t *p_cdtext);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Returns a copy of the return value of cdtext_get_const or NULL.
|
||||||
|
|
||||||
|
Must be freed using cdio_free() when done.
|
||||||
|
@see cdtext_get_const
|
||||||
|
*/
|
||||||
|
char *cdtext_get (const cdtext_t *p_cdtext, cdtext_field_t key, track_t track);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Returns value of the given field.
|
||||||
|
|
||||||
|
NULL is returned if key is CDTEXT_INVALID or the field is not set.
|
||||||
|
Strings are encoded in UTF-8.
|
||||||
|
|
||||||
|
@param p_cdtext the CD-TEXT object
|
||||||
|
@param field type of the field to return
|
||||||
|
@param track specifies the track, 0 stands for disc
|
||||||
|
*/
|
||||||
|
const char *cdtext_get_const (const cdtext_t *p_cdtext, cdtext_field_t field,
|
||||||
|
track_t track);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Returns the discs genre code.
|
||||||
|
|
||||||
|
@param p_cdtext the CD-TEXT object
|
||||||
|
*/
|
||||||
|
cdtext_genre_t cdtext_get_genre (const cdtext_t *p_cdtext);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Returns the currently active language.
|
||||||
|
|
||||||
|
@param p_cdtext the CD-TEXT object
|
||||||
|
*/
|
||||||
|
cdtext_lang_t cdtext_get_language (const cdtext_t *p_cdtext);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Returns the first track number.
|
||||||
|
|
||||||
|
@param p_cdtext the CD-TEXT object
|
||||||
|
*/
|
||||||
|
track_t cdtext_get_first_track(const cdtext_t *p_cdtext);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Returns the last track number.
|
||||||
|
|
||||||
|
@param p_cdtext the CD-TEXT object
|
||||||
|
*/
|
||||||
|
track_t cdtext_get_last_track(const cdtext_t *p_cdtext);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Try to select the given language.
|
||||||
|
|
||||||
|
@param p_cdtext the CD-TEXT object
|
||||||
|
@param language string representation of the language
|
||||||
|
|
||||||
|
@return true on success, false if language is not available
|
||||||
|
*/
|
||||||
|
bool cdtext_select_language(cdtext_t *p_cdtext, cdtext_lang_t language);
|
||||||
|
|
||||||
|
/*
|
||||||
|
Returns a list of available languages or NULL.
|
||||||
|
|
||||||
|
Internally the list is stored in a static array.
|
||||||
|
|
||||||
|
@param p_cdtext the CD-TEXT object
|
||||||
|
*/
|
||||||
|
cdtext_lang_t *cdtext_list_languages (const cdtext_t *p_cdtext);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Sets the given field at the given track to the given value.
|
||||||
|
|
||||||
|
Recodes to UTF-8 if charset is not NULL.
|
||||||
|
|
||||||
|
@param p_cdtext the CD-TEXT object
|
||||||
|
@param key field to set
|
||||||
|
@param value value to set
|
||||||
|
@param track track to work on
|
||||||
|
@param charset charset to convert from
|
||||||
|
*/
|
||||||
|
void cdtext_set (cdtext_t *p_cdtext, cdtext_field_t key, const uint8_t *value, track_t track, const char *charset);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
|
#endif /* CDIO_CDTEXT_H_ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Local variables:
|
||||||
|
* c-file-style: "gnu"
|
||||||
|
* tab-width: 8
|
||||||
|
* indent-tabs-mode: nil
|
||||||
|
* End:
|
||||||
|
*/
|
||||||
|
|
|
@ -152,13 +152,11 @@ extern "C" {
|
||||||
DRIVER_UNKNOWN, /**< Used as input when we don't care what kind
|
DRIVER_UNKNOWN, /**< Used as input when we don't care what kind
|
||||||
of driver to use. */
|
of driver to use. */
|
||||||
DRIVER_AIX, /**< AIX driver */
|
DRIVER_AIX, /**< AIX driver */
|
||||||
DRIVER_BSDI, /**< BSDI driver */
|
|
||||||
DRIVER_FREEBSD, /**< FreeBSD driver - includes CAM and ioctl access */
|
DRIVER_FREEBSD, /**< FreeBSD driver - includes CAM and ioctl access */
|
||||||
DRIVER_NETBSD, /**< NetBSD Driver. */
|
DRIVER_NETBSD, /**< NetBSD Driver. */
|
||||||
DRIVER_LINUX, /**< GNU/Linux Driver */
|
DRIVER_LINUX, /**< GNU/Linux Driver */
|
||||||
DRIVER_SOLARIS, /**< Sun Solaris Driver */
|
DRIVER_SOLARIS, /**< Sun Solaris Driver */
|
||||||
DRIVER_OS2, /**< IBM OS/2 Driver */
|
DRIVER_OSX, /**< Apple OSX (or MacOS) Driver */
|
||||||
DRIVER_OSX, /**< Apple OSX Driver */
|
|
||||||
DRIVER_WIN32, /**< Microsoft Windows Driver. Includes ASPI and
|
DRIVER_WIN32, /**< Microsoft Windows Driver. Includes ASPI and
|
||||||
ioctl access. */
|
ioctl access. */
|
||||||
DRIVER_CDRDAO, /**< cdrdao format CD image. This is listed
|
DRIVER_CDRDAO, /**< cdrdao format CD image. This is listed
|
||||||
|
@ -192,18 +190,6 @@ extern "C" {
|
||||||
extern const driver_id_t cdio_os_driver;
|
extern const driver_id_t cdio_os_driver;
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Those are deprecated; use cdio_drivers or cdio_device_drivers to
|
|
||||||
iterate over all drivers or only the device drivers.
|
|
||||||
Make sure what's listed for CDIO_MIN_DRIVER is the last
|
|
||||||
enumeration in driver_id_t. Since we have a bogus (but useful) 0th
|
|
||||||
entry above we don't have to add one.
|
|
||||||
*/
|
|
||||||
LIBCDIO_DEPRECATED(static const driver_id_t CDIO_MIN_DRIVER, "please use cdio_drivers") = DRIVER_AIX;
|
|
||||||
LIBCDIO_DEPRECATED(static const driver_id_t CDIO_MIN_DEVICE_DRIVER, "please use cdio_device_drivers") = DRIVER_AIX;
|
|
||||||
LIBCDIO_DEPRECATED(static const driver_id_t CDIO_MAX_DRIVER, "please use cdio_drivers") = DRIVER_NRG;
|
|
||||||
LIBCDIO_DEPRECATED(static const driver_id_t CDIO_MAX_DEVICE_DRIVER, "please use cdio_device_drivers") = DRIVER_WIN32;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
The following are status codes for completion of a given cdio
|
The following are status codes for completion of a given cdio
|
||||||
operation. By design 0 is successful completion and -1 is error
|
operation. By design 0 is successful completion and -1 is error
|
||||||
|
|
|
@ -1,7 +1,5 @@
|
||||||
/*
|
/*
|
||||||
$Id: ds.h,v 1.5 2008/03/25 15:59:09 karl Exp $
|
Copyright (C) 2005, 2008, 2017 Rocky Bernstein <rocky@gnu.org>
|
||||||
|
|
||||||
Copyright (C) 2005, 2008 Rocky Bernstein <rocky@gnu.org>
|
|
||||||
Copyright (C) 2000, 2004 Herbert Valerio Riedel <hvr@gnu.org>
|
Copyright (C) 2000, 2004 Herbert Valerio Riedel <hvr@gnu.org>
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
@ -18,11 +16,11 @@
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/** \file ds.h
|
/** \file ds.h
|
||||||
* \brief The top-level header for list-related data structures.
|
* \brief The top-level header for list-related data structures.
|
||||||
|
|
||||||
Note: this header will is slated to get removed and libcdio will use
|
Note: this header will is slated to get removed and libcdio will use
|
||||||
glib.h routines instead.
|
glib.h routines instead.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
@ -38,13 +36,6 @@ typedef struct _CdioListNode CdioListNode_t;
|
||||||
typedef int (*_cdio_list_cmp_func_t) (void *p_data1, void *p_data2);
|
typedef int (*_cdio_list_cmp_func_t) (void *p_data1, void *p_data2);
|
||||||
typedef int (*_cdio_list_iterfunc_t) (void *p_data, void *p_user_data);
|
typedef int (*_cdio_list_iterfunc_t) (void *p_data, void *p_user_data);
|
||||||
|
|
||||||
/** The below are given compatibility with old code. Please use
|
|
||||||
the above type names, not these. */
|
|
||||||
#define CdioList CdioList_t
|
|
||||||
#define CdioListNode CdioListNode_t
|
|
||||||
#define _cdio_list_cmp_func _cdio_list_cmp_func_t
|
|
||||||
#define _cdio_list_iterfunc _cdio_list_iterfunc_t
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
@ -52,7 +43,7 @@ extern "C" {
|
||||||
/** methods */
|
/** methods */
|
||||||
CdioList_t *_cdio_list_new (void);
|
CdioList_t *_cdio_list_new (void);
|
||||||
|
|
||||||
void _cdio_list_free (CdioList_t *p_list, int free_data);
|
void _cdio_list_free (CdioList_t *p_list, int free_data, CdioDataFree_t free_fn);
|
||||||
|
|
||||||
unsigned _cdio_list_length (const CdioList_t *list);
|
unsigned _cdio_list_length (const CdioList_t *list);
|
||||||
|
|
||||||
|
@ -60,11 +51,11 @@ void _cdio_list_prepend (CdioList_t *p_list, void *p_data);
|
||||||
|
|
||||||
void _cdio_list_append (CdioList_t *p_list, void *p_data);
|
void _cdio_list_append (CdioList_t *p_list, void *p_data);
|
||||||
|
|
||||||
void _cdio_list_foreach (CdioList_t *p_list, _cdio_list_iterfunc_t func,
|
void _cdio_list_foreach (CdioList_t *p_list, _cdio_list_iterfunc_t func,
|
||||||
void *p_user_data);
|
void *p_user_data);
|
||||||
|
|
||||||
CdioListNode_t *_cdio_list_find (CdioList_t *p_list,
|
CdioListNode_t *_cdio_list_find (CdioList_t *p_list,
|
||||||
_cdio_list_iterfunc_t cmp_func,
|
_cdio_list_iterfunc_t cmp_func,
|
||||||
void *p_user_data);
|
void *p_user_data);
|
||||||
|
|
||||||
#define _CDIO_LIST_FOREACH(node, list) \
|
#define _CDIO_LIST_FOREACH(node, list) \
|
||||||
|
@ -78,7 +69,8 @@ CdioListNode_t *_cdio_list_end (CdioList_t *p_list);
|
||||||
|
|
||||||
CdioListNode_t *_cdio_list_node_next (CdioListNode_t *p_node);
|
CdioListNode_t *_cdio_list_node_next (CdioListNode_t *p_node);
|
||||||
|
|
||||||
void _cdio_list_node_free (CdioListNode_t *p_node, int i_free_data);
|
void _cdio_list_node_free (CdioListNode_t *p_node, int i_free_data,
|
||||||
|
CdioDataFree_t free_fn);
|
||||||
|
|
||||||
void *_cdio_list_node_data (CdioListNode_t *p_node);
|
void *_cdio_list_node_data (CdioListNode_t *p_node);
|
||||||
|
|
||||||
|
@ -88,11 +80,10 @@ void *_cdio_list_node_data (CdioListNode_t *p_node);
|
||||||
|
|
||||||
#endif /* CDIO_DS_H_ */
|
#endif /* CDIO_DS_H_ */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Local variables:
|
* Local variables:
|
||||||
* c-file-style: "gnu"
|
* c-file-style: "gnu"
|
||||||
* tab-width: 8
|
* tab-width: 8
|
||||||
* indent-tabs-mode: nil
|
* indent-tabs-mode: nil
|
||||||
* End:
|
* End:
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright (C) 2003-2008, 2012-2013
|
Copyright (C) 2003-2008, 2012-2013, 2017
|
||||||
Rocky Bernstein <rocky@gnu.org>
|
Rocky Bernstein <rocky@gnu.org>
|
||||||
Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org>
|
Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org>
|
||||||
|
|
||||||
|
@ -509,6 +509,18 @@ typedef struct iso9660_svd_s iso9660_svd_t;
|
||||||
|
|
||||||
PRAGMA_END_PACKED
|
PRAGMA_END_PACKED
|
||||||
|
|
||||||
|
/*! \brief A data type for a list of ISO9660
|
||||||
|
statbuf file pointers returned from the various
|
||||||
|
Cdio iso9660 readdir routines.
|
||||||
|
*/
|
||||||
|
typedef CdioList_t CdioISO9660FileList_t;
|
||||||
|
|
||||||
|
/*! \brief A data type for a list of ISO9660
|
||||||
|
statbuf drectory pointer returned from the variious
|
||||||
|
Cdio iso9660 readdir routines.
|
||||||
|
*/
|
||||||
|
typedef CdioList_t CdioISO9660DirList_t;
|
||||||
|
|
||||||
/*! \brief Unix stat-like version of iso9660_dir
|
/*! \brief Unix stat-like version of iso9660_dir
|
||||||
|
|
||||||
The iso9660_stat structure is not part of the ISO-9660
|
The iso9660_stat structure is not part of the ISO-9660
|
||||||
|
@ -524,11 +536,14 @@ struct iso9660_stat_s { /* big endian!! */
|
||||||
|
|
||||||
struct tm tm; /**< time on entry - FIXME merge with
|
struct tm tm; /**< time on entry - FIXME merge with
|
||||||
one of entries above, like ctime? */
|
one of entries above, like ctime? */
|
||||||
uint64_t total_size; /**< total size in bytes */
|
uint64_t size; /**< total size in bytes */
|
||||||
uint8_t extents; /**< number of multiextents */
|
uint8_t extents; /**< number of multiextents */
|
||||||
lsn_t lsn[ISO_MAX_MULTIEXTENT]; /**< start logical sector number for each extent */
|
/**⌵ start logical sector number for each extent */
|
||||||
uint32_t size[ISO_MAX_MULTIEXTENT]; /**< size of each extent */
|
lsn_t lsn[ISO_MAX_MULTIEXTENT];
|
||||||
uint32_t secsize[ISO_MAX_MULTIEXTENT]; /**< number of sectors allocated for each extent*/
|
/**⌵ size of each extent */
|
||||||
|
uint32_t extsize[ISO_MAX_MULTIEXTENT];
|
||||||
|
/**⌵ number of sectors allocated for each extent */
|
||||||
|
uint32_t secsize[ISO_MAX_MULTIEXTENT];
|
||||||
iso9660_xa_t xa; /**< XA attributes */
|
iso9660_xa_t xa; /**< XA attributes */
|
||||||
enum { _STAT_FILE = 1, _STAT_DIR = 2 } type;
|
enum { _STAT_FILE = 1, _STAT_DIR = 2 } type;
|
||||||
bool b_xa;
|
bool b_xa;
|
||||||
|
@ -568,8 +583,11 @@ typedef struct _iso9660_s iso9660_t;
|
||||||
associated with the image. Call this when done using using an ISO
|
associated with the image. Call this when done using using an ISO
|
||||||
9660 image.
|
9660 image.
|
||||||
|
|
||||||
|
@param p_iso the ISO-9660 file image to get data from
|
||||||
|
|
||||||
@return true is unconditionally returned. If there was an error
|
@return true is unconditionally returned. If there was an error
|
||||||
false would be returned.
|
false would be returned. Resources associated with p_iso are
|
||||||
|
freed.
|
||||||
*/
|
*/
|
||||||
bool iso9660_close (iso9660_t * p_iso);
|
bool iso9660_close (iso9660_t * p_iso);
|
||||||
|
|
||||||
|
@ -577,6 +595,12 @@ typedef struct _iso9660_s iso9660_t;
|
||||||
/*!
|
/*!
|
||||||
Open an ISO 9660 image for reading. Maybe in the future we will have
|
Open an ISO 9660 image for reading. Maybe in the future we will have
|
||||||
a mode. NULL is returned on error.
|
a mode. NULL is returned on error.
|
||||||
|
|
||||||
|
@param psz_path full path of ISO9660 file.
|
||||||
|
|
||||||
|
|
||||||
|
@return a IS9660 structure is unconditionally returned. The caller
|
||||||
|
should call iso9660_close() when done.
|
||||||
*/
|
*/
|
||||||
iso9660_t *iso9660_open (const char *psz_path /*flags, mode */);
|
iso9660_t *iso9660_open (const char *psz_path /*flags, mode */);
|
||||||
|
|
||||||
|
@ -863,6 +887,8 @@ iso9660_dir_calc_record_size (unsigned int namelen, unsigned int su_len);
|
||||||
Given a directory pointer, find the filesystem entry that contains
|
Given a directory pointer, find the filesystem entry that contains
|
||||||
lsn and return information about it.
|
lsn and return information about it.
|
||||||
|
|
||||||
|
@param p_cdio the CD object to read from
|
||||||
|
|
||||||
@return stat_t of entry if we found lsn, or NULL otherwise.
|
@return stat_t of entry if we found lsn, or NULL otherwise.
|
||||||
Caller must free return value using iso9660_stat_free().
|
Caller must free return value using iso9660_stat_free().
|
||||||
*/
|
*/
|
||||||
|
@ -872,18 +898,31 @@ iso9660_stat_t *iso9660_fs_find_lsn(CdIo_t *p_cdio, lsn_t i_lsn);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Given a directory pointer, find the filesystem entry that contains
|
Given a directory pointer, find the filesystem entry that contains
|
||||||
lsn and return information about it.
|
LSN and return information about it.
|
||||||
|
|
||||||
|
@param p_cdio the ISO-9660 file image to get data from.
|
||||||
|
|
||||||
|
@param i_lsn the LSN to find
|
||||||
|
|
||||||
|
@param ppsz_full_filename the place to store the name of the path that has LSN.
|
||||||
|
On entry this should point to NULL. If not, the value will be freed.
|
||||||
|
On exit a value is malloc'd and the caller is responsible for
|
||||||
|
freeing the result.
|
||||||
|
|
||||||
@return stat_t of entry if we found lsn, or NULL otherwise.
|
@return stat_t of entry if we found lsn, or NULL otherwise.
|
||||||
Caller must free return value using iso9660_stat_free().
|
Caller must free return value using iso9660_stat_free().
|
||||||
*/
|
*/
|
||||||
iso9660_stat_t *iso9660_fs_find_lsn_with_path(CdIo_t *p_cdio, lsn_t i_lsn,
|
iso9660_stat_t *iso9660_fs_find_lsn_with_path(CdIo_t *p_cdio, lsn_t i_lsn,
|
||||||
/*out*/ char **ppsz_path);
|
/*out*/ char **ppsz_full_filename);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Given a directory pointer, find the filesystem entry that contains
|
Given a directory pointer, find the filesystem entry that contains
|
||||||
lsn and return information about it.
|
lsn and return information about it.
|
||||||
|
|
||||||
|
@param p_iso the ISO-9660 file image to get data from.
|
||||||
|
|
||||||
|
@param i_lsn the LSN to find
|
||||||
|
|
||||||
@return stat_t of entry if we found lsn, or NULL otherwise.
|
@return stat_t of entry if we found lsn, or NULL otherwise.
|
||||||
Caller must free return value using iso9660_stat_free().
|
Caller must free return value using iso9660_stat_free().
|
||||||
*/
|
*/
|
||||||
|
@ -895,7 +934,9 @@ iso9660_stat_t *iso9660_ifs_find_lsn(iso9660_t *p_iso, lsn_t i_lsn);
|
||||||
lsn and return information about it.
|
lsn and return information about it.
|
||||||
|
|
||||||
@param p_iso pointer to iso_t
|
@param p_iso pointer to iso_t
|
||||||
|
|
||||||
@param i_lsn LSN to find
|
@param i_lsn LSN to find
|
||||||
|
|
||||||
@param ppsz_path full path of lsn filename. On entry *ppsz_path should be
|
@param ppsz_path full path of lsn filename. On entry *ppsz_path should be
|
||||||
NULL. On return it will be allocated an point to the full path of the
|
NULL. On return it will be allocated an point to the full path of the
|
||||||
file at lsn or NULL if the lsn is not found. You should deallocate
|
file at lsn or NULL if the lsn is not found. You should deallocate
|
||||||
|
@ -910,6 +951,9 @@ iso9660_stat_t *iso9660_ifs_find_lsn_with_path(iso9660_t *p_iso,
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Free the passed iso9660_stat_t structure.
|
Free the passed iso9660_stat_t structure.
|
||||||
|
|
||||||
|
@param p_stat iso9660 stat buffer to free.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
void iso9660_stat_free(iso9660_stat_t *p_stat);
|
void iso9660_stat_free(iso9660_stat_t *p_stat);
|
||||||
|
|
||||||
|
@ -920,7 +964,9 @@ void iso9660_stat_free(iso9660_stat_t *p_stat);
|
||||||
|
|
||||||
@param psz_path filename path to look up and get information about
|
@param psz_path filename path to look up and get information about
|
||||||
|
|
||||||
@return ISO 9660 file information
|
@return ISO 9660 file information. The caller must free the returned
|
||||||
|
result using iso9660_stat_free().
|
||||||
|
|
||||||
|
|
||||||
Important note:
|
Important note:
|
||||||
|
|
||||||
|
@ -939,49 +985,123 @@ iso9660_stat_t *iso9660_fs_stat (CdIo_t *p_cdio, const char psz_path[]);
|
||||||
pathname version numbers in the ISO 9660 name are dropped, i.e. ;1
|
pathname version numbers in the ISO 9660 name are dropped, i.e. ;1
|
||||||
is removed and if level 1 ISO-9660 names are lowercased.
|
is removed and if level 1 ISO-9660 names are lowercased.
|
||||||
|
|
||||||
b_mode2 is historical. It is not used.
|
@param p_cdio the CD object to read from
|
||||||
|
|
||||||
|
@param psz_path filename path to look up and get information about
|
||||||
|
|
||||||
|
@return ISO 9660 file information. The caller must free the
|
||||||
|
returned result using iso9660_stat_free().
|
||||||
|
|
||||||
*/
|
*/
|
||||||
iso9660_stat_t *iso9660_fs_stat_translate (CdIo_t *p_cdio,
|
iso9660_stat_t *iso9660_fs_stat_translate (CdIo_t *p_cdio,
|
||||||
const char psz_path[],
|
const char psz_path[]);
|
||||||
bool b_mode2);
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Return file status for pathname. NULL is returned on error.
|
|
||||||
|
@param p_iso the ISO-9660 file image to get data from
|
||||||
|
|
||||||
|
@param psz_path path the look up
|
||||||
|
|
||||||
|
@return file status for pathname. NULL is returned on error.
|
||||||
|
The caller must free the returned result using iso9660_stat_free().
|
||||||
*/
|
*/
|
||||||
iso9660_stat_t *iso9660_ifs_stat (iso9660_t *p_iso, const char psz_path[]);
|
iso9660_stat_t *iso9660_ifs_stat (iso9660_t *p_iso, const char psz_path[]);
|
||||||
|
|
||||||
|
|
||||||
/*! Return file status for path name psz_path. NULL is returned on
|
/*!
|
||||||
|
@param p_iso the ISO-9660 file image to get data from
|
||||||
|
|
||||||
|
@param psz_path filename path translate
|
||||||
|
|
||||||
|
@return file status for path name psz_path. NULL is returned on
|
||||||
error. pathname version numbers in the ISO 9660 name are dropped,
|
error. pathname version numbers in the ISO 9660 name are dropped,
|
||||||
i.e. ;1 is removed and if level 1 ISO-9660 names are lowercased.
|
i.e. ;1 is removed and if level 1 ISO-9660 names are lowercased.
|
||||||
|
The caller must free the returned result using iso9660_stat_free().
|
||||||
*/
|
*/
|
||||||
iso9660_stat_t *iso9660_ifs_stat_translate (iso9660_t *p_iso,
|
iso9660_stat_t *iso9660_ifs_stat_translate (iso9660_t *p_iso,
|
||||||
const char psz_path[]);
|
const char psz_path[]);
|
||||||
|
|
||||||
/*! Read psz_path (a directory) and return a list of iso9660_stat_t
|
|
||||||
pointers for the files inside that directory. The caller must free the
|
|
||||||
returned result using _cdio_list_free().
|
|
||||||
|
|
||||||
b_mode2 is historical. It is not used.
|
/*!
|
||||||
|
Create a new data structure to hold a list of
|
||||||
|
ISO9660 statbuf-entry pointers for the files inside
|
||||||
|
a directory.
|
||||||
|
|
||||||
|
@return allocated list. Free with iso9660_filelist_free()
|
||||||
*/
|
*/
|
||||||
CdioList_t * iso9660_fs_readdir (CdIo_t *p_cdio, const char psz_path[],
|
CdioISO9660FileList_t * iso9660_filelist_new(void);
|
||||||
bool b_mode2);
|
|
||||||
|
|
||||||
/*! Read psz_path (a directory) and return a list of iso9660_stat_t
|
|
||||||
pointers for the files inside that directory. The caller must free
|
/*!
|
||||||
the returned result using _cdio_list_free().
|
Create a new data structure to hold a list of
|
||||||
|
ISO9660 statbuf entries for directory
|
||||||
|
pointers for the files inside a directory.
|
||||||
|
|
||||||
|
@return allocated list. Free with iso9660_dirlist_free()
|
||||||
|
*/
|
||||||
|
CdioISO9660DirList_t * iso9660_dirlist_new(void);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Free the passed CdioISOC9660FileList_t structure.
|
||||||
|
*/
|
||||||
|
void iso9660_filelist_free(CdioISO9660FileList_t *p_filelist);
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Free the passed CdioISOC9660Dirlist_t structure.
|
||||||
|
*/
|
||||||
|
void iso9660_dirlist_free(CdioISO9660DirList_t *p_filelist);
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Read psz_path (a directory) and return a list of iso9660_stat_t
|
||||||
|
pointers for the files inside that directory.
|
||||||
|
|
||||||
|
@param p_cdio the CD object to read from
|
||||||
|
|
||||||
|
@param psz_path path the read the directory from.
|
||||||
|
|
||||||
|
@return file status for psz_path. The caller must free the
|
||||||
|
The caller must free the returned result using iso9660_stat_free().
|
||||||
|
*/
|
||||||
|
CdioList_t * iso9660_fs_readdir (CdIo_t *p_cdio, const char psz_path[]);
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Read psz_path (a directory) and return a list of iso9660_stat_t
|
||||||
|
pointers for the files inside that directory.
|
||||||
|
|
||||||
|
@param p_iso the ISO-9660 file image to get data from
|
||||||
|
|
||||||
|
@param psz_path path the read the directory from.
|
||||||
|
|
||||||
|
@return file status for psz_path. The caller must free the
|
||||||
|
The caller must free the returned result using iso9660_stat_free().
|
||||||
*/
|
*/
|
||||||
CdioList_t * iso9660_ifs_readdir (iso9660_t *p_iso, const char psz_path[]);
|
CdioList_t * iso9660_ifs_readdir (iso9660_t *p_iso, const char psz_path[]);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Return the PVD's application ID.
|
Return the PVD's application ID.
|
||||||
|
|
||||||
|
@param p_pvd the PVD to get data from
|
||||||
|
|
||||||
|
@return the application id.
|
||||||
NULL is returned if there is some problem in getting this.
|
NULL is returned if there is some problem in getting this.
|
||||||
|
The caller must free the resturned result using free() if
|
||||||
|
not null.
|
||||||
*/
|
*/
|
||||||
char * iso9660_get_application_id(iso9660_pvd_t *p_pvd);
|
char * iso9660_get_application_id(iso9660_pvd_t *p_pvd);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Get the application ID. psz_app_id is set to NULL if there
|
Return the PVD's application ID.
|
||||||
is some problem in getting this and false is returned.
|
|
||||||
|
@param p_iso the ISO-9660 file image to get data from
|
||||||
|
|
||||||
|
@param p_psz_app_id the application id set on success.
|
||||||
|
|
||||||
|
NULL is returned if there is some problem in getting this.
|
||||||
|
The caller must free the resturned result using free() if
|
||||||
|
not null.
|
||||||
*/
|
*/
|
||||||
bool iso9660_ifs_get_application_id(iso9660_t *p_iso,
|
bool iso9660_ifs_get_application_id(iso9660_t *p_iso,
|
||||||
/*out*/ cdio_utf8_t **p_psz_app_id);
|
/*out*/ cdio_utf8_t **p_psz_app_id);
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2008, 2012
|
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2008, 2012, 2017
|
||||||
Rocky Bernstein <rocky@gnu.org>
|
Rocky Bernstein <rocky@gnu.org>
|
||||||
Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org>
|
Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org>
|
||||||
|
|
||||||
|
@ -155,7 +155,7 @@ typedef uint8_t ubyte;
|
||||||
# define PRAGMA_BEGIN_PACKED _Pragma("pack(push)") \
|
# define PRAGMA_BEGIN_PACKED _Pragma("pack(push)") \
|
||||||
_Pragma("pack(1)")
|
_Pragma("pack(1)")
|
||||||
# define PRAGMA_END_PACKED _Pragma("pack(pop)")
|
# define PRAGMA_END_PACKED _Pragma("pack(pop)")
|
||||||
#elif __GNUC__ > 4 || (__STDC_VERSION__ >= 199901)
|
#elif __GNUC__ > 4 || (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901)
|
||||||
/* should work with GCC > 4.0 clang and most EDG-frontend based C
|
/* should work with GCC > 4.0 clang and most EDG-frontend based C
|
||||||
and C++ compilers */
|
and C++ compilers */
|
||||||
# define PRAGMA_BEGIN_PACKED _Pragma("pack(1)")
|
# define PRAGMA_BEGIN_PACKED _Pragma("pack(1)")
|
||||||
|
@ -335,6 +335,10 @@ typedef uint8_t ubyte;
|
||||||
CDIO_TRACK_FLAG_SCMS = 0x10 /**< SCMS (5.29.2.7) */
|
CDIO_TRACK_FLAG_SCMS = 0x10 /**< SCMS (5.29.2.7) */
|
||||||
} cdio_track_flag;
|
} cdio_track_flag;
|
||||||
|
|
||||||
|
|
||||||
|
/* Note that this matches the free() prototype.*/
|
||||||
|
typedef void (*CdioDataFree_t)(void *ptr);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
/*
|
/*
|
||||||
Copyright (C) 2005, 2008, 2012 Rocky Bernstein <rocky@gnu.org>
|
Copyright (C) 2005, 2008, 2012 Rocky Bernstein <rocky@gnu.org>
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
@ -16,18 +16,18 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* \file udf_time.h
|
* \file udf_time.h
|
||||||
*
|
*
|
||||||
* \brief UDF time conversion and access files.
|
* \brief UDF time conversion and access files.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef UDF_TIME_H
|
#ifndef UDF_TIME_H
|
||||||
#define UDF_TIME_H
|
#define UDF_TIME_H
|
||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
|
|
||||||
#if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR)
|
#if defined(__MINGW32__) && !defined(__MINGW64_VERSION_MAJOR) && !defined(__struct_timespec_defined)
|
||||||
struct timespec {
|
struct timespec {
|
||||||
time_t tv_sec; /* Seconds */
|
time_t tv_sec; /* Seconds */
|
||||||
long tv_nsec; /* Nanoseconds */
|
long tv_nsec; /* Nanoseconds */
|
||||||
|
@ -61,7 +61,7 @@ extern "C" {
|
||||||
/*!
|
/*!
|
||||||
Return the modification timestamp of the file
|
Return the modification timestamp of the file
|
||||||
*/
|
*/
|
||||||
udf_timestamp_t *udf_get_modification_timestamp(const udf_dirent_t
|
udf_timestamp_t *udf_get_modification_timestamp(const udf_dirent_t
|
||||||
*p_udf_dirent);
|
*p_udf_dirent);
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
@ -72,7 +72,7 @@ extern "C" {
|
||||||
/*!
|
/*!
|
||||||
Convert a UDF timestamp to a time_t. If microseconds are desired,
|
Convert a UDF timestamp to a time_t. If microseconds are desired,
|
||||||
use dest_usec. The return value is the same as dest. */
|
use dest_usec. The return value is the same as dest. */
|
||||||
time_t *udf_stamp_to_time(time_t *dest, long int *dest_usec,
|
time_t *udf_stamp_to_time(time_t *dest, long int *dest_usec,
|
||||||
const udf_timestamp_t src);
|
const udf_timestamp_t src);
|
||||||
|
|
||||||
udf_timestamp_t *udf_timespec_to_stamp(const struct timespec ts,
|
udf_timestamp_t *udf_timespec_to_stamp(const struct timespec ts,
|
||||||
|
|
|
@ -21,8 +21,8 @@
|
||||||
#define CDIO_UTIL_H_
|
#define CDIO_UTIL_H_
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
\file util.h
|
\file util.h
|
||||||
\brief Miscellaneous utility functions.
|
\brief Miscellaneous utility functions.
|
||||||
|
|
||||||
Warning: this will probably get removed/replaced by using glib.h
|
Warning: this will probably get removed/replaced by using glib.h
|
||||||
*/
|
*/
|
||||||
|
@ -65,8 +65,14 @@ _cdio_len2blocks (uint32_t i_len, uint16_t i_blocksize)
|
||||||
return i_blocks;
|
return i_blocks;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*! free() and NULL out p_obj it is not already null. */
|
||||||
|
#define CDIO_FREE_IF_NOT_NULL(p_obj) \
|
||||||
|
if (NULL != p_obj) { free(p_obj); p_obj=NULL; };
|
||||||
|
|
||||||
|
|
||||||
/* round up to next block boundary */
|
/* round up to next block boundary */
|
||||||
static CDIO_INLINE unsigned
|
static CDIO_INLINE unsigned
|
||||||
_cdio_ceil2block (unsigned offset, uint16_t i_blocksize)
|
_cdio_ceil2block (unsigned offset, uint16_t i_blocksize)
|
||||||
{
|
{
|
||||||
return _cdio_len2blocks (offset, i_blocksize) * i_blocksize;
|
return _cdio_len2blocks (offset, i_blocksize) * i_blocksize;
|
||||||
|
@ -99,11 +105,11 @@ _cdio_memdup (const void *mem, size_t count);
|
||||||
char *
|
char *
|
||||||
_cdio_strdup_upper (const char str[]);
|
_cdio_strdup_upper (const char str[]);
|
||||||
|
|
||||||
/* Duplicate path and make it platform compliant. Typically needed for
|
/*! Duplicate path and make it platform compliant. Typically needed for
|
||||||
MinGW/MSYS where a "/c/..." path must be translated to "c:/..." for
|
MinGW/MSYS where a "/c/..." path must be translated to "c:/..." for
|
||||||
use with fopen(), etc. Returned string must be freed by the caller
|
use with fopen(), etc. Returned string must be freed by the caller
|
||||||
using cdio_free(). */
|
using cdio_free(). */
|
||||||
char *
|
char *
|
||||||
_cdio_strdup_fixpath (const char path[]);
|
_cdio_strdup_fixpath (const char path[]);
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -125,7 +131,7 @@ char *cdio_realpath (const char *psz_src, char *psz_dst);
|
||||||
#ifdef WANT_FOLLOW_SYMLINK_COMPATIBILITY
|
#ifdef WANT_FOLLOW_SYMLINK_COMPATIBILITY
|
||||||
# define cdio_follow_symlink cdio_realpath
|
# define cdio_follow_symlink cdio_realpath
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -133,7 +139,7 @@ char *cdio_realpath (const char *psz_src, char *psz_dst);
|
||||||
#endif /* CDIO_UTIL_H_ */
|
#endif /* CDIO_UTIL_H_ */
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Local variables:
|
* Local variables:
|
||||||
* c-file-style: "gnu"
|
* c-file-style: "gnu"
|
||||||
* tab-width: 8
|
* tab-width: 8
|
||||||
|
|
|
@ -1,19 +1,19 @@
|
||||||
/** \file version.h
|
/** \file version.h
|
||||||
*
|
*
|
||||||
* \brief A file containing the libcdio package version
|
* \brief A file containing the libcdio package version
|
||||||
* number (94) and OS build name.
|
* number (20000) and OS build name.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*! CDIO_VERSION is a C-Preprocessor macro of a string that shows what
|
/*! CDIO_VERSION is a C-Preprocessor macro of a string that shows what
|
||||||
version is used. cdio_version_string has the same value, but it is a
|
version is used. cdio_version_string has the same value, but it is a
|
||||||
constant variable that can be accessed at run time. */
|
constant variable that can be accessed at run time. */
|
||||||
#define CDIO_VERSION "0.94 (Rufus)"
|
#define CDIO_VERSION "2.0.0 (Rufus)"
|
||||||
extern const char *cdio_version_string; /**< = CDIO_VERSION */
|
extern const char *cdio_version_string; /**< = CDIO_VERSION */
|
||||||
|
|
||||||
/*! LIBCDIO_VERSION_NUM is a C-Preprocessor macro that can be used for
|
/*! LIBCDIO_VERSION_NUM is a C-Preprocessor macro that can be used for
|
||||||
testing in the C preprocessor. libcdio_version_num has the same
|
testing in the C preprocessor. libcdio_version_num has the same
|
||||||
value, but it is a constant variable that can be accessed at run
|
value, but it is a constant variable that can be accessed at run
|
||||||
time. */
|
time. */
|
||||||
#define LIBCDIO_VERSION_NUM 94
|
#define LIBCDIO_VERSION_NUM 20000
|
||||||
|
|
||||||
extern const unsigned int libcdio_version_num; /**< = LIBCDIO_VERSION_NUM */
|
extern const unsigned int libcdio_version_num; /**< = LIBCDIO_VERSION_NUM */
|
||||||
|
|
|
@ -73,7 +73,7 @@ cdio_stream_destroy(CdioDataSource_t *p_obj)
|
||||||
cdio_stream_close(p_obj);
|
cdio_stream_close(p_obj);
|
||||||
|
|
||||||
p_obj->op.free(p_obj->user_data);
|
p_obj->op.free(p_obj->user_data);
|
||||||
|
p_obj->user_data = NULL;
|
||||||
free(p_obj);
|
free(p_obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright (C) 2003-2005, 2008-2009, 2011-2012, 2016
|
Copyright (C) 2003-2005, 2008-2009, 2011-2012, 2016-2017
|
||||||
Rocky Bernstein <rocky@gnu.org>
|
Rocky Bernstein <rocky@gnu.org>
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
@ -43,7 +43,9 @@ extern "C" {
|
||||||
#endif /* __cplusplus */
|
#endif /* __cplusplus */
|
||||||
|
|
||||||
#ifndef HAVE_STRNDUP
|
#ifndef HAVE_STRNDUP
|
||||||
static inline char *strndup(const char *s, size_t n)
|
#undef strndup
|
||||||
|
#define strndup libcdio_strndup
|
||||||
|
static inline char *libcdio_strndup(const char *s, size_t n)
|
||||||
{
|
{
|
||||||
char *result;
|
char *result;
|
||||||
size_t len = strlen (s);
|
size_t len = strlen (s);
|
||||||
|
@ -528,7 +530,6 @@ extern "C" {
|
||||||
driver_return_code_t close_tray_freebsd (const char *psz_drive);
|
driver_return_code_t close_tray_freebsd (const char *psz_drive);
|
||||||
driver_return_code_t close_tray_linux (const char *psz_drive);
|
driver_return_code_t close_tray_linux (const char *psz_drive);
|
||||||
driver_return_code_t close_tray_netbsd (const char *psz_drive);
|
driver_return_code_t close_tray_netbsd (const char *psz_drive);
|
||||||
driver_return_code_t close_tray_os2 (const char *psz_drive);
|
|
||||||
driver_return_code_t close_tray_osx (const char *psz_drive);
|
driver_return_code_t close_tray_osx (const char *psz_drive);
|
||||||
driver_return_code_t close_tray_solaris (const char *psz_drive);
|
driver_return_code_t close_tray_solaris (const char *psz_drive);
|
||||||
driver_return_code_t close_tray_win32 (const char *psz_drive);
|
driver_return_code_t close_tray_win32 (const char *psz_drive);
|
||||||
|
|
|
@ -61,10 +61,10 @@ _cdio_list_new (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
_cdio_list_free (CdioList_t *p_list, int free_data)
|
_cdio_list_free (CdioList_t *p_list, int free_data, CdioDataFree_t free_fn)
|
||||||
{
|
{
|
||||||
while (_cdio_list_length (p_list))
|
while (_cdio_list_length (p_list))
|
||||||
_cdio_list_node_free (_cdio_list_begin (p_list), free_data);
|
_cdio_list_node_free (_cdio_list_begin (p_list), free_data, free_fn);
|
||||||
|
|
||||||
free (p_list);
|
free (p_list);
|
||||||
}
|
}
|
||||||
|
@ -182,7 +182,8 @@ _cdio_list_node_next (CdioListNode_t *p_node)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
_cdio_list_node_free (CdioListNode_t *p_node, int free_data)
|
_cdio_list_node_free (CdioListNode_t *p_node,
|
||||||
|
int free_data, CdioDataFree_t free_fn)
|
||||||
{
|
{
|
||||||
CdioList_t *p_list;
|
CdioList_t *p_list;
|
||||||
CdioListNode_t *prev_node;
|
CdioListNode_t *prev_node;
|
||||||
|
@ -193,8 +194,8 @@ _cdio_list_node_free (CdioListNode_t *p_node, int free_data)
|
||||||
|
|
||||||
cdio_assert (_cdio_list_length (p_list) > 0);
|
cdio_assert (_cdio_list_length (p_list) > 0);
|
||||||
|
|
||||||
if (free_data)
|
if (free_data && free_fn)
|
||||||
free (_cdio_list_node_data (p_node));
|
free_fn (_cdio_list_node_data (p_node));
|
||||||
|
|
||||||
if (_cdio_list_length (p_list) == 1)
|
if (_cdio_list_length (p_list) == 1)
|
||||||
{
|
{
|
||||||
|
|
|
@ -346,4 +346,6 @@ bool cdio_charset_to_utf8(const char *src, size_t src_len, cdio_utf8_t **dst,
|
||||||
|
|
||||||
return (*dst != NULL);
|
return (*dst != NULL);
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
# error "The iconv library is needed to build drivers, but it is not detected"
|
||||||
#endif /* HAVE_ICONV */
|
#endif /* HAVE_ICONV */
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/*
|
/*
|
||||||
Copyright (C) 2003-2009, 2013-2014, 2016 Rocky Bernstein <rocky@gnu.org>
|
Copyright (C) 2003-2009, 2013-2014, 2016-2017 Rocky Bernstein
|
||||||
|
<rocky@gnu.org>
|
||||||
Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org>
|
Copyright (C) 2000 Herbert Valerio Riedel <hvr@gnu.org>
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
@ -204,6 +205,11 @@ iso9660_get_dtime (const iso9660_dtime_t *idr_date, bool b_localtime,
|
||||||
p_tm->tm_sec = idr_date->dt_second - idr_date->dt_gmtoff * (15 * 60);
|
p_tm->tm_sec = idr_date->dt_second - idr_date->dt_gmtoff * (15 * 60);
|
||||||
p_tm->tm_isdst = -1; /* information not available */
|
p_tm->tm_isdst = -1; /* information not available */
|
||||||
|
|
||||||
|
#ifdef HAVE_STRUCT_TM_TM_ZONE
|
||||||
|
/* Initialize everything */
|
||||||
|
p_tm->tm_zone = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Recompute tm_wday and tm_yday via mktime. mktime will also renormalize
|
/* Recompute tm_wday and tm_yday via mktime. mktime will also renormalize
|
||||||
date values to account for the timezone offset. */
|
date values to account for the timezone offset. */
|
||||||
{
|
{
|
||||||
|
@ -271,6 +277,10 @@ iso9660_get_ltime (const iso9660_ltime_t *p_ldate,
|
||||||
#ifndef HAVE_TM_GMTOFF
|
#ifndef HAVE_TM_GMTOFF
|
||||||
p_tm->tm_sec += p_ldate->lt_gmtoff * (15 * 60);
|
p_tm->tm_sec += p_ldate->lt_gmtoff * (15 * 60);
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef HAVE_STRUCT_TM_TM_ZONE
|
||||||
|
/* Initialize everything */
|
||||||
|
p_tm->tm_zone = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Recompute tm_wday and tm_yday via mktime. mktime will also renormalize
|
/* Recompute tm_wday and tm_yday via mktime. mktime will also renormalize
|
||||||
date values to account for the timezone offset. */
|
date values to account for the timezone offset. */
|
||||||
|
@ -363,7 +373,7 @@ iso9660_set_ltime_with_timezone(const struct tm *p_tm,
|
||||||
|
|
||||||
if (!p_tm) return;
|
if (!p_tm) return;
|
||||||
|
|
||||||
_snprintf(_pvd_date, 17,
|
snprintf(_pvd_date, 17,
|
||||||
"%4.4d%2.2d%2.2d" "%2.2d%2.2d%2.2d" "%2.2d",
|
"%4.4d%2.2d%2.2d" "%2.2d%2.2d%2.2d" "%2.2d",
|
||||||
p_tm->tm_year + 1900, p_tm->tm_mon + 1, p_tm->tm_mday,
|
p_tm->tm_year + 1900, p_tm->tm_mon + 1, p_tm->tm_mday,
|
||||||
p_tm->tm_hour, p_tm->tm_min, p_tm->tm_sec,
|
p_tm->tm_hour, p_tm->tm_min, p_tm->tm_sec,
|
||||||
|
@ -776,7 +786,8 @@ iso9660_dir_add_entry_su(void *dir,
|
||||||
? strlen(filename) : 1); /* working hack! */
|
? strlen(filename) : 1); /* working hack! */
|
||||||
|
|
||||||
memcpy(&idr->filename.str[1], filename, from_711(idr->filename.len));
|
memcpy(&idr->filename.str[1], filename, from_711(idr->filename.len));
|
||||||
memcpy(&dir8[offset] + su_offset, su_data, su_size);
|
if (su_size > 0 && su_data)
|
||||||
|
memcpy(&dir8[offset] + su_offset, su_data, su_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -1111,7 +1122,7 @@ iso9660_pathname_isofy (const char pathname[], uint16_t version)
|
||||||
|
|
||||||
cdio_assert (strlen (pathname) < (sizeof (tmpbuf) - sizeof (";65535")));
|
cdio_assert (strlen (pathname) < (sizeof (tmpbuf) - sizeof (";65535")));
|
||||||
|
|
||||||
_snprintf (tmpbuf, sizeof(tmpbuf), "%s;%d", pathname, version);
|
snprintf (tmpbuf, sizeof(tmpbuf), "%s;%d", pathname, version);
|
||||||
|
|
||||||
return strdup (tmpbuf);
|
return strdup (tmpbuf);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright (C) 2003-2008, 2011-2015 Rocky Bernstein <rocky@gnu.org>
|
Copyright (C) 2003-2008, 2011-2015, 2017 Rocky Bernstein <rocky@gnu.org>
|
||||||
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
|
Copyright (C) 2001 Herbert Valerio Riedel <hvr@gnu.org>
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
@ -16,6 +16,10 @@
|
||||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
/* iso9660 filesystem-based routines */
|
/* iso9660 filesystem-based routines */
|
||||||
|
|
||||||
|
/* FIXME: _cdio_list_free for iso9660 statbuf is insufficient because it doesn't
|
||||||
|
free bits that are allocated inside the data. */
|
||||||
|
|
||||||
|
|
||||||
#if defined(HAVE_CONFIG_H) && !defined(__CDIO_CONFIG_H__)
|
#if defined(HAVE_CONFIG_H) && !defined(__CDIO_CONFIG_H__)
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
@ -202,6 +206,11 @@ iso9660_open_ext_private (const char *psz_path,
|
||||||
/*!
|
/*!
|
||||||
Open an ISO 9660 image for reading. Maybe in the future we will have
|
Open an ISO 9660 image for reading. Maybe in the future we will have
|
||||||
a mode. NULL is returned on error.
|
a mode. NULL is returned on error.
|
||||||
|
|
||||||
|
@param psz_path full path of ISO9660 file.
|
||||||
|
|
||||||
|
@return a IS9660 structure is unconditionally returned. The caller
|
||||||
|
should call iso9660_close() when done.
|
||||||
*/
|
*/
|
||||||
iso9660_t *
|
iso9660_t *
|
||||||
iso9660_open (const char *psz_path /*, mode*/)
|
iso9660_open (const char *psz_path /*, mode*/)
|
||||||
|
@ -210,8 +219,11 @@ iso9660_open (const char *psz_path /*, mode*/)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Open an ISO 9660 image for reading. Maybe in the future we will have
|
Open an ISO 9660 image for reading allowing various ISO 9660
|
||||||
a mode. NULL is returned on error.
|
extensions. Maybe in the future we will have a mode. NULL is
|
||||||
|
returned on error.
|
||||||
|
|
||||||
|
@see iso9660_open_fuzzy
|
||||||
*/
|
*/
|
||||||
iso9660_t *
|
iso9660_t *
|
||||||
iso9660_open_ext (const char *psz_path,
|
iso9660_open_ext (const char *psz_path,
|
||||||
|
@ -221,9 +233,19 @@ iso9660_open_ext (const char *psz_path,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*! Open an ISO 9660 image for "fuzzy" reading. This means that we
|
||||||
Open an ISO 9660 image for reading. Maybe in the future we will have
|
will try to guess various internal offset based on internal
|
||||||
a mode. NULL is returned on error.
|
checks. This may be useful when trying to read an ISO 9660 image
|
||||||
|
contained in a file format that libiso9660 doesn't know natively
|
||||||
|
(or knows imperfectly.)
|
||||||
|
|
||||||
|
Some tolerence allowed for positioning the ISO 9660 image. We scan
|
||||||
|
for STANDARD_ID and use that to set the eventual offset to adjust
|
||||||
|
by (as long as that is <= i_fuzz).
|
||||||
|
|
||||||
|
Maybe in the future we will have a mode. NULL is returned on error.
|
||||||
|
|
||||||
|
@see iso9660_open, @see iso9660_fuzzy_ext
|
||||||
*/
|
*/
|
||||||
iso9660_t *
|
iso9660_t *
|
||||||
iso9660_open_fuzzy (const char *psz_path, uint16_t i_fuzz /*, mode*/)
|
iso9660_open_fuzzy (const char *psz_path, uint16_t i_fuzz /*, mode*/)
|
||||||
|
@ -232,8 +254,13 @@ iso9660_open_fuzzy (const char *psz_path, uint16_t i_fuzz /*, mode*/)
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Open an ISO 9660 image for reading. Maybe in the future we will have
|
Open an ISO 9660 image for reading with some tolerence for positioning
|
||||||
a mode. NULL is returned on error.
|
of the ISO9660 image. We scan for ISO_STANDARD_ID and use that to set
|
||||||
|
the eventual offset to adjust by (as long as that is <= i_fuzz).
|
||||||
|
|
||||||
|
Maybe in the future we will have a mode. NULL is returned on error.
|
||||||
|
|
||||||
|
@see iso9660_open_ext @see iso9660_open_fuzzy
|
||||||
*/
|
*/
|
||||||
iso9660_t *
|
iso9660_t *
|
||||||
iso9660_open_fuzzy_ext (const char *psz_path,
|
iso9660_open_fuzzy_ext (const char *psz_path,
|
||||||
|
@ -244,16 +271,19 @@ iso9660_open_fuzzy_ext (const char *psz_path,
|
||||||
true);
|
true);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*! Close previously opened ISO 9660 image and free resources
|
||||||
Close previously opened ISO 9660 image.
|
associated with the image. Call this when done using using an ISO
|
||||||
True is unconditionally returned. If there was an error false would
|
9660 image.
|
||||||
be returned.
|
|
||||||
|
@return true is unconditionally returned. If there was an error
|
||||||
|
false would be returned.
|
||||||
*/
|
*/
|
||||||
bool
|
bool
|
||||||
iso9660_close (iso9660_t *p_iso)
|
iso9660_close (iso9660_t *p_iso)
|
||||||
{
|
{
|
||||||
if (NULL != p_iso) {
|
if (NULL != p_iso) {
|
||||||
cdio_stdio_destroy(p_iso->stream);
|
cdio_stdio_destroy(p_iso->stream);
|
||||||
|
p_iso->stream = NULL;
|
||||||
free(p_iso);
|
free(p_iso);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@ -708,6 +738,46 @@ iso9660_iso_seek_read (const iso9660_t *p_iso, void *ptr, lsn_t start,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Check for the end of a directory record list in a single directory
|
||||||
|
block. If at the end, set the offset to start of the next block and
|
||||||
|
return "true". The caller often skips actions only when at the end
|
||||||
|
of a record list.
|
||||||
|
*/
|
||||||
|
static bool
|
||||||
|
iso9660_check_dir_block_end(iso9660_dir_t *p_iso9660_dir, unsigned *offset)
|
||||||
|
{
|
||||||
|
if (!iso9660_get_dir_len(p_iso9660_dir))
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Length 0 indicates that no more directory records are in this
|
||||||
|
block. This matches how Linux and libburn's libisofs work.
|
||||||
|
|
||||||
|
Note that assignment below does not exactly round up.
|
||||||
|
If (offset % ISO_BLOCKSIZE) == 0 then offset is incremented
|
||||||
|
by ISO_BLOCKSIZE, i.e. the block is skipped.
|
||||||
|
*/
|
||||||
|
*offset += ISO_BLOCKSIZE - (*offset % ISO_BLOCKSIZE);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((*offset + iso9660_get_dir_len(p_iso9660_dir) - 1) / ISO_BLOCKSIZE
|
||||||
|
!= *offset / ISO_BLOCKSIZE)
|
||||||
|
{
|
||||||
|
/*
|
||||||
|
Directory record spans over block limit.
|
||||||
|
Hop to next block where a new record is supposed to begin,
|
||||||
|
if it is not after the end of the directory data.
|
||||||
|
*/
|
||||||
|
*offset += ISO_BLOCKSIZE - (*offset % ISO_BLOCKSIZE);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static iso9660_stat_t *
|
static iso9660_stat_t *
|
||||||
_iso9660_dir_to_statbuf (iso9660_dir_t *p_iso9660_dir,
|
_iso9660_dir_to_statbuf (iso9660_dir_t *p_iso9660_dir,
|
||||||
iso9660_stat_t *last_p_stat,
|
iso9660_stat_t *last_p_stat,
|
||||||
|
@ -738,9 +808,9 @@ _iso9660_dir_to_statbuf (iso9660_dir_t *p_iso9660_dir,
|
||||||
p_stat->type = (p_iso9660_dir->file_flags & ISO_DIRECTORY)
|
p_stat->type = (p_iso9660_dir->file_flags & ISO_DIRECTORY)
|
||||||
? _STAT_DIR : _STAT_FILE;
|
? _STAT_DIR : _STAT_FILE;
|
||||||
p_stat->lsn[p_stat->extents] = from_733 (p_iso9660_dir->extent);
|
p_stat->lsn[p_stat->extents] = from_733 (p_iso9660_dir->extent);
|
||||||
p_stat->size[p_stat->extents] = from_733 (p_iso9660_dir->size);
|
p_stat->extsize[p_stat->extents] = from_733 (p_iso9660_dir->size);
|
||||||
p_stat->total_size += p_stat->size[p_stat->extents];
|
p_stat->size += p_stat->extsize[p_stat->extents];
|
||||||
p_stat->secsize[p_stat->extents] = _cdio_len2blocks (p_stat->size[p_stat->extents], ISO_BLOCKSIZE);
|
p_stat->secsize[p_stat->extents] = _cdio_len2blocks (p_stat->extsize[p_stat->extents], ISO_BLOCKSIZE);
|
||||||
p_stat->rr.b3_rock = dunno; /*FIXME should do based on mask */
|
p_stat->rr.b3_rock = dunno; /*FIXME should do based on mask */
|
||||||
p_stat->b_xa = false;
|
p_stat->b_xa = false;
|
||||||
|
|
||||||
|
@ -806,19 +876,18 @@ _iso9660_dir_to_statbuf (iso9660_dir_t *p_iso9660_dir,
|
||||||
/* Use the plain ISO-9660 name when dealing with a multiextent file part */
|
/* Use the plain ISO-9660 name when dealing with a multiextent file part */
|
||||||
strncpy(p_stat->filename, &p_iso9660_dir->filename.str[1], i_fname);
|
strncpy(p_stat->filename, &p_iso9660_dir->filename.str[1], i_fname);
|
||||||
}
|
}
|
||||||
p_stat->extents++;
|
if (p_stat->extents >= ISO_MAX_MULTIEXTENT) {
|
||||||
if (p_stat->extents > ISO_MAX_MULTIEXTENT) {
|
|
||||||
cdio_warn("Warning: Too many multiextent file parts for '%s'", p_stat->filename);
|
cdio_warn("Warning: Too many multiextent file parts for '%s'", p_stat->filename);
|
||||||
free(p_stat->rr.psz_symlink);
|
free(p_stat->rr.psz_symlink);
|
||||||
free(p_stat);
|
free(p_stat);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
p_stat->extents++;
|
||||||
|
|
||||||
iso9660_get_dtime(&(p_iso9660_dir->recording_time), true, &(p_stat->tm));
|
iso9660_get_dtime(&(p_iso9660_dir->recording_time), true, &(p_stat->tm));
|
||||||
|
|
||||||
if (dir_len < sizeof (iso9660_dir_t)) {
|
if (dir_len < sizeof (iso9660_dir_t)) {
|
||||||
free(p_stat->rr.psz_symlink);
|
iso9660_stat_free(p_stat);
|
||||||
free(p_stat);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1006,11 +1075,8 @@ _fs_stat_traverse (const CdIo_t *p_cdio, const iso9660_stat_t *_root,
|
||||||
iso9660_stat_t *p_iso9660_stat;
|
iso9660_stat_t *p_iso9660_stat;
|
||||||
int cmp;
|
int cmp;
|
||||||
|
|
||||||
if (!iso9660_get_dir_len(p_iso9660_dir))
|
if (iso9660_check_dir_block_end(p_iso9660_dir, &offset))
|
||||||
{
|
continue;
|
||||||
offset++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
p_iso9660_stat = _iso9660_dir_to_statbuf (p_iso9660_dir, NULL,
|
p_iso9660_stat = _iso9660_dir_to_statbuf (p_iso9660_dir, NULL,
|
||||||
dunno, p_env->u_joliet_level);
|
dunno, p_env->u_joliet_level);
|
||||||
|
@ -1040,14 +1106,12 @@ _fs_stat_traverse (const CdIo_t *p_cdio, const iso9660_stat_t *_root,
|
||||||
if (!cmp) {
|
if (!cmp) {
|
||||||
iso9660_stat_t *ret_stat
|
iso9660_stat_t *ret_stat
|
||||||
= _fs_stat_traverse (p_cdio, p_iso9660_stat, &splitpath[1]);
|
= _fs_stat_traverse (p_cdio, p_iso9660_stat, &splitpath[1]);
|
||||||
free(p_iso9660_stat->rr.psz_symlink);
|
iso9660_stat_free(p_iso9660_stat);
|
||||||
free(p_iso9660_stat);
|
|
||||||
free (_dirbuf);
|
free (_dirbuf);
|
||||||
return ret_stat;
|
return ret_stat;
|
||||||
}
|
}
|
||||||
|
|
||||||
free(p_iso9660_stat->rr.psz_symlink);
|
iso9660_stat_free(p_iso9660_stat);
|
||||||
free(p_iso9660_stat);
|
|
||||||
|
|
||||||
offset += iso9660_get_dir_len(p_iso9660_dir);
|
offset += iso9660_get_dir_len(p_iso9660_dir);
|
||||||
}
|
}
|
||||||
|
@ -1063,9 +1127,9 @@ static iso9660_stat_t *
|
||||||
_fs_iso_stat_traverse (iso9660_t *p_iso, const iso9660_stat_t *_root,
|
_fs_iso_stat_traverse (iso9660_t *p_iso, const iso9660_stat_t *_root,
|
||||||
char **splitpath)
|
char **splitpath)
|
||||||
{
|
{
|
||||||
unsigned offset;
|
unsigned offset = 0;
|
||||||
uint8_t *_dirbuf = NULL;
|
uint8_t *_dirbuf = NULL;
|
||||||
int ret;
|
int ret, cmp;
|
||||||
iso9660_stat_t *p_stat = NULL;
|
iso9660_stat_t *p_stat = NULL;
|
||||||
iso9660_dir_t *p_iso9660_dir = NULL;
|
iso9660_dir_t *p_iso9660_dir = NULL;
|
||||||
|
|
||||||
|
@ -1095,19 +1159,18 @@ _fs_iso_stat_traverse (iso9660_t *p_iso, const iso9660_stat_t *_root,
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = iso9660_iso_seek_read (p_iso, _dirbuf, _root->lsn[0], _root->secsize[0]);
|
ret = iso9660_iso_seek_read (p_iso, _dirbuf, _root->lsn[0], _root->secsize[0]);
|
||||||
if (ret!=ISO_BLOCKSIZE*_root->secsize[0]) return NULL;
|
if (ret!=ISO_BLOCKSIZE*_root->secsize[0]) {
|
||||||
|
free(_dirbuf);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
for (offset = 0; offset < (_root->secsize[0] * ISO_BLOCKSIZE);
|
for (offset = 0; offset < (_root->secsize[0] * ISO_BLOCKSIZE);
|
||||||
offset += iso9660_get_dir_len(p_iso9660_dir))
|
offset += iso9660_get_dir_len(p_iso9660_dir))
|
||||||
{
|
{
|
||||||
p_iso9660_dir = (void *) &_dirbuf[offset];
|
p_iso9660_dir = (void *) &_dirbuf[offset];
|
||||||
int cmp;
|
|
||||||
|
|
||||||
if (!iso9660_get_dir_len(p_iso9660_dir))
|
if (iso9660_check_dir_block_end(p_iso9660_dir, &offset))
|
||||||
{
|
continue;
|
||||||
offset++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
p_stat = _iso9660_dir_to_statbuf (p_iso9660_dir, p_stat,
|
p_stat = _iso9660_dir_to_statbuf (p_iso9660_dir, p_stat,
|
||||||
p_iso->b_xa, p_iso->u_joliet_level);
|
p_iso->b_xa, p_iso->u_joliet_level);
|
||||||
|
@ -1120,7 +1183,7 @@ _fs_iso_stat_traverse (iso9660_t *p_iso, const iso9660_stat_t *_root,
|
||||||
|
|
||||||
/* If we have multiextent file parts, loop until the last one */
|
/* If we have multiextent file parts, loop until the last one */
|
||||||
if (p_iso9660_dir->file_flags & ISO_MULTIEXTENT)
|
if (p_iso9660_dir->file_flags & ISO_MULTIEXTENT)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
cmp = strcmp(splitpath[0], p_stat->filename);
|
cmp = strcmp(splitpath[0], p_stat->filename);
|
||||||
|
|
||||||
|
@ -1147,14 +1210,11 @@ _fs_iso_stat_traverse (iso9660_t *p_iso, const iso9660_stat_t *_root,
|
||||||
if (!cmp) {
|
if (!cmp) {
|
||||||
iso9660_stat_t *ret_stat
|
iso9660_stat_t *ret_stat
|
||||||
= _fs_iso_stat_traverse (p_iso, p_stat, &splitpath[1]);
|
= _fs_iso_stat_traverse (p_iso, p_stat, &splitpath[1]);
|
||||||
free(p_stat->rr.psz_symlink);
|
iso9660_stat_free(p_stat);
|
||||||
free(p_stat);
|
|
||||||
free (_dirbuf);
|
free (_dirbuf);
|
||||||
return ret_stat;
|
return ret_stat;
|
||||||
}
|
}
|
||||||
|
iso9660_stat_free(p_stat);
|
||||||
free(p_stat->rr.psz_symlink);
|
|
||||||
free(p_stat);
|
|
||||||
p_stat = NULL;
|
p_stat = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1166,7 +1226,22 @@ _fs_iso_stat_traverse (iso9660_t *p_iso, const iso9660_stat_t *_root,
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Get file status for psz_path into stat. NULL is returned on error.
|
Return file status for psz_path. NULL is returned on error.
|
||||||
|
|
||||||
|
@param p_cdio the CD object to read from
|
||||||
|
|
||||||
|
@param psz_path filename path to look up and get information about
|
||||||
|
|
||||||
|
@return ISO 9660 file information
|
||||||
|
|
||||||
|
Important note:
|
||||||
|
|
||||||
|
You make get different results looking up "/" versus "/." and the
|
||||||
|
latter may give more complete information. "/" will take information
|
||||||
|
from the PVD only, whereas "/." will force a directory read of "/" and
|
||||||
|
find "." and in that Rock-Ridge information might be found which fills
|
||||||
|
in more stat information. Ideally iso9660_fs_stat should be fixed.
|
||||||
|
Patches anyone?
|
||||||
*/
|
*/
|
||||||
iso9660_stat_t *
|
iso9660_stat_t *
|
||||||
iso9660_fs_stat (CdIo_t *p_cdio, const char psz_path[])
|
iso9660_fs_stat (CdIo_t *p_cdio, const char psz_path[])
|
||||||
|
@ -1223,9 +1298,21 @@ fs_stat_translate (void *p_image, stat_root_t stat_root,
|
||||||
return p_stat;
|
return p_stat;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Return file status for path name psz_path. NULL is returned on error.
|
||||||
|
pathname version numbers in the ISO 9660 name are dropped, i.e. ;1
|
||||||
|
is removed and if level 1 ISO-9660 names are lowercased.
|
||||||
|
|
||||||
|
@param p_cdio the CD object to read from
|
||||||
|
|
||||||
|
@param psz_path filename path to look up and get information about
|
||||||
|
|
||||||
|
@return ISO 9660 file information. The caller must free the
|
||||||
|
returned result using iso9660_stat_free().
|
||||||
|
|
||||||
|
*/
|
||||||
iso9660_stat_t *
|
iso9660_stat_t *
|
||||||
iso9660_fs_stat_translate (CdIo_t *p_cdio, const char psz_path[],
|
iso9660_fs_stat_translate (CdIo_t *p_cdio, const char psz_path[])
|
||||||
bool b_mode2)
|
|
||||||
{
|
{
|
||||||
return fs_stat_translate(p_cdio, (stat_root_t *) _fs_stat_root,
|
return fs_stat_translate(p_cdio, (stat_root_t *) _fs_stat_root,
|
||||||
(stat_traverse_t *) _fs_stat_traverse,
|
(stat_traverse_t *) _fs_stat_traverse,
|
||||||
|
@ -1233,10 +1320,14 @@ iso9660_fs_stat_translate (CdIo_t *p_cdio, const char psz_path[],
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Get file status for psz_path into stat. NULL is returned on error.
|
@param p_iso the ISO-9660 file image to get data from
|
||||||
pathname version numbers in the ISO 9660
|
|
||||||
name are dropped, i.e. ;1 is removed and if level 1 ISO-9660 names
|
@param psz_path filename path translate
|
||||||
are lowercased.
|
|
||||||
|
@return file status for path name psz_path. NULL is returned on
|
||||||
|
error. pathname version numbers in the ISO 9660 name are dropped,
|
||||||
|
i.e. ;1 is removed and if level 1 ISO-9660 names are lowercased.
|
||||||
|
The caller must free the returned result using iso9660_stat_free().
|
||||||
*/
|
*/
|
||||||
iso9660_stat_t *
|
iso9660_stat_t *
|
||||||
iso9660_ifs_stat_translate (iso9660_t *p_iso, const char psz_path[])
|
iso9660_ifs_stat_translate (iso9660_t *p_iso, const char psz_path[])
|
||||||
|
@ -1248,7 +1339,13 @@ iso9660_ifs_stat_translate (iso9660_t *p_iso, const char psz_path[])
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Get file status for psz_path into stat. NULL is returned on error.
|
|
||||||
|
@param p_cdio the CD object to read from
|
||||||
|
|
||||||
|
@param pzs_path path the look up
|
||||||
|
|
||||||
|
@return file status for pathname. NULL is returned on error.
|
||||||
|
The caller must free the returned result using iso9660_stat_free().
|
||||||
*/
|
*/
|
||||||
iso9660_stat_t *
|
iso9660_stat_t *
|
||||||
iso9660_ifs_stat (iso9660_t *p_iso, const char psz_path[])
|
iso9660_ifs_stat (iso9660_t *p_iso, const char psz_path[])
|
||||||
|
@ -1273,12 +1370,17 @@ iso9660_ifs_stat (iso9660_t *p_iso, const char psz_path[])
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Read psz_path (a directory) and return a list of iso9660_stat_t
|
Read psz_path (a directory) and return a list of iso9660_stat_t
|
||||||
of the files inside that. The caller must free the returned result.
|
pointers for the files inside that directory.
|
||||||
|
|
||||||
b_mode2 is historical. It is not used.
|
@param p_cdio the CD object to read from
|
||||||
|
|
||||||
|
@param pzs_path path the read the directory from.
|
||||||
|
|
||||||
|
@return file status for psz_path. The caller must free the
|
||||||
|
The caller must free the returned result using iso9660_stat_free().
|
||||||
*/
|
*/
|
||||||
CdioList_t *
|
CdioISO9660FileList_t *
|
||||||
iso9660_fs_readdir (CdIo_t *p_cdio, const char psz_path[], bool b_mode2)
|
iso9660_fs_readdir (CdIo_t *p_cdio, const char psz_path[])
|
||||||
{
|
{
|
||||||
generic_img_private_t *p_env;
|
generic_img_private_t *p_env;
|
||||||
iso9660_dir_t *p_iso9660_dir;
|
iso9660_dir_t *p_iso9660_dir;
|
||||||
|
@ -1294,27 +1396,28 @@ iso9660_fs_readdir (CdIo_t *p_cdio, const char psz_path[], bool b_mode2)
|
||||||
if (!p_stat) return NULL;
|
if (!p_stat) return NULL;
|
||||||
|
|
||||||
if (p_stat->type != _STAT_DIR) {
|
if (p_stat->type != _STAT_DIR) {
|
||||||
free(p_stat->rr.psz_symlink);
|
iso9660_stat_free(p_stat);
|
||||||
free(p_stat);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
unsigned offset = 0;
|
unsigned offset = 0;
|
||||||
uint8_t *_dirbuf = NULL;
|
uint8_t *_dirbuf = NULL;
|
||||||
CdioList_t *retval = _cdio_list_new ();
|
CdioISO9660DirList_t *retval = _cdio_list_new ();
|
||||||
|
|
||||||
_dirbuf = calloc(1, p_stat->secsize[0] * ISO_BLOCKSIZE);
|
_dirbuf = calloc(1, p_stat->secsize[0] * ISO_BLOCKSIZE);
|
||||||
if (!_dirbuf)
|
if (!_dirbuf)
|
||||||
{
|
{
|
||||||
cdio_warn("Couldn't calloc(1, %d)", p_stat->secsize[0] * ISO_BLOCKSIZE);
|
cdio_warn("Couldn't calloc(1, %d)", p_stat->secsize[0] * ISO_BLOCKSIZE);
|
||||||
_cdio_list_free (retval, true);
|
iso9660_stat_free(p_stat);
|
||||||
|
iso9660_dirlist_free(retval);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cdio_read_data_sectors (p_cdio, _dirbuf, p_stat->lsn[0],
|
if (cdio_read_data_sectors (p_cdio, _dirbuf, p_stat->lsn[0],
|
||||||
ISO_BLOCKSIZE, p_stat->secsize[0])) {
|
ISO_BLOCKSIZE, p_stat->secsize[0])) {
|
||||||
_cdio_list_free (retval, true);
|
iso9660_stat_free(p_stat);
|
||||||
|
iso9660_dirlist_free(retval);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1322,11 +1425,8 @@ iso9660_fs_readdir (CdIo_t *p_cdio, const char psz_path[], bool b_mode2)
|
||||||
{
|
{
|
||||||
p_iso9660_dir = (void *) &_dirbuf[offset];
|
p_iso9660_dir = (void *) &_dirbuf[offset];
|
||||||
|
|
||||||
if (!iso9660_get_dir_len(p_iso9660_dir))
|
if (iso9660_check_dir_block_end(p_iso9660_dir, &offset))
|
||||||
{
|
continue;
|
||||||
offset++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
p_iso9660_stat = _iso9660_dir_to_statbuf(p_iso9660_dir,
|
p_iso9660_stat = _iso9660_dir_to_statbuf(p_iso9660_dir,
|
||||||
p_iso9660_stat, dunno,
|
p_iso9660_stat, dunno,
|
||||||
|
@ -1343,8 +1443,8 @@ iso9660_fs_readdir (CdIo_t *p_cdio, const char psz_path[], bool b_mode2)
|
||||||
|
|
||||||
cdio_assert (offset == (p_stat->secsize[0] * ISO_BLOCKSIZE));
|
cdio_assert (offset == (p_stat->secsize[0] * ISO_BLOCKSIZE));
|
||||||
|
|
||||||
free (_dirbuf);
|
free(_dirbuf);
|
||||||
free (p_stat);
|
iso9660_stat_free(p_stat);
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1353,7 +1453,7 @@ iso9660_fs_readdir (CdIo_t *p_cdio, const char psz_path[], bool b_mode2)
|
||||||
Read psz_path (a directory) and return a list of iso9660_stat_t
|
Read psz_path (a directory) and return a list of iso9660_stat_t
|
||||||
of the files inside that. The caller must free the returned result.
|
of the files inside that. The caller must free the returned result.
|
||||||
*/
|
*/
|
||||||
CdioList_t *
|
CdioISO9660FileList_t *
|
||||||
iso9660_ifs_readdir (iso9660_t *p_iso, const char psz_path[])
|
iso9660_ifs_readdir (iso9660_t *p_iso, const char psz_path[])
|
||||||
{
|
{
|
||||||
iso9660_dir_t *p_iso9660_dir;
|
iso9660_dir_t *p_iso9660_dir;
|
||||||
|
@ -1367,8 +1467,7 @@ iso9660_ifs_readdir (iso9660_t *p_iso, const char psz_path[])
|
||||||
if (!p_stat) return NULL;
|
if (!p_stat) return NULL;
|
||||||
|
|
||||||
if (p_stat->type != _STAT_DIR) {
|
if (p_stat->type != _STAT_DIR) {
|
||||||
free(p_stat->rr.psz_symlink);
|
iso9660_stat_free(p_stat);
|
||||||
free(p_stat);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1383,9 +1482,8 @@ iso9660_ifs_readdir (iso9660_t *p_iso, const char psz_path[])
|
||||||
if (!dirbuf_len)
|
if (!dirbuf_len)
|
||||||
{
|
{
|
||||||
cdio_warn("Invalid directory buffer sector size %u", p_stat->secsize[0]);
|
cdio_warn("Invalid directory buffer sector size %u", p_stat->secsize[0]);
|
||||||
free(p_stat->rr.psz_symlink);
|
iso9660_stat_free(p_stat);
|
||||||
free(p_stat);
|
_cdio_list_free (retval, true, NULL);
|
||||||
_cdio_list_free (retval, true);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1393,17 +1491,15 @@ iso9660_ifs_readdir (iso9660_t *p_iso, const char psz_path[])
|
||||||
if (!_dirbuf)
|
if (!_dirbuf)
|
||||||
{
|
{
|
||||||
cdio_warn("Couldn't calloc(1, %lu)", (unsigned long)dirbuf_len);
|
cdio_warn("Couldn't calloc(1, %lu)", (unsigned long)dirbuf_len);
|
||||||
free(p_stat->rr.psz_symlink);
|
iso9660_stat_free(p_stat);
|
||||||
free(p_stat);
|
_cdio_list_free (retval, true, NULL);
|
||||||
_cdio_list_free (retval, true);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = iso9660_iso_seek_read (p_iso, _dirbuf, p_stat->lsn[0], p_stat->secsize[0]);
|
ret = iso9660_iso_seek_read (p_iso, _dirbuf, p_stat->lsn[0], p_stat->secsize[0]);
|
||||||
if (ret != dirbuf_len) {
|
if (ret != dirbuf_len) {
|
||||||
_cdio_list_free (retval, true);
|
_cdio_list_free (retval, true, NULL);
|
||||||
free(p_stat->rr.psz_symlink);
|
iso9660_stat_free(p_stat);
|
||||||
free(p_stat);
|
|
||||||
free (_dirbuf);
|
free (_dirbuf);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -1412,11 +1508,8 @@ iso9660_ifs_readdir (iso9660_t *p_iso, const char psz_path[])
|
||||||
{
|
{
|
||||||
p_iso9660_dir = (void *) &_dirbuf[offset];
|
p_iso9660_dir = (void *) &_dirbuf[offset];
|
||||||
|
|
||||||
if (!iso9660_get_dir_len(p_iso9660_dir))
|
if (iso9660_check_dir_block_end(p_iso9660_dir, &offset))
|
||||||
{
|
continue;
|
||||||
offset++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
p_iso9660_stat = _iso9660_dir_to_statbuf(p_iso9660_dir,
|
p_iso9660_stat = _iso9660_dir_to_statbuf(p_iso9660_dir,
|
||||||
p_iso9660_stat,
|
p_iso9660_stat,
|
||||||
|
@ -1433,11 +1526,10 @@ iso9660_ifs_readdir (iso9660_t *p_iso, const char psz_path[])
|
||||||
}
|
}
|
||||||
|
|
||||||
free (_dirbuf);
|
free (_dirbuf);
|
||||||
free(p_stat->rr.psz_symlink);
|
iso9660_stat_free(p_stat);
|
||||||
free (p_stat);
|
|
||||||
|
|
||||||
if (offset != dirbuf_len) {
|
if (offset != dirbuf_len) {
|
||||||
_cdio_list_free (retval, true);
|
_cdio_list_free (retval, true, (CdioDataFree_t) iso9660_stat_free);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1445,16 +1537,26 @@ iso9660_ifs_readdir (iso9660_t *p_iso, const char psz_path[])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef CdioList_t * (iso9660_readdir_t)
|
typedef CdioISO9660FileList_t * (iso9660_readdir_t)
|
||||||
(void *p_image, const char * psz_path);
|
(void *p_image, const char * psz_path);
|
||||||
|
|
||||||
|
CdioISO9660FileList_t *
|
||||||
|
iso9660_filelist_new(void) {
|
||||||
|
return (CdioISO9660FileList_t *) _cdio_list_new ();
|
||||||
|
}
|
||||||
|
|
||||||
|
CdioISO9660DirList_t *
|
||||||
|
iso9660_dirlist_new(void) {
|
||||||
|
return (CdioISO9660FileList_t *) _cdio_list_new ();
|
||||||
|
}
|
||||||
|
|
||||||
static iso9660_stat_t *
|
static iso9660_stat_t *
|
||||||
find_lsn_recurse (void *p_image, iso9660_readdir_t iso9660_readdir,
|
find_lsn_recurse (void *p_image, iso9660_readdir_t iso9660_readdir,
|
||||||
const char psz_path[], lsn_t lsn,
|
const char psz_path[], lsn_t lsn,
|
||||||
/*out*/ char **ppsz_full_filename)
|
/*out*/ char **ppsz_full_filename)
|
||||||
{
|
{
|
||||||
CdioList_t *entlist = iso9660_readdir (p_image, psz_path);
|
CdioISO9660FileList_t *entlist = iso9660_readdir (p_image, psz_path);
|
||||||
CdioList_t *dirlist = _cdio_list_new ();
|
CdioISO9660DirList_t *dirlist = iso9660_filelist_new();
|
||||||
CdioListNode_t *entnode;
|
CdioListNode_t *entnode;
|
||||||
|
|
||||||
cdio_assert (entlist != NULL);
|
cdio_assert (entlist != NULL);
|
||||||
|
@ -1470,33 +1572,36 @@ find_lsn_recurse (void *p_image, iso9660_readdir_t iso9660_readdir,
|
||||||
|
|
||||||
if (*ppsz_full_filename != NULL) free(*ppsz_full_filename);
|
if (*ppsz_full_filename != NULL) free(*ppsz_full_filename);
|
||||||
*ppsz_full_filename = calloc(1, len);
|
*ppsz_full_filename = calloc(1, len);
|
||||||
_snprintf (*ppsz_full_filename, len, "%s%s/", psz_path, psz_filename);
|
snprintf (*ppsz_full_filename, len, "%s%s/", psz_path, psz_filename);
|
||||||
|
|
||||||
if (statbuf->type == _STAT_DIR
|
if (statbuf->type == _STAT_DIR
|
||||||
&& strcmp ((char *) statbuf->filename, ".")
|
&& strcmp ((char *) statbuf->filename, ".")
|
||||||
&& strcmp ((char *) statbuf->filename, "..")) {
|
&& strcmp ((char *) statbuf->filename, "..")) {
|
||||||
|
snprintf (*ppsz_full_filename, len, "%s%s/", psz_path, psz_filename);
|
||||||
_cdio_list_append (dirlist, strdup(*ppsz_full_filename));
|
_cdio_list_append (dirlist, strdup(*ppsz_full_filename));
|
||||||
}
|
}
|
||||||
|
|
||||||
for (extent = 0; extent < statbuf->extents; extent++) {
|
for (extent = 0; extent < statbuf->extents; extent++) {
|
||||||
if (statbuf->lsn[extent] == lsn) {
|
if (statbuf->lsn[extent] == lsn) {
|
||||||
const unsigned int len2 = sizeof(iso9660_stat_t)+strlen(statbuf->filename)+1;
|
const unsigned int len2 = sizeof(iso9660_stat_t)+strlen(statbuf->filename)+1;
|
||||||
iso9660_stat_t *ret_stat = calloc(1, len2);
|
iso9660_stat_t *ret_stat = calloc(1, len2);
|
||||||
if (!ret_stat) {
|
if (!ret_stat) {
|
||||||
_cdio_list_free (dirlist, true);
|
iso9660_dirlist_free(dirlist);
|
||||||
cdio_warn("Couldn't calloc(1, %d)", len2);
|
cdio_warn("Couldn't calloc(1, %d)", len2);
|
||||||
return NULL;
|
free(*ppsz_full_filename);
|
||||||
}
|
*ppsz_full_filename = NULL;
|
||||||
memcpy(ret_stat, statbuf, len2);
|
return NULL;
|
||||||
_cdio_list_free (entlist, true);
|
}
|
||||||
_cdio_list_free (dirlist, true);
|
memcpy(ret_stat, statbuf, len2);
|
||||||
|
iso9660_filelist_free (entlist);
|
||||||
|
iso9660_dirlist_free(dirlist);
|
||||||
return ret_stat;
|
return ret_stat;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
_cdio_list_free (entlist, true);
|
iso9660_filelist_free (entlist);
|
||||||
|
|
||||||
/* now recurse/descend over directories encountered */
|
/* now recurse/descend over directories encountered */
|
||||||
|
|
||||||
|
@ -1511,7 +1616,7 @@ find_lsn_recurse (void *p_image, iso9660_readdir_t iso9660_readdir,
|
||||||
ppsz_full_filename);
|
ppsz_full_filename);
|
||||||
|
|
||||||
if (NULL != ret_stat) {
|
if (NULL != ret_stat) {
|
||||||
_cdio_list_free (dirlist, true);
|
iso9660_dirlist_free(dirlist);
|
||||||
return ret_stat;
|
return ret_stat;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1520,7 +1625,7 @@ find_lsn_recurse (void *p_image, iso9660_readdir_t iso9660_readdir,
|
||||||
free(*ppsz_full_filename);
|
free(*ppsz_full_filename);
|
||||||
*ppsz_full_filename = NULL;
|
*ppsz_full_filename = NULL;
|
||||||
}
|
}
|
||||||
_cdio_list_free (dirlist, true);
|
iso9660_dirlist_free(dirlist);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1534,15 +1639,27 @@ iso9660_stat_t *
|
||||||
iso9660_fs_find_lsn(CdIo_t *p_cdio, lsn_t i_lsn)
|
iso9660_fs_find_lsn(CdIo_t *p_cdio, lsn_t i_lsn)
|
||||||
{
|
{
|
||||||
char *psz_full_filename = NULL;
|
char *psz_full_filename = NULL;
|
||||||
return find_lsn_recurse (p_cdio, (iso9660_readdir_t *) iso9660_fs_readdir,
|
iso9660_stat_t * p_statbuf;
|
||||||
"/", i_lsn, &psz_full_filename);
|
p_statbuf = find_lsn_recurse (p_cdio, (iso9660_readdir_t *) iso9660_fs_readdir,
|
||||||
|
"/", i_lsn, &psz_full_filename);
|
||||||
|
if (psz_full_filename != NULL)
|
||||||
|
free(psz_full_filename);
|
||||||
|
return p_statbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Given a directory pointer, find the filesystem entry that contains
|
Given a directory pointer, find the filesystem entry that contains
|
||||||
lsn and return information about it.
|
LSN and return information about it.
|
||||||
|
|
||||||
Returns stat_t of entry if we found lsn, or NULL otherwise.
|
@param p_iso the ISO-9660 file image to get data from.
|
||||||
|
@param i_lsn the LSN to find
|
||||||
|
@param ppsz_full_filename the place to store the name of the path that has LSN.
|
||||||
|
On entry this should point to NULL. If not, the value will be freed.
|
||||||
|
On exit a value is malloc'd and the caller is responsible for
|
||||||
|
freeing the result.
|
||||||
|
|
||||||
|
@return stat_t of entry if we found lsn, or NULL otherwise.
|
||||||
|
Caller must free return value using iso9660_stat_free().
|
||||||
*/
|
*/
|
||||||
iso9660_stat_t *
|
iso9660_stat_t *
|
||||||
iso9660_fs_find_lsn_with_path(CdIo_t *p_cdio, lsn_t i_lsn,
|
iso9660_fs_find_lsn_with_path(CdIo_t *p_cdio, lsn_t i_lsn,
|
||||||
|
@ -1556,21 +1673,40 @@ iso9660_fs_find_lsn_with_path(CdIo_t *p_cdio, lsn_t i_lsn,
|
||||||
Given a directory pointer, find the filesystem entry that contains
|
Given a directory pointer, find the filesystem entry that contains
|
||||||
lsn and return information about it.
|
lsn and return information about it.
|
||||||
|
|
||||||
Returns stat_t of entry if we found lsn, or NULL otherwise.
|
@param p_iso the ISO-9660 file image to get data from.
|
||||||
|
|
||||||
|
@param i_lsn the LSN to find
|
||||||
|
|
||||||
|
@return stat_t of entry if we found lsn, or NULL otherwise.
|
||||||
|
Caller must free return value using iso9660_stat_free().
|
||||||
*/
|
*/
|
||||||
iso9660_stat_t *
|
iso9660_stat_t *
|
||||||
iso9660_ifs_find_lsn(iso9660_t *p_iso, lsn_t i_lsn)
|
iso9660_ifs_find_lsn(iso9660_t *p_iso, lsn_t i_lsn)
|
||||||
{
|
{
|
||||||
char *psz_full_filename = NULL;
|
char *psz_full_filename = NULL;
|
||||||
return find_lsn_recurse (p_iso, (iso9660_readdir_t *) iso9660_ifs_readdir,
|
iso9660_stat_t *ret =
|
||||||
"/", i_lsn, &psz_full_filename);
|
find_lsn_recurse (p_iso, (iso9660_readdir_t *) iso9660_ifs_readdir,
|
||||||
|
"/", i_lsn, &psz_full_filename);
|
||||||
|
if (psz_full_filename != NULL)
|
||||||
|
free(psz_full_filename);
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Given a directory pointer, find the filesystem entry that contains
|
Given a directory pointer, find the filesystem entry that contains
|
||||||
lsn and return information about it.
|
lsn and return information about it.
|
||||||
|
|
||||||
Returns stat_t of entry if we found lsn, or NULL otherwise.
|
@param p_iso pointer to iso_t
|
||||||
|
|
||||||
|
@param i_lsn LSN to find
|
||||||
|
|
||||||
|
@param ppsz_path full path of lsn filename. On entry *ppsz_path should be
|
||||||
|
NULL. On return it will be allocated an point to the full path of the
|
||||||
|
file at lsn or NULL if the lsn is not found. You should deallocate
|
||||||
|
*ppsz_path when you are done using it.
|
||||||
|
|
||||||
|
@return stat_t of entry if we found lsn, or NULL otherwise.
|
||||||
|
Caller must free return value using iso9660_stat_free().
|
||||||
*/
|
*/
|
||||||
iso9660_stat_t *
|
iso9660_stat_t *
|
||||||
iso9660_ifs_find_lsn_with_path(iso9660_t *p_iso, lsn_t i_lsn,
|
iso9660_ifs_find_lsn_with_path(iso9660_t *p_iso, lsn_t i_lsn,
|
||||||
|
@ -1582,14 +1718,38 @@ iso9660_ifs_find_lsn_with_path(iso9660_t *p_iso, lsn_t i_lsn,
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Free the passed iso9660_stat_t structure.
|
Free the passed iso9660_stat_t structure.
|
||||||
|
|
||||||
|
@param p_stat iso9660 stat buffer to free.
|
||||||
|
|
||||||
*/
|
*/
|
||||||
void
|
void
|
||||||
iso9660_stat_free(iso9660_stat_t *p_stat)
|
iso9660_stat_free(iso9660_stat_t *p_stat)
|
||||||
{
|
{
|
||||||
if (p_stat != NULL)
|
if (p_stat != NULL) {
|
||||||
|
if (p_stat->rr.psz_symlink) {
|
||||||
|
CDIO_FREE_IF_NOT_NULL(p_stat->rr.psz_symlink);
|
||||||
|
}
|
||||||
free(p_stat);
|
free(p_stat);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Free the passed CdioISOC9660FileList_t structure.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
iso9660_filelist_free(CdioISO9660FileList_t *p_filelist) {
|
||||||
|
_cdio_list_free(p_filelist, true, (CdioDataFree_t) iso9660_stat_free);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*!
|
||||||
|
Free the passed CdioISOC9660DirList_t structure.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
iso9660_dirlist_free(CdioISO9660DirList_t *p_filelist) {
|
||||||
|
_cdio_list_free(p_filelist, true, free);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
Return true if ISO 9660 image has extended attrributes (XA).
|
Return true if ISO 9660 image has extended attrributes (XA).
|
||||||
*/
|
*/
|
||||||
|
@ -1624,36 +1784,41 @@ iso_have_rr_traverse (iso9660_t *p_iso, const iso9660_stat_t *_root,
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = iso9660_iso_seek_read (p_iso, _dirbuf, _root->lsn[0], _root->secsize[0]);
|
ret = iso9660_iso_seek_read (p_iso, _dirbuf, _root->lsn[0], _root->secsize[0]);
|
||||||
if (ret!=ISO_BLOCKSIZE*_root->secsize[0]) return false;
|
if (ret!=ISO_BLOCKSIZE*_root->secsize[0]) {
|
||||||
|
free(_dirbuf);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
while (offset < (_root->secsize[0] * ISO_BLOCKSIZE))
|
while (offset < (_root->secsize[0] * ISO_BLOCKSIZE))
|
||||||
{
|
{
|
||||||
iso9660_dir_t *p_iso9660_dir = (void *) &_dirbuf[offset];
|
iso9660_dir_t *p_iso9660_dir = (void *) &_dirbuf[offset];
|
||||||
iso9660_stat_t *p_stat;
|
iso9660_stat_t *p_stat;
|
||||||
|
unsigned int i_last_component = 1;
|
||||||
|
|
||||||
if (!iso9660_get_dir_len(p_iso9660_dir))
|
if (iso9660_check_dir_block_end(p_iso9660_dir, &offset))
|
||||||
{
|
continue;
|
||||||
offset++;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
p_stat = _iso9660_dir_to_statbuf (p_iso9660_dir, NULL, p_iso->b_xa,
|
p_stat = _iso9660_dir_to_statbuf (p_iso9660_dir, NULL, p_iso->b_xa,
|
||||||
p_iso->u_joliet_level);
|
p_iso->u_joliet_level);
|
||||||
have_rr = p_stat->rr.b3_rock;
|
have_rr = p_stat->rr.b3_rock;
|
||||||
if ( have_rr != yep) {
|
if ( have_rr != yep) {
|
||||||
have_rr = iso_have_rr_traverse (p_iso, p_stat, &splitpath[1], pu_file_limit);
|
if (strlen(splitpath[0]) == 0)
|
||||||
|
have_rr = false;
|
||||||
|
else
|
||||||
|
have_rr = iso_have_rr_traverse (p_iso, p_stat, &splitpath[i_last_component],
|
||||||
|
pu_file_limit);
|
||||||
}
|
}
|
||||||
free(p_stat);
|
free(p_stat);
|
||||||
if (have_rr != nope) {
|
if (have_rr != nope) {
|
||||||
free (_dirbuf);
|
free (_dirbuf);
|
||||||
return have_rr;
|
return have_rr;
|
||||||
}
|
}
|
||||||
|
|
||||||
offset += iso9660_get_dir_len(p_iso9660_dir);
|
offset += iso9660_get_dir_len(p_iso9660_dir);
|
||||||
*pu_file_limit = (*pu_file_limit)-1;
|
*pu_file_limit = (*pu_file_limit)-1;
|
||||||
if ((*pu_file_limit) == 0) {
|
if ((*pu_file_limit) == 0) {
|
||||||
free (_dirbuf);
|
free (_dirbuf);
|
||||||
return dunno;
|
return dunno;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1694,7 +1859,8 @@ iso9660_have_rr(iso9660_t *p_iso, uint64_t u_file_limit)
|
||||||
|
|
||||||
is_rr = iso_have_rr_traverse (p_iso, p_root, p_psz_splitpath, &u_file_limit);
|
is_rr = iso_have_rr_traverse (p_iso, p_root, p_psz_splitpath, &u_file_limit);
|
||||||
free(p_root);
|
free(p_root);
|
||||||
// _cdio_strfreev (p_psz_splitpath);
|
free(p_psz_splitpath[0]);
|
||||||
|
free(p_psz_splitpath[1]);
|
||||||
|
|
||||||
return is_rr;
|
return is_rr;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
/*
|
/*
|
||||||
Copyright (C) 2005, 2008, 2010-2011, 2014 Rocky Bernstein <rocky@gnu.org>
|
Copyright (C) 2005, 2008, 2010-2011, 2014, 2017 Rocky Bernstein
|
||||||
|
<rocky@gnu.org>
|
||||||
|
|
||||||
Adapted from GNU/Linux fs/isofs/rock.c (C) 1992, 1993 Eric Youngdale
|
Adapted from GNU/Linux fs/isofs/rock.c (C) 1992, 1993 Eric Youngdale
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
@ -169,26 +171,12 @@ get_rock_ridge_filename(iso9660_dir_t * p_iso9660_dir,
|
||||||
while (len > 1){ /* There may be one byte for padding somewhere */
|
while (len > 1){ /* There may be one byte for padding somewhere */
|
||||||
rr = (iso_extension_record_t *) chr;
|
rr = (iso_extension_record_t *) chr;
|
||||||
sig = *chr+(*(chr+1) << 8);
|
sig = *chr+(*(chr+1) << 8);
|
||||||
switch(sig){
|
|
||||||
case SIG('S','P'):
|
/* We used to check for some vaid values of SIG, specifically
|
||||||
case SIG('C','E'):
|
SP, CE, ER, RR, PX, PN, SL, NM, CL, PL, TF, and ZF.
|
||||||
case SIG('E','R'):
|
However there are various extensions to this set. So we
|
||||||
case SIG('R','R'):
|
skip checking now.
|
||||||
case SIG('P','X'):
|
*/
|
||||||
case SIG('P','N'):
|
|
||||||
case SIG('S','L'):
|
|
||||||
case SIG('N','M'):
|
|
||||||
case SIG('C','L'):
|
|
||||||
case SIG('P','L'):
|
|
||||||
case SIG('T','F'):
|
|
||||||
case SIG('Z','F'):
|
|
||||||
case SIG('A','L'): // libburnia's AAIP extension (used by Kali Linux)
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
/* Warn about other Rock Ridge extensions */
|
|
||||||
cdio_warn("Unsupported Rock Ridge extension detected: '%c%c'\n", *chr, *(chr+1));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rr->len == 0) goto out; /* Something got screwed up here */
|
if (rr->len == 0) goto out; /* Something got screwed up here */
|
||||||
chr += rr->len;
|
chr += rr->len;
|
||||||
|
@ -434,8 +422,9 @@ parse_rock_ridge_stat_internal(iso9660_dir_t *p_iso9660_dir,
|
||||||
switch(p_sl->flags &~1){
|
switch(p_sl->flags &~1){
|
||||||
case 0:
|
case 0:
|
||||||
realloc_symlink(p_stat, p_sl->len);
|
realloc_symlink(p_stat, p_sl->len);
|
||||||
memcpy(&(p_stat->rr.psz_symlink[p_stat->rr.i_symlink]),
|
if (p_sl->text && p_sl->len)
|
||||||
p_sl->text, p_sl->len);
|
memcpy(&(p_stat->rr.psz_symlink[p_stat->rr.i_symlink]),
|
||||||
|
p_sl->text, p_sl->len);
|
||||||
p_stat->rr.i_symlink += p_sl->len;
|
p_stat->rr.i_symlink += p_sl->len;
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
Copyright (C) 2005-2006, 2008, 2011, 2013-2014
|
Copyright (C) 2005-2006, 2008, 2011, 2013-2014, 2017
|
||||||
Rocky Bernstein <rocky@gnu.org>
|
Rocky Bernstein <rocky@gnu.org>
|
||||||
|
|
||||||
This program is free software: you can redistribute it and/or modify
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
@ -47,6 +47,8 @@
|
||||||
# define __CDIO_CONFIG_H__ 1
|
# define __CDIO_CONFIG_H__ 1
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <cdio/util.h>
|
||||||
|
|
||||||
#ifdef HAVE_STDIO_H
|
#ifdef HAVE_STDIO_H
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -634,7 +636,7 @@ udf_get_root (udf_t *p_udf, bool b_any_partition, partition_num_t i_partition)
|
||||||
}
|
}
|
||||||
|
|
||||||
#define free_and_null(x) \
|
#define free_and_null(x) \
|
||||||
free(x); \
|
CDIO_FREE_IF_NOT_NULL(x); \
|
||||||
x=NULL
|
x=NULL
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
|
|
10
src/rufus.rc
10
src/rufus.rc
|
@ -33,7 +33,7 @@ LANGUAGE LANG_NEUTRAL, SUBLANG_NEUTRAL
|
||||||
IDD_DIALOG DIALOGEX 12, 12, 232, 326
|
IDD_DIALOG DIALOGEX 12, 12, 232, 326
|
||||||
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
STYLE DS_SETFONT | DS_MODALFRAME | DS_CENTER | WS_MINIMIZEBOX | WS_POPUP | WS_CAPTION | WS_SYSMENU
|
||||||
EXSTYLE WS_EX_ACCEPTFILES
|
EXSTYLE WS_EX_ACCEPTFILES
|
||||||
CAPTION "Rufus 3.0.1306"
|
CAPTION "Rufus 3.0.1307"
|
||||||
FONT 9, "Segoe UI Symbol", 400, 0, 0x0
|
FONT 9, "Segoe UI Symbol", 400, 0, 0x0
|
||||||
BEGIN
|
BEGIN
|
||||||
LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP
|
LTEXT "Drive Properties",IDS_DRIVE_PROPERTIES_TXT,8,6,53,12,NOT WS_GROUP
|
||||||
|
@ -389,8 +389,8 @@ END
|
||||||
//
|
//
|
||||||
|
|
||||||
VS_VERSION_INFO VERSIONINFO
|
VS_VERSION_INFO VERSIONINFO
|
||||||
FILEVERSION 3,0,1306,0
|
FILEVERSION 3,0,1307,0
|
||||||
PRODUCTVERSION 3,0,1306,0
|
PRODUCTVERSION 3,0,1307,0
|
||||||
FILEFLAGSMASK 0x3fL
|
FILEFLAGSMASK 0x3fL
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
FILEFLAGS 0x1L
|
FILEFLAGS 0x1L
|
||||||
|
@ -407,13 +407,13 @@ BEGIN
|
||||||
BEGIN
|
BEGIN
|
||||||
VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)"
|
VALUE "CompanyName", "Akeo Consulting (http://akeo.ie)"
|
||||||
VALUE "FileDescription", "Rufus"
|
VALUE "FileDescription", "Rufus"
|
||||||
VALUE "FileVersion", "3.0.1306"
|
VALUE "FileVersion", "3.0.1307"
|
||||||
VALUE "InternalName", "Rufus"
|
VALUE "InternalName", "Rufus"
|
||||||
VALUE "LegalCopyright", "© 2011-2018 Pete Batard (GPL v3)"
|
VALUE "LegalCopyright", "© 2011-2018 Pete Batard (GPL v3)"
|
||||||
VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html"
|
VALUE "LegalTrademarks", "http://www.gnu.org/copyleft/gpl.html"
|
||||||
VALUE "OriginalFilename", "rufus.exe"
|
VALUE "OriginalFilename", "rufus.exe"
|
||||||
VALUE "ProductName", "Rufus"
|
VALUE "ProductName", "Rufus"
|
||||||
VALUE "ProductVersion", "3.0.1306"
|
VALUE "ProductVersion", "3.0.1307"
|
||||||
END
|
END
|
||||||
END
|
END
|
||||||
BLOCK "VarFileInfo"
|
BLOCK "VarFileInfo"
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue