145 lines
3.4 KiB
C
145 lines
3.4 KiB
C
/*
|
|
* This file contains functions related to the reading of SUSP and
|
|
* Rock Ridge extensions on an ECMA-119 image.
|
|
*/
|
|
|
|
#ifndef ECMA119_READ_RR_H_
|
|
#define ECMA119_READ_RR_H_
|
|
|
|
#include "libisofs.h"
|
|
#include "ecma119.h"
|
|
#include "ecma119_read.h"
|
|
|
|
#define SUSP_SIG(entry, a, b) ( (entry->sig[0] == a) && (entry->sig[1] == b) )
|
|
|
|
/**
|
|
* The SUSP iterator is used to iterate over the System User Entries
|
|
* of a ECMA-168 directory record.
|
|
* It takes care about Continuation Areas, handles the end of the different
|
|
* system user entries and skip padding areas. Thus, using an iteration
|
|
* we are accessing just to the meaning entries.
|
|
*/
|
|
struct susp_iterator;
|
|
|
|
struct susp_iterator *susp_iter_new(struct iso_read_info *info,
|
|
struct ecma119_dir_record *record);
|
|
|
|
/**
|
|
* Get the next SUSP System User Entry using given iterator.
|
|
* The returned pointer refers directly to an internal buffer and it's not
|
|
* guaranteed to be allocated after calling susp_iter_next() again. Thus,
|
|
* if you need to keep some entry you have to do a copy.
|
|
*
|
|
* It return NULL when no more entries are available. Also, it will return
|
|
* NULL on error. You must check info->error to distinguish between both
|
|
* situations.
|
|
*/
|
|
struct susp_sys_user_entry *susp_iter_next(struct susp_iterator* iter);
|
|
|
|
/**
|
|
* Free a given susp iterator.
|
|
*/
|
|
void susp_iter_free(struct susp_iterator* iter);
|
|
|
|
struct susp_CE {
|
|
uint8_t block[8];
|
|
uint8_t offset[8];
|
|
uint8_t len[8];
|
|
};
|
|
|
|
struct susp_SP {
|
|
uint8_t be[1];
|
|
uint8_t ef[1];
|
|
uint8_t len_skp[1];
|
|
};
|
|
|
|
struct susp_ER {
|
|
uint8_t len_id[1];
|
|
uint8_t len_des[1];
|
|
uint8_t len_src[1];
|
|
uint8_t ext_ver[1];
|
|
uint8_t ext_id[1]; /*< up to len_id bytes */
|
|
/* ext_des, ext_src */
|
|
};
|
|
|
|
/** POSIX file attributes. */
|
|
struct rr_PX {
|
|
uint8_t mode[8];
|
|
uint8_t links[8];
|
|
uint8_t uid[8];
|
|
uint8_t gid[8];
|
|
uint8_t serial[8];
|
|
};
|
|
|
|
/** Time stamps for a file. */
|
|
struct rr_TF {
|
|
uint8_t flags[1];
|
|
uint8_t t_stamps[1];
|
|
};
|
|
|
|
/** Alternate name. */
|
|
struct rr_NM {
|
|
uint8_t flags[1];
|
|
uint8_t name[1];
|
|
};
|
|
|
|
/** Link for a relocated directory. */
|
|
struct rr_CL {
|
|
uint8_t child_loc[8];
|
|
};
|
|
|
|
/** Sim link. */
|
|
struct rr_SL {
|
|
uint8_t flags[1];
|
|
uint8_t comps[1];
|
|
};
|
|
|
|
/**
|
|
* Struct for a SUSP System User Entry
|
|
*/
|
|
struct susp_sys_user_entry
|
|
{
|
|
uint8_t sig[2];
|
|
uint8_t len_sue[1];
|
|
uint8_t version[1];
|
|
union {
|
|
struct susp_CE CE;
|
|
struct susp_SP SP;
|
|
struct susp_ER ER;
|
|
struct rr_PX PX;
|
|
struct rr_TF TF;
|
|
struct rr_NM NM;
|
|
struct rr_CL CL;
|
|
struct rr_SL SL;
|
|
} data; /* 5 to 4+len_sue */
|
|
};
|
|
|
|
/**
|
|
* Fills a struct stat with the values of a Rock Ridge PX entry
|
|
* On error, info->error is set propertly and the function returns != 0
|
|
*/
|
|
int read_rr_PX(struct iso_read_info *info, struct susp_sys_user_entry *px,
|
|
struct stat *st);
|
|
|
|
/**
|
|
* Fills a struct stat with the values of a Rock Ridge TF entry
|
|
* On error, info->error is set propertly and the function returns != 0
|
|
*/
|
|
int read_rr_TF(struct iso_read_info *info, struct susp_sys_user_entry *tf,
|
|
struct stat *st);
|
|
|
|
/**
|
|
* Apends the content of given Rock Ridge NM entry to \p name
|
|
* On error, returns NULL
|
|
*/
|
|
char *read_rr_NM(struct susp_sys_user_entry *nm, char *name);
|
|
|
|
/**
|
|
* Apends the components in specified SL entry to \p dest, adding
|
|
* needed '/'.
|
|
* On error, returns NULL
|
|
*/
|
|
char *read_rr_SL(struct susp_sys_user_entry *sl, char *dest);
|
|
|
|
#endif /*ECMA119_READ_RR_H_*/
|