
/* xorriso - creates, loads, manipulates and burns ISO 9660 filesystem images.

   Copyright 2007-2010 Thomas Schmitt, <scdbackup@gmx.net>

   Provided under GPL version 2 or later.

   This file contains declarations of classes:

   - SplitparT which represents byte intervals of data files.

   - DirseQ which crawls along a directory's content list.

   - ExclusionS which manages the list of excluded file paths and 
     leaf patterns.

   - Xorriso_lsT which provides a generic double-linked list.

   - LinkiteM, PermiteM which temporarily record relations and states.

*/


#ifndef Xorriso_pvt_auxobj_includeD
#define Xorriso_pvt_auxobj_includeD yes

struct SplitparT;

int Splitparts_new(struct SplitparT **o, int count, int flag);

int Splitparts_destroy(struct SplitparT **o, int count, int flag);

int Splitparts_set(struct SplitparT *o, int idx,
                   char *name, int partno, int total_parts,
                   off_t offset, off_t bytes, off_t total_bytes, int flag);

int Splitparts_get(struct SplitparT *o, int idx, char **name, int *partno,
                   int *total_parts, off_t *offset, off_t *bytes, 
                   off_t *total_bytes, int flag);

int Splitpart__parse(char *name, int *partno, int *total_parts,
                    off_t *offset, off_t *bytes, off_t *total_bytes, int flag);

int Splitpart__is_part_path(char *path, int flag);

int Splitpart__compose(char *adr, int partno, int total_parts,
                       off_t offset, off_t bytes, off_t total_bytes, int flag);

int Splitpart__read_next_num(char *base_pt, char **next_pt, off_t *num,
                             int flag);

int Splitparts_sort(struct SplitparT *o, int count, int flag);



struct DirseQ;

int Dirseq_new(struct DirseQ **o, char *adr, int flag);

int Dirseq_destroy(struct DirseQ **o, int flag);

int Dirseq_next_adr(struct DirseQ *o, char reply[SfileadrL], int flag);

int Dirseq_rewind(struct DirseQ *o, int flag);



struct Xorriso_lsT {
  char *text;
  struct Xorriso_lsT *prev,*next;
};

/** Create a new list item with arbitrary byte content.
    @param lstring  The newly created object or NULL on failure
    @param data     An array of bytes to be copied into the new object
    @param data_len Number of bytes to be copied
    @param link     Xorriso_lsT object to which the new object shall be linked
    @param flag Bitfield for control purposes
                bit0= insert before link rather than after it
                bit1= do not copy data (e.g. because *data is invalid)
                bit2= attach data directly by pointer rather than by copying
    @return <=0 error, 1 ok
*/
int Xorriso_lst_new_binary(struct Xorriso_lsT **lstring, char *data,
                           int data_len, struct Xorriso_lsT *link, int flag);


/** Create a new list item with a 0-terminated text as content.
    @param lstring  The newly created object or NULL on failure
    @param text     A 0-terminated array of bytes
    @param link     Xorriso_lsT object to which the new object shall be linked
    @param flag     see Xorriso_lst_new_binary
    @return <=0 error, 1 ok
*/
int Xorriso_lst_new(struct Xorriso_lsT **lstring, char *text,
                    struct Xorriso_lsT *link, int flag);


/** Create a new list item at the end of a given list.
    @param entry    Contains as input a pointer to a pointer to any existing
                    list item. As output this list item pointer may be
                    changed to the address of the new list item:
                    if ((*entry == 0) || (flag & 1))
    @param data     An array of bytes to be copied into the new object
    @param data_len Number of bytes to be copied
    @param flag     Bitfield for control purposes
                    bit0= Return new object address in *entry
                    bit1= do not copy data (e.g. because *data is invalid)
                    bit2= attach data directly by pointer rather than by copying
    @return <=0 error, 1 ok
*/
int Xorriso_lst_append_binary(struct Xorriso_lsT **entry,
                              char *data, int data_len, int flag);


