3 * (c) 2005-2009 Laurent Vivier <Laurent@vivier.eu>
5 * This file has been copied from EMILE, http://emile.sf.net
9 #include "libiso9660.h"
11 static inline int iso9660_is_directory(struct iso_directory_record
* idr
)
13 return ((idr
->flags
[0] & 2) != 0);
16 static iso9660_DIR
* iso9660_opendir_node(iso9660_VOLUME
*volume
, struct iso_directory_record
*node
)
20 dir
= (iso9660_DIR
*)malloc(sizeof(iso9660_DIR
));
24 dir
->extent
= isonum_733((char *)node
->extent
);
25 dir
->len
= isonum_733((char *)node
->size
);
26 dir
->index
= sizeof (dir
->buffer
);
32 static struct iso_directory_record
* idr_new(struct iso_directory_record
* idr
)
34 struct iso_directory_record
* result
;
35 int size
= sizeof(*idr
) + (int)idr
->name_len
[0];
37 result
= (struct iso_directory_record
*)malloc(size
);
38 memcpy(result
, idr
, size
);
43 static struct iso_directory_record
* seek_name(iso9660_VOLUME
*volume
,
44 struct iso_directory_record
*idr
,
47 struct iso_directory_record
*result
;
51 dir
= iso9660_opendir_node(volume
, idr
);
55 while ((idr
= iso9660_readdir(dir
)) != NULL
)
57 iso9660_name(volume
, idr
, name_buf
);
58 if (strcasecmp(name
, name_buf
) == 0)
60 result
= idr_new(idr
);
61 iso9660_closedir(dir
);
65 iso9660_closedir(dir
);
69 struct iso_directory_record
* iso9660_get_node(
70 iso9660_VOLUME
*volume
,
71 struct iso_directory_record
*dirnode
,
74 struct iso_directory_record
* result
;
75 struct iso_directory_record
* current
;
79 current
= idr_new(dirnode
);
84 while (*path
&& *path
== '\\')
90 /* extract first path component */
93 while (*path
&& *path
!= '\\')
97 /* seek first component in current directory */
99 result
= seek_name(volume
, current
, name
);
109 iso9660_DIR
* iso9660_opendir(iso9660_VOLUME
*volume
, const char *name
)
112 struct iso_directory_record
*node
;
114 node
= iso9660_get_root_node((iso9660_VOLUME
*)volume
);
118 node
= iso9660_get_node((iso9660_VOLUME
*)volume
, node
, name
);
121 if (!iso9660_is_directory(node
)) {
126 dir
= iso9660_opendir_node((iso9660_VOLUME
*)volume
, node
);
130 dir
->volume
= (iso9660_VOLUME
*)volume
;