UDF fixes.
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
$Id: udf.c,v 1.8 2005/11/01 03:14:50 rocky Exp $
|
||||
$Id: udf.c,v 1.9 2006/04/11 00:26:54 rocky Exp $
|
||||
|
||||
Copyright (C) 2005 Rocky Bernstein <rocky@panix.com>
|
||||
|
||||
@@ -35,11 +35,12 @@
|
||||
to the enumeration value names in the typedefs above in a debugger
|
||||
and debugger expressions
|
||||
*/
|
||||
tag_id_t debug_tagid;
|
||||
file_characteristics_t debug_file_characteristics;
|
||||
udf_enum1_t debug_udf_enum1;
|
||||
icbtag_file_type_enum_t debug_icbtag_file_type_enum;
|
||||
ecma_167_enum1_t ecma167_enum1;
|
||||
tag_id_t debug_tagid;
|
||||
file_characteristics_t debug_file_characteristics;
|
||||
udf_enum1_t debug_udf_enum1;
|
||||
icbtag_file_type_enum_t debug_icbtag_file_type_enum;
|
||||
icbtag_flag_enum_t debug_flag_enum;
|
||||
ecma_167_enum1_t ecma167_enum1;
|
||||
ecma_167_timezone_enum_t debug_ecma_167_timezone_enum;
|
||||
|
||||
/*!
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
$Id: udf_file.c,v 1.6 2006/01/26 04:41:50 rocky Exp $
|
||||
$Id: udf_file.c,v 1.7 2006/04/11 00:26:54 rocky Exp $
|
||||
|
||||
Copyright (C) 2005 Rocky Bernstein <rocky@panix.com>
|
||||
|
||||
@@ -26,6 +26,8 @@
|
||||
# include <string.h>
|
||||
#endif
|
||||
|
||||
#include <stdio.h> /* Remove when adding cdio/logging.h */
|
||||
|
||||
const char *
|
||||
udf_get_filename(const udf_dirent_t *p_udf_dirent)
|
||||
{
|
||||
@@ -102,6 +104,21 @@ driver_return_code_t
|
||||
udf_read_block(const udf_dirent_t *p_udf_dirent, void * buf, size_t count)
|
||||
{
|
||||
const udf_t *p_udf = p_udf_dirent->p_udf;
|
||||
return udf_read_sectors(p_udf, buf,
|
||||
p_udf->i_part_start+p_udf_dirent->dir_lba, count);
|
||||
uint8_t data[UDF_BLOCKSIZE];
|
||||
udf_file_entry_t *p_udf_fe = (udf_file_entry_t *) data;
|
||||
driver_return_code_t ret =
|
||||
udf_read_sectors(p_udf, data, p_udf_dirent->fe.unique_ID, 1);
|
||||
if (ret == DRIVER_OP_SUCCESS &&
|
||||
!udf_checktag(&p_udf_fe->tag, TAGID_FILE_ENTRY)) {
|
||||
uint32_t i_lba_start, i_lba_end;
|
||||
udf_get_lba( p_udf_fe, &i_lba_start, &i_lba_end);
|
||||
|
||||
if ( (i_lba_end - i_lba_start+1) < count ) {
|
||||
printf("Warning: don't know how to handle yet\n" );
|
||||
count = i_lba_end - i_lba_start+1;
|
||||
}
|
||||
return udf_read_sectors(p_udf, buf, p_udf->i_part_start+i_lba_start,
|
||||
count);
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
$Id: udf_fs.c,v 1.15 2006/03/18 00:53:20 rocky Exp $
|
||||
$Id: udf_fs.c,v 1.16 2006/04/11 00:26:54 rocky Exp $
|
||||
|
||||
Copyright (C) 2005 Rocky Bernstein <rocky@panix.com>
|
||||
|
||||
@@ -121,7 +121,7 @@ udf_new_dirent(udf_file_entry_t *p_udf_fe, udf_t *p_udf,
|
||||
* Check the descriptor tag for both the correct id and correct checksum.
|
||||
* Return zero if all is good, -1 if not.
|
||||
*/
|
||||
static int
|
||||
int
|
||||
udf_checktag(udf_tag_t *p_tag, udf_Uint16_t tag_id)
|
||||
{
|
||||
uint8_t *itag;
|
||||
@@ -278,8 +278,8 @@ udf_new_dirent(udf_file_entry_t *p_udf_fe, udf_t *p_udf,
|
||||
p_udf_dirent->dir_left = uint64_from_le(p_udf_fe->info_len);
|
||||
|
||||
memcpy(&(p_udf_dirent->fe), p_udf_fe, sizeof(udf_file_entry_t));
|
||||
udf_get_lba( p_udf_fe, &(p_udf_dirent->dir_lba),
|
||||
&(p_udf_dirent->dir_end_lba) );
|
||||
udf_get_lba( p_udf_fe, &(p_udf_dirent->i_loc),
|
||||
&(p_udf_dirent->i_loc_end) );
|
||||
return p_udf_dirent;
|
||||
}
|
||||
|
||||
@@ -603,14 +603,14 @@ udf_readdir(udf_dirent_t *p_udf_dirent)
|
||||
|
||||
if (!p_udf_dirent->fid) {
|
||||
uint32_t i_sectors =
|
||||
(p_udf_dirent->dir_end_lba - p_udf_dirent->dir_lba + 1);
|
||||
(p_udf_dirent->i_loc_end - p_udf_dirent->i_loc + 1);
|
||||
uint32_t size = UDF_BLOCKSIZE * i_sectors;
|
||||
driver_return_code_t i_ret;
|
||||
|
||||
if (!p_udf_dirent->sector)
|
||||
p_udf_dirent->sector = (uint8_t*) malloc(size);
|
||||
i_ret = udf_read_sectors(p_udf, p_udf_dirent->sector,
|
||||
p_udf_dirent->i_part_start+p_udf_dirent->dir_lba,
|
||||
p_udf_dirent->i_part_start+p_udf_dirent->i_loc,
|
||||
i_sectors);
|
||||
if (DRIVER_OP_SUCCESS == i_ret)
|
||||
p_udf_dirent->fid = (udf_fileid_desc_t *) p_udf_dirent->sector;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
$Id: udf_private.h,v 1.6 2006/01/26 04:41:50 rocky Exp $
|
||||
$Id: udf_private.h,v 1.7 2006/04/11 00:26:54 rocky Exp $
|
||||
|
||||
Copyright (C) 2005, 2006 Rocky Bernstein <rocky@panix.com>
|
||||
|
||||
@@ -55,7 +55,7 @@ struct udf_dirent_s
|
||||
be true. */
|
||||
udf_t *p_udf;
|
||||
uint32_t i_part_start;
|
||||
uint32_t dir_lba, dir_end_lba;
|
||||
uint32_t i_loc, i_loc_end;
|
||||
uint64_t dir_left;
|
||||
uint8_t *sector;
|
||||
udf_file_entry_t fe;
|
||||
@@ -65,6 +65,13 @@ struct udf_dirent_s
|
||||
bool udf_get_lba(const udf_file_entry_t *p_udf_fe,
|
||||
/*out*/ uint32_t *start, /*out*/ uint32_t *end);
|
||||
|
||||
/* FIXME createudf_fs.h and put this in there. */
|
||||
/**
|
||||
* Check the descriptor tag for both the correct id and correct checksum.
|
||||
* Return zero if all is good, -1 if not.
|
||||
*/
|
||||
int udf_checktag(udf_tag_t *p_tag, udf_Uint16_t tag_id);
|
||||
|
||||
#endif /* __CDIO_UDF_PRIVATE_H__ */
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user