+///
+/// -------- IEEE P1281 SUSP ---------
+///
+
+#define ISOSU_ER 0x5245
+#define ISOSU_ST 0x5453
+
+struct isosu_base
+{
+ u16_t signature;
+ u8_t length;
+ u8_t version;
+} PACKED;
+
+struct isosu_er
+{
+ struct isosu_base header;
+ u8_t id_len;
+ u8_t des_len;
+ u8_t src_len;
+ u8_t ext_ver;
+ u8_t id_des_src[0];
+} PACKED;
+
+///
+/// -------- Rock Ridge Extension --------
+///
+
+#define ISORR_PX 0x5850
+#define ISORR_PN 0x4e50
+#define ISORR_SL 0x4c53
+#define ISORR_NM 0x4d4e
+#define ISORR_TF 0x4654
+
+#define ISORR_NM_CONT 0x1
+
+#define ISORR_TF_CTIME 0x1
+#define ISORR_TF_MTIME 0x2
+#define ISORR_TF_ATIME 0x4
+#define ISORR_TF_LONG_FORM 0x80
+
+struct isorr_px
+{
+ struct isosu_base header;
+ iso_bbo32_t mode;
+ iso_bbo32_t link;
+ iso_bbo32_t uid;
+ iso_bbo32_t gid;
+ iso_bbo32_t sn;
+} PACKED;
+
+struct isorr_pn
+{
+ struct isosu_base header;
+ iso_bbo32_t dev_hi;
+ iso_bbo32_t dev_lo;
+} PACKED;
+
+struct isorr_sl
+{
+ struct isosu_base header;
+ u8_t flags;
+ char symlink[0];
+} PACKED;
+
+struct isorr_nm
+{
+ struct isosu_base header;
+ u8_t flags;
+ char name[0];
+} PACKED;
+
+struct isorr_tf
+{
+ struct isosu_base header;
+ u8_t flags;
+ char times[0];
+} PACKED;
+
+///
+/// -------- VFS integration ---------
+///
+
+struct iso_inode
+{
+ u32_t record_fmt;
+ u32_t fu_size;
+ u32_t gap_size;
+ struct llist_header drecaches;
+};
+
+struct iso_drecache
+{
+ struct llist_header caches;
+ u32_t extent_addr;
+ u32_t data_size;
+ u32_t xattr_len;
+ u32_t fno;
+ u32_t fu_size;
+ u32_t gap_size;
+ u32_t flags;
+ time_t ctime;
+ time_t atime;
+ time_t mtime;
+ struct hstr name;
+ char name_val[ISO9660_IDLEN];
+};
+
+struct iso_superblock
+{
+ u32_t volume_size;
+ u32_t lb_size;
+};
+
+struct iso_drecord*
+iso9660_get_drecord(struct iso_var_mdu* drecord_mdu);
+
+int
+iso9660_fill_inode(struct v_inode* inode, struct iso_drecache* dir, int ino);
+
+time_t
+iso9660_dt2unix(struct iso_datetime* isodt);
+
+time_t
+iso9660_dt22unix(struct iso_datetime2* isodt2);
+
+void
+iso9660_init();
+
+int
+iso9660_setup_dnode(struct v_dnode* dnode, struct v_inode* inode);
+
+void
+iso9660_fill_drecache(struct iso_drecache* cache,
+ struct iso_drecord* drec,
+ u32_t len);
+
+int
+iso9660_dir_lookup(struct v_inode* this, struct v_dnode* dnode);
+
+int
+iso9660_readdir(struct v_file* file, struct dir_context* dctx);
+
+int
+iso9660_open(struct v_inode* this, struct v_file* file);
+
+int
+iso9660_close(struct v_file* file);
+
+int
+iso9660_read(struct v_inode* inode, void* buffer, size_t len, size_t fpos);
+
+int
+iso9660_write(struct v_inode* inode, void* buffer, size_t len, size_t fpos);
+
+int
+iso9660_seek(struct v_inode* inode, size_t offset);
+
+int
+isorr_parse_px(struct iso_drecache* cache, void* px_start);
+
+int
+isorr_parse_nm(struct iso_drecache* cache, void* nm_start);
+
+int
+isorr_parse_tf(struct iso_drecache* cache, void* tf_start);
+