/* vim: set noet ts=8 sts=8 sw=8 : */ /** * Functions and structures used for SUSP (IEEE 1281). * * Please refer to IEEE P1281 System Use Sharing Protocol, draft standard * version 1.12 for more details. */ #ifndef __ISO_SUSP #define __ISO_SUSP #include /* SUSP is only present in standard ecma119 */ struct ecma119_write_target; struct ecma119_tree_node; /** This contains the information that needs to go in the SUSP area of a file. */ struct susp_info { int n_susp_fields; /**< Number of SUSP fields */ uint8_t **susp_fields; /**< Data for each SUSP field */ /* the next 3 relate to CE and are filled out by susp_add_CE. */ int n_fields_fit; /**< How many of the above SUSP fields fit * within this node's dirent. */ int non_CE_len; /**< Length of the part of the SUSP area that * fits in the dirent. */ int CE_len; /**< Length of the part of the SUSP area that * will go in a CE area. */ }; /** * Add a CE System Use Entry to the given tree node. A "CE" is used to add * a continuation area, where additional System Use Entry can be written. * See IEEE P1281, section 5.1. */ void susp_add_CE(struct ecma119_write_target *, struct ecma119_tree_node *); /** * Add a SP System Use Entry to the "." entry of the directory. The SP provide * an identifier that the SUSP is used within the volume. The SP shall be * recorded in the "." entry of the root directory. * See IEEE P1281, section 5.3 for more details. * * this is special because it doesn't modify the susp fields of the * directory; it modifies the susp fields of the "." entry in the directory. */ void susp_add_SP(struct ecma119_write_target *, struct ecma119_tree_node *); /** Once all the directories and files are laid out, recurse through the tree * and finalize all SUSP CE entries. */ void susp_finalize(struct ecma119_write_target *, struct ecma119_tree_node *); void susp_append(struct ecma119_write_target *, struct susp_info *, uint8_t *); void susp_insert(struct ecma119_write_target *, struct susp_info *, uint8_t *, int pos); uint8_t *susp_find(struct susp_info *, const char *); void susp_write(struct ecma119_write_target *, struct susp_info *, uint8_t *); void susp_write_CE(struct ecma119_write_target *, struct susp_info *, uint8_t *); void susp_free_fields(struct susp_info *); #endif /* __ISO_SUSP */