diff --git a/example/udf1.c b/example/udf1.c index e2966684..5b544ecc 100644 --- a/example/udf1.c +++ b/example/udf1.c @@ -1,5 +1,5 @@ /* - $Id: udf1.c,v 1.2 2005/10/24 10:14:57 rocky Exp $ + $Id: udf1.c,v 1.3 2005/10/25 01:19:48 rocky Exp $ Copyright (C) 2005 Rocky Bernstein @@ -52,28 +52,28 @@ static udf_file_t * -list_directory(const udf_t *p_udf, udf_file_t *p_udf_file, - const char *psz_token) +list_files(const udf_t *p_udf, udf_file_t *p_udf_file, char *psz_token) { if (!p_udf_file) return NULL; + if (psz_token) printf("%s\n", psz_token); while (udf_get_next(p_udf, p_udf_file)) { - printf("%s\n", psz_token); - if (strcmp(psz_token, udf_get_name(p_udf_file)) == 0) { - const char *next_tok = strtok(NULL, udf_PATH_DELIMITERS); + char *next_tok = strtok(psz_token, udf_PATH_DELIMITERS); - if (udf_is_dir(p_udf_file)) { - udf_file_t * p_udf_file2 = udf_get_sub(p_udf, p_udf_file); + if (udf_is_dir(p_udf_file)) { + udf_file_t * p_udf_file2 = udf_get_sub(p_udf, p_udf_file); + + if (p_udf_file2) { + udf_file_t *p_udf_file3 = + list_files(p_udf, p_udf_file2, next_tok); - if (p_udf_file2) { - udf_file_t *p_udf_file3 = - list_directory(p_udf, p_udf_file2, next_tok); - - if (!p_udf_file3) udf_file_free(p_udf_file2); - return p_udf_file3; - } + if (!p_udf_file3) udf_file_free(p_udf_file2); + udf_file_free(p_udf_file3); } + } else { + printf("%s\n", udf_get_name(p_udf_file)); } } + free(psz_token); return p_udf_file; } @@ -102,8 +102,8 @@ main(int argc, const char *argv[]) return 1; } - list_directory(p_udf, p_udf_file, udf_get_name(p_udf_file)); - /* Go over: udf_file_free(p_udf_file);*/ + list_files(p_udf, p_udf_file, strdup(udf_get_name(p_udf_file))); + udf_file_free(p_udf_file); } udf_close(p_udf); diff --git a/lib/udf/udf_fs.c b/lib/udf/udf_fs.c index b83eadac..622b2f6c 100644 --- a/lib/udf/udf_fs.c +++ b/lib/udf/udf_fs.c @@ -1,5 +1,5 @@ /* - $Id: udf_fs.c,v 1.3 2005/10/24 10:14:58 rocky Exp $ + $Id: udf_fs.c,v 1.4 2005/10/25 01:19:48 rocky Exp $ Copyright (C) 2005 Rocky Bernstein @@ -251,18 +251,21 @@ udf_find_file(udf_t *p_udf, const char *psz_name, bool b_any_partition, Wonder if iconv can be used here */ static int -unicode16_decode( uint8_t *data, int len, char *target ) +unicode16_decode( uint8_t *data, int len, char **ppsz_target ) { int p = 1, i = 0; + if (strlen(*ppsz_target) < len) + *ppsz_target = realloc(*ppsz_target, sizeof(char)*len+1); + if( ( data[ 0 ] == 8 ) || ( data[ 0 ] == 16 ) ) do { if( data[ 0 ] == 16 ) p++; /* Ignore MSB of unicode16 */ if( p < len ) { - target[ i++ ] = data[ p++ ]; + (*ppsz_target)[ i++ ] = data[ p++ ]; } } while( p < len ); - target[ i ] = '\0'; + (*ppsz_target)[ i ] = '\0'; return 0; } @@ -493,7 +496,7 @@ udf_close (udf_t *p_udf) udf_file_t * udf_get_sub(const udf_t *p_udf, const udf_file_t *p_udf_file) { - if (p_udf_file->b_dir && p_udf_file->fid) { + if (p_udf_file->b_dir && !p_udf_file->b_parent && p_udf_file->fid) { uint8_t data[UDF_BLOCKSIZE]; udf_file_entry_t *p_fe = (udf_file_entry_t *) &data; @@ -561,7 +564,7 @@ udf_get_next(const udf_t *p_udf, udf_file_t *p_udf_file) p_udf_file->b_parent = (p_udf_file->fid->file_characteristics & UDF_FILE_PARENT) != 0; unicode16_decode(p_udf_file->fid->imp_use + p_udf_file->fid->i_imp_use, - p_udf_file->fid->i_file_id, p_udf_file->psz_name); + p_udf_file->fid->i_file_id, &(p_udf_file->psz_name)); return p_udf_file; } return NULL;