28 if (sua_offset % 2 != 0)
32 if (sua_offset >= total_len)
36 uint8_t sua_len = total_len - sua_offset;
42 while (i + 4 <= sua_len) {
52 if (sig0 ==
'S' && sig1 ==
'L') {
55 while (comp_offset <
len) {
56 uint8_t c_flags = sua[i + comp_offset];
57 uint8_t c_len = sua[i + comp_offset + 1];
58 uint8_t* c_content = &sua[i + comp_offset + 2];
61 out_target[target_len++] =
'/';
62 }
else if (c_flags & 0x02) {
63 out_target[target_len++] =
'.';
64 out_target[target_len++] =
'/';
65 }
else if (c_flags & 0x04) {
66 out_target[target_len++] =
'.';
67 out_target[target_len++] =
'.';
68 out_target[target_len++] =
'/';
71 memcopy(&out_target[target_len],
75 if (!(c_flags & 0x01) &&
76 (comp_offset + 2 + c_len <
len)) {
77 out_target[target_len++] =
'/';
81 comp_offset += 2 + c_len;
84 out_target[target_len] =
'\0';
99 if (sua_offset % 2 != 0)
103 if (sua_offset >= total_len)
107 uint8_t sua_len = total_len - sua_offset;
110 while (i + 4 <= sua_len) {
120 if (sig0 ==
'N' && sig1 ==
'M') {
127 if (nm_len == 0 || nm_len > 255)
130 memcopy(out_name, &sua[i + 5], nm_len);
131 out_name[nm_len] =
'\0';
147 auto block_dentry =
instance->block_dentry;
149 LOG2_WARN(
"ISO9660",
"missing block dentry");
153 auto block_vnode = block_dentry->vnode;
155 LOG2_WARN(
"ISO9660",
"missing block vnode");
161 LOG2_WARN(
"ISO9660",
"missing cdev ops");
173 if (
ops->read(block_vnode, 16, pvd,
181 instance->fs->data.magic.count) != 0) {
187 if (pvd->type != 1) {
188 LOG2_WARN(
"ISO9660",
"invalid pvd type");
193 auto root_dir = (
struct iso9660_dir*)pvd->root_dir_record;
202 iso_node->
extent = root_dir->extent_le;
203 iso_node->
size = root_dir->size_le;
204 iso_node->
flags = root_dir->flags;
207 LOG2_WARN(
"ISO9660",
"no dentry provided for root");
213 if (!(*out)->vnode) {
215 if (!(*out)->vnode) {
222 (*out)->vnode->vnode_private = iso_node;
224 (*out)->vnode->fs_instance =
instance;
226 LOG_DEBUG(
"ISO9660",
"root dir extent=0x%x size=%d",
234 LOG_WARN(
"ISO9660",
"missing vnode");
238 if (!
parent->vnode->vnode_private) {
239 LOG_WARN(
"ISO9660",
"missing vnode private data");
250 LOG2_ERROR(
"ISO9660",
"failed to alloc dir buffer");
254 if (
ops->read(block_vnode, iso_node->extent, dir_buf, iso_node->size) <
256 LOG2_ERROR(
"ISO9660",
"failed to read dir extent");
265 if (!(*out)->vnode) {
269 if (!(*out)->vnode) {
270 LOG2_ERROR(
"ISO9660",
"failed to create vnode");
283 if (entry->length == 0) {
286 ((
offset / 2048) + 1) * 2048;
287 if (next_sector >= iso_node->size)
293 if (entry->name_len == 1 && (entry->name[0] == 0x00 ||
294 entry->name[0] == 0x01)) {
295 ptr += entry->length;
303 uint8_t iso_len = entry->name_len;
307 name[iso_len] =
'\0';
310 for (
int i = 0; i <
name_len; i++) {
311 if (
name[i] ==
';') {
328 char symlink_target[256];
330 entry, symlink_target);
334 "found symlink at %s (%d)\n",
335 symlink_target, sym_len);
337 (*out)->vnode->vnode_private =
339 memcopy((*out)->vnode->vnode_private,
345 (*out)->vnode->fs_instance =
instance;
357 priv_data->extent = entry->extent_le;
358 priv_data->size = entry->size_le;
359 priv_data->flags = entry->flags;
362 (*out)->vnode->type =
365 (*out)->vnode->type =
369 (*out)->vnode->size =
373 (*out)->vnode->vnode_private =
375 (*out)->vnode->fs_instance =
instance;
381 ptr += entry->length;
403 auto block_vnode = block_dentry->
vnode;
411 if (
ops->read(block_vnode, iso_node->extent, buf, iso_node->size) < 0) {
412 LOG2_ERROR(
"ISO9660",
"failed to read dir extent");
427 buf[
strlen(priv_data)] =
'\0';
static AHCIModule instance
struct dentry * dentry_ptr
elf_section_map uintptr_t base
struct fs_operations fs_operations_t
void serial2_printf(const char *fmt,...)
fs_operations_t * iso9660_fs_operations(void)
vops_file_t * iso9660_file_operations(void)
static fs_operations_t _fs_ops
int iso9660_lookup(struct fs_instance *instance, char *path, dentry_ptr parent, dentry_ptr *out)
static vops_file_t _file_ops
static vops_lnk_t _lnk_ops
static int iso9660_get_rr_name(struct iso9660_dir *entry, char *out_name)
vops_lnk_t * iso9660_lnk_operations(void)
int iso9660_readlink(vnode_t *vnode, char *buf, size_t len)
int iso9660_read(vnode_t *vnode, void *buf, size_t len, size_t offset)
static int iso9660_get_rr_symlink(struct iso9660_dir *entry, char *out_target)
void * kalloc(size_t size)
#define LOG2_WARN(mod, fmt,...)
#define LOG_WARN(mod, fmt,...)
#define LOG2_ERROR(mod, fmt,...)
#define LOG2_INFO(mod, fmt,...)
#define LOG_DEBUG(mod, fmt,...)
int strncmp(const char *s1, const char *s2, size_t n)
void to_lowercase(char *str)
int memcmp(const void *s1, const void *s2, size_t n)
size_t strlen(const char *s)
void memcopy(void *dest, void *src, size_t size)
kstring str(const char *str)
struct fs_instance * fs_instance
vnode_t * create_and_attach_vnode()
struct vops_blk vops_blk_t