2002-03-25 23:16:26 +03:00
# ifndef H_FSM
# define H_FSM
/** \ingroup payload
* \ file lib / fsm . h
* File state machine to handle a payload within an rpm package .
*/
# include "cpio.h"
/*@-exportlocal@*/
/*@unchecked@*/
extern int _fsm_debug ;
/*@=exportlocal@*/
/**
*/
# define FSM_VERBOSE 0x8000
# define FSM_INTERNAL 0x4000
# define FSM_SYSCALL 0x2000
# define FSM_DEAD 0x1000
# define _fv(_a) ((_a) | FSM_VERBOSE)
# define _fi(_a) ((_a) | FSM_INTERNAL)
# define _fs(_a) ((_a) | (FSM_INTERNAL | FSM_SYSCALL))
# define _fd(_a) ((_a) | (FSM_INTERNAL | FSM_DEAD))
typedef enum fileStage_e {
FSM_UNKNOWN = 0 ,
FSM_INIT = _fd ( 1 ) ,
FSM_PRE = _fd ( 2 ) ,
FSM_PROCESS = _fv ( 3 ) ,
FSM_POST = _fd ( 4 ) ,
FSM_UNDO = 5 ,
FSM_FINI = 6 ,
FSM_PKGINSTALL = _fd ( 7 ) ,
FSM_PKGERASE = _fd ( 8 ) ,
FSM_PKGBUILD = _fd ( 9 ) ,
FSM_PKGCOMMIT = _fd ( 10 ) ,
FSM_PKGUNDO = _fd ( 11 ) ,
FSM_CREATE = _fd ( 17 ) ,
FSM_MAP = _fd ( 18 ) ,
FSM_MKDIRS = _fi ( 19 ) ,
FSM_RMDIRS = _fi ( 20 ) ,
FSM_MKLINKS = _fi ( 21 ) ,
FSM_NOTIFY = _fd ( 22 ) ,
FSM_DESTROY = _fd ( 23 ) ,
FSM_VERIFY = _fd ( 24 ) ,
FSM_COMMIT = _fd ( 25 ) ,
FSM_UNLINK = _fs ( 33 ) ,
FSM_RENAME = _fs ( 34 ) ,
FSM_MKDIR = _fs ( 35 ) ,
FSM_RMDIR = _fs ( 36 ) ,
FSM_CHOWN = _fs ( 37 ) ,
FSM_LCHOWN = _fs ( 38 ) ,
FSM_CHMOD = _fs ( 39 ) ,
FSM_UTIME = _fs ( 40 ) ,
FSM_SYMLINK = _fs ( 41 ) ,
FSM_LINK = _fs ( 42 ) ,
FSM_MKFIFO = _fs ( 43 ) ,
FSM_MKNOD = _fs ( 44 ) ,
FSM_LSTAT = _fs ( 45 ) ,
FSM_STAT = _fs ( 46 ) ,
FSM_READLINK = _fs ( 47 ) ,
FSM_CHROOT = _fs ( 48 ) ,
2010-03-31 19:36:41 +04:00
FSM_LSETFCON = _fs ( 49 ) ,
2002-03-25 23:16:26 +03:00
FSM_NEXT = _fd ( 65 ) ,
FSM_EAT = _fd ( 66 ) ,
FSM_POS = _fd ( 67 ) ,
FSM_PAD = _fd ( 68 ) ,
FSM_TRAILER = _fd ( 69 ) ,
FSM_HREAD = _fd ( 70 ) ,
FSM_HWRITE = _fd ( 71 ) ,
FSM_DREAD = _fs ( 72 ) ,
FSM_DWRITE = _fs ( 73 ) ,
FSM_ROPEN = _fs ( 129 ) ,
FSM_READ = _fs ( 130 ) ,
FSM_RCLOSE = _fs ( 131 ) ,
FSM_WOPEN = _fs ( 132 ) ,
FSM_WRITE = _fs ( 133 ) ,
FSM_WCLOSE = _fs ( 134 )
} fileStage ;
# undef _fv
# undef _fi
# undef _fs
# undef _fd
/** \ingroup payload
* Keeps track of the set of all hard links to a file in an archive .
*/
struct hardLink_s {
/*@owned@*/ struct hardLink_s * next ;
/*@owned@*/ const char * * nsuffix ;
/*@owned@*/ int * filex ;
struct stat sb ;
int nlink ;
int linksLeft ;
int linkIndex ;
int createdPath ;
} ;
/** \ingroup payload
* Iterator across package file info , forward on install , backward on erase .
*/
struct fsmIterator_s {
/*@kept@*/ rpmTransactionSet ts ; /*!< transaction set. */
/*@kept@*/ TFI_t fi ; /*!< transaction element file info. */
int reverse ; /*!< reversed traversal? */
int isave ; /*!< last returned iterator index. */
int i ; /*!< iterator index. */
} ;
/** \ingroup payload
* File name and stat information .
*/
struct fsm_s {
/*@owned@*/ const char * path ; /*!< Current file name. */
/*@owned@*/ const char * opath ; /*!< Original file name. */
FD_t cfd ; /*!< Payload file handle. */
FD_t rfd ; /*!< read: File handle. */
/*@dependent@*/ char * rdbuf ; /*!< read: Buffer. */
/*@owned@*/ char * rdb ; /*!< read: Buffer allocated. */
size_t rdsize ; /*!< read: Buffer allocated size. */
size_t rdlen ; /*!< read: Number of bytes requested.*/
size_t rdnb ; /*!< read: Number of bytes returned. */
FD_t wfd ; /*!< write: File handle. */
/*@dependent@*/ char * wrbuf ; /*!< write: Buffer. */
/*@owned@*/ char * wrb ; /*!< write: Buffer allocated. */
size_t wrsize ; /*!< write: Buffer allocated size. */
size_t wrlen ; /*!< write: Number of bytes requested.*/
size_t wrnb ; /*!< write: Number of bytes returned. */
/*@only@*/ FSMI_t iter ; /*!< File iterator. */
int ix ; /*!< Current file iterator index. */
/*@only@*/ struct hardLink_s * links ; /*!< Pending hard linked file(s). */
/*@only@*/ struct hardLink_s * li ; /*!< Current hard linked file(s). */
/*@kept@*/ /*@null@*/ unsigned int * archiveSize ; /*!< Pointer to archive size. */
/*@kept@*/ /*@null@*/ const char * * failedFile ; /*!< First file name that failed. */
/*@shared@*/ const char * subdir ; /*!< Current file sub-directory. */
/*@unused@*/ char subbuf [ 64 ] ; /* XXX eliminate */
/*@observer@*/ const char * osuffix ; /*!< Old, preserved, file suffix. */
/*@observer@*/ const char * nsuffix ; /*!< New, created, file suffix. */
/*@shared@*/ const char * suffix ; /*!< Current file suffix. */
char sufbuf [ 64 ] ; /* XXX eliminate */
/*@only@*/ /*@null@*/ short * dnlx ; /*!< Last dirpath verified indexes. */
/*@only@*/ /*@null@*/ char * ldn ; /*!< Last dirpath verified. */
int ldnlen ; /*!< Last dirpath current length. */
int ldnalloc ; /*!< Last dirpath allocated length. */
int postpone ; /*!< Skip remaining stages? */
int diskchecked ; /*!< Has stat(2) been performed? */
int exists ; /*!< Does current file exist on disk? */
int mkdirsdone ; /*!< Have "orphan" dirs been created? */
int astriplen ; /*!< Length of buildroot prefix. */
int rc ; /*!< External file stage return code. */
int commit ; /*!< Commit synchronously? */
cpioMapFlags mapFlags ; /*!< Bit(s) to control mapping. */
/*@shared@*/ const char * dirName ; /*!< File directory name. */
/*@shared@*/ const char * baseName ; /*!< File base name. */
/*@shared@*/ const char * fmd5sum ; /*!< File MD5 sum (NULL disables). */
2010-03-31 19:36:41 +04:00
security_context_t fcontext ; /*!< File security context (NULL disables). */
2002-03-25 23:16:26 +03:00
unsigned fflags ; /*!< File flags. */
fileAction action ; /*!< File disposition. */
fileStage goal ; /*!< Package state machine goal. */
fileStage stage ; /*!< External file stage. */
struct stat sb ; /*!< Current file stat(2) info. */
struct stat osb ; /*!< Original file stat(2) info. */
} ;
# ifdef __cplusplus
extern " C " {
# endif
/*@-exportlocal@*/
/**
* Return formatted string representation of file stages .
* @ param a file stage
* @ return formatted string
*/
2006-05-15 02:48:59 +04:00
/*@observer@*/ const char * fileStageString ( fileStage a ) /*@*/ ;
2002-03-25 23:16:26 +03:00
/**
* Return formatted string representation of file disposition .
* @ param a file dispostion
* @ return formatted string
*/
2006-05-15 02:48:59 +04:00
/*@observer@*/ const char * fileActionString ( fileAction a ) /*@*/ ;
2002-03-25 23:16:26 +03:00
/*@=exportlocal@*/
/**
* Create file state machine instance .
* @ return file state machine data
*/
/*@only@*/ FSM_t newFSM ( void )
/*@*/ ;
/**
* Destroy file state machine instance .
* @ param fsm file state machine data
* @ return always NULL
*/
/*@null@*/ FSM_t freeFSM ( /*@only@*/ /*@null@*/ FSM_t fsm )
/*@modifies fsm @*/ ;
/**
* Load external data into file state machine .
* @ param fsm file state machine data
* @ param goal
* @ param ts transaction set
* @ param fi transaction element file info
2002-08-03 20:35:14 +04:00
* @ param cfd
* @ retval archiveSize pointer to archive size
* @ retval failedFile pointer to first file name that failed .
2002-03-25 23:16:26 +03:00
* @ return 0 on success
*/
int fsmSetup ( FSM_t fsm , fileStage goal ,
/*@kept@*/ const rpmTransactionSet ts ,
/*@kept@*/ const TFI_t fi ,
FD_t cfd ,
/*@out@*/ unsigned int * archiveSize ,
/*@out@*/ const char * * failedFile )
/*@modifies fsm, *archiveSize, *failedFile, fileSystem @*/ ;
/**
* Clean file state machine .
* @ param fsm file state machine data
* @ return 0 on success
*/
int fsmTeardown ( FSM_t fsm )
/*@modifies fsm @*/ ;
/*@-exportlocal@*/
/**
* Retrieve transaction set from file state machine iterator .
* @ param fsm file state machine data
* @ return transaction set
*/
/*@kept@*/ rpmTransactionSet fsmGetTs ( const FSM_t fsm )
/*@*/ ;
/**
* Retrieve transaction element file info from file state machine iterator .
* @ param fsm file state machine data
* @ return transaction element file info
*/
/*@kept@*/ TFI_t fsmGetFi ( /*@partial@*/ const FSM_t fsm )
/*@*/ ;
/**
* Map next file path and action .
* @ param fsm file state machine data
*/
int fsmMapPath ( FSM_t fsm )
/*@modifies fsm @*/ ;
/**
* Map file stat ( 2 ) info .
* @ param fsm file state machine data
*/
int fsmMapAttrs ( FSM_t fsm )
/*@modifies fsm @*/ ;
/*@=exportlocal@*/
/**
* File state machine driver .
* @ param fsm file state machine data
* @ param stage next stage
* @ return 0 on success
*/
int fsmStage ( /*@partial@*/ FSM_t fsm , fileStage stage )
/*@modifies fsm, fileSystem @*/ ;
# ifdef __cplusplus
}
# endif
# endif /* H_FSM */