/** Destroy a single list item and connect its eventual list neighbors.
    @param lstring  pointer to the pointer to be freed and set to NULL
    @param flag     unused yet, submit 0
    @return 0= *lstring was already NULL, 1= ok
*/
int Xorriso_lst_destroy(struct Xorriso_lsT **lstring, int flag);


struct Xorriso_lsT *Xorriso_lst_get_next(struct Xorriso_lsT *entry, int flag);

struct Xorriso_lsT *Xorriso_lst_get_prev(struct Xorriso_lsT *entry, int flag);

char *Xorriso_lst_get_text(struct Xorriso_lsT *entry, int flag);

int Xorriso_lst_detach_text(struct Xorriso_lsT *entry, int flag);

int Xorriso_lst_get_last(struct Xorriso_lsT *entry, struct Xorriso_lsT **last,
                         int flag);

int Xorriso_lst_concat(struct Xorriso_lsT *first, struct Xorriso_lsT *second,
                       int flag);


int Exclusions_new(struct ExclusionS **o, int flag);

int Exclusions_destroy(struct ExclusionS **o, int flag);

int Exclusions_get_descrs(struct ExclusionS *o,
                          struct Xorriso_lsT **not_paths_descr,
                          struct Xorriso_lsT **not_leafs_descr, int flag);

/* @param flag bit0= whole subtree is banned with -not_paths
   @return 0=no match , 1=not_paths , 2=not_leafs, <0=error
*/
int Exclusions_match(struct ExclusionS *o, char *abs_path, int flag);

int Exclusions_add_not_leafs(struct ExclusionS *o, char *not_leafs_descr,
                             regex_t *re, int flag);

int Exclusions_add_not_paths(struct ExclusionS *o, int descrc, char **descrs,
                             int pathc, char **paths, int flag);



struct LinkiteM;          /* Trace of hops during symbolic link resolution */

int Linkitem_new(struct LinkiteM **o, char *link_path, dev_t target_dev,
                 ino_t target_ino, struct LinkiteM *next, int flag);

int Linkitem_destroy(struct LinkiteM **o, int flag);

int Linkitem_reset_stack(struct LinkiteM **o, struct LinkiteM *to, int flag);

int Linkitem_find(struct LinkiteM *stack, dev_t target_dev, ino_t target_ino,
                  struct LinkiteM **result, int flag);

int Linkitem_get_link_count(struct LinkiteM *item, int flag);


struct PermiteM;          /* Stack of temporarily altered access permissions */

int Permstack_push(struct PermiteM **o, char *disk_path, struct stat *stbuf,
                   int flag);

int Permstack_pop(struct PermiteM **o, struct PermiteM *stopper,
                  struct XorrisO *xorriso, int flag);

/* Look for stack item with disk_path
   @param chattr_flag bit0= when popping: set chattr bit 'i'
                      bit1= when popping: only set chattr bits
                      bit2= when popping: set chattr bit 'a'
   @return 0= nothing found, 1= *stbuf and *chattr_flags are valid
*/
int Permstack_peek(struct PermiteM **o, struct PermiteM *stopper,
                   struct XorrisO *xorriso,
                   char *disk_path, struct stat **stbuf, int *chattr_flags,
                   int flag);


struct NumbermappeR; /* interval driven number conversion up to 2 exp 60 */

int Numbermapper_new(struct NumbermappeR **o, off_t min, off_t max, int flag);

int Numbermapper_destroy(struct NumbermappeR **o, int flag);

int Numbermapper_add(struct NumbermappeR *o, off_t from_low, off_t from_high,
                     off_t to_low, off_t to_high, int flag);

int Numbermapper_map(struct NumbermappeR *o, off_t from, off_t *to, int flag);

int Numbermapper_decode(struct NumbermappeR *o, char *text,
                        off_t *from_low, off_t *from_high,
                        off_t *to_low, off_t *to_high,
                        char *errmsg,  int flag);

int Numbermapper_get_count(struct NumbermappeR *o, int flag);

int Numbermapper_encode(struct NumbermappeR *o, int idx, char *text, int size,
                        int flag);

#endif /* ! Xorriso_pvt_auxobj_includeD */

