Disable mixing of DMA and FIFO messages in the Solaris ESP kernel module.
[openbios.git] / fs / iso9660 / iso9660_opendir.c
blob49eab4b4235af38ab3d018f09f36be746167346e
1 /*
3 * (c) 2005-2009 Laurent Vivier <Laurent@vivier.eu>
5 * This file has been copied from EMILE, http://emile.sf.net
7 */
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)
18 iso9660_DIR *dir;
20 dir = (iso9660_DIR*)malloc(sizeof(iso9660_DIR));
21 if (dir == NULL)
22 return NULL;
24 dir->extent = isonum_733((char *)node->extent);
25 dir->len = isonum_733((char *)node->size);
26 dir->index = sizeof (dir->buffer);
27 dir->volume = volume;
29 return dir;
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);
40 return result;
43 static struct iso_directory_record * seek_name(iso9660_VOLUME *volume,
44 struct iso_directory_record *idr,
45 char *name)
47 struct iso_directory_record *result;
48 char name_buf[256];
49 iso9660_DIR *dir;
51 dir = iso9660_opendir_node(volume, idr);
52 if (dir == NULL)
53 return NULL;
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);
62 return result;
65 iso9660_closedir(dir);
66 return NULL;
69 struct iso_directory_record* iso9660_get_node(
70 iso9660_VOLUME *volume,
71 struct iso_directory_record *dirnode,
72 const char *path)
74 struct iso_directory_record* result;
75 struct iso_directory_record* current;
76 char name[256];
77 int i;
79 current = idr_new(dirnode);
80 while(1)
82 /* ignore head '\' */
84 while (*path && *path == '\\')
85 path++;
87 if (*path == 0)
88 break;
90 /* extract first path component */
92 i = 0;
93 while (*path && *path != '\\')
94 name[i++] = *path++;
95 name[i] = 0;
97 /* seek first component in current directory */
99 result = seek_name(volume, current, name);
100 if (result == NULL)
101 return NULL;
103 free(current);
104 current = result;
106 return current;
109 iso9660_DIR* iso9660_opendir(iso9660_VOLUME *volume, const char *name)
111 iso9660_DIR *dir;
112 struct iso_directory_record *node;
114 node = iso9660_get_root_node((iso9660_VOLUME*)volume);
115 if (node == NULL)
116 return NULL;
118 node = iso9660_get_node((iso9660_VOLUME*)volume, node, name);
119 if (node == NULL)
120 return NULL;
121 if (!iso9660_is_directory(node)) {
122 free(node);
123 return NULL;
126 dir = iso9660_opendir_node((iso9660_VOLUME*)volume, node);
128 free(node);
130 dir->volume = (iso9660_VOLUME*)volume;
132 return dir;