|  | #pragma once | 
|  |  | 
|  | #define CPIO_NEW_ASCII	070701 | 
|  | #define CPIO_CRC_ASCII	070702 | 
|  | /* Mode bits */ | 
|  | #define CPIO_FILE_MASK	0170000 | 
|  | #define CPIO_SOCKET	0120000 | 
|  | #define CPIO_SYMLINK	0120000 | 
|  | #define CPIO_REG_FILE	0100000 | 
|  | #define CPIO_BLK_SPEC	0060000 | 
|  | #define CPIO_DIRECTORY	0040000 | 
|  | #define CPIO_CHAR_SPEC	0020000 | 
|  | #define CPIO_FIFO_PIPE	0010000 | 
|  | #define CPIO_SUID	0004000 | 
|  | #define CPIO_SGID	0002000 | 
|  | #define CPIO_STICKY	0001000 | 
|  | #define CPIO_PERM_MASK	0000777 | 
|  |  | 
|  | struct cpio_newc_header | 
|  | { | 
|  | char c_magic[6]; | 
|  | char c_ino[8]; | 
|  | char c_mode[8]; | 
|  | char c_uid[8]; | 
|  | char c_gid[8]; | 
|  | char c_nlink[8]; | 
|  | char c_mtime[8]; | 
|  | char c_filesize[8];	/* must be 0 for FIFOs and directories */ | 
|  | char c_dev_maj[8]; | 
|  | char c_dev_min[8]; | 
|  | char c_rdev_maj[8];	/* only valid for chr and blk special files */ | 
|  | char c_rdev_min[8];	/* only valid for chr and blk special files */ | 
|  | char c_namesize[8];	/* count includes terminating NUL in pathname */ | 
|  | /* for CRC format, chksum is the sum of all the bytes in the file */ | 
|  | char c_chksum[8]; | 
|  | }; | 
|  |  | 
|  | /* Header passed around when initing a FS based on a CPIO archive */ | 
|  | struct cpio_bin_hdr | 
|  | { | 
|  | unsigned long		c_ino;	/* FYI: we ignore this */ | 
|  | int			c_mode; | 
|  | uid_t			c_uid; | 
|  | gid_t			c_gid; | 
|  | /* not sure how this makes CPIO-sense, ignoring */ | 
|  | unsigned int		c_nlink; | 
|  | unsigned long		c_mtime; | 
|  | size_t			c_filesize; | 
|  | unsigned long		c_dev_maj; | 
|  | unsigned long		c_dev_min; | 
|  | unsigned long		c_rdev_maj; | 
|  | unsigned long		c_rdev_min; | 
|  | char			*c_filename; | 
|  | void			*c_filestart; | 
|  | }; | 
|  |  | 
|  | void parse_cpio_entries(void *cpio_b, size_t cpio_sz, | 
|  | int (*cb)(struct cpio_bin_hdr*, void *), void *cb_arg); | 
|  |  | 
|  | /* Helper function: converts src non-null-term string's n bytes from base 16 to | 
|  | * a long, using buf as space.  Make sure buf is n + 1. */ | 
|  | static inline long cpio_strntol(char *buf, char *src, size_t n) | 
|  | { | 
|  | memcpy(buf, src, n); | 
|  | buf[n] = '\0'; | 
|  | return strtol(buf, 0, 16); | 
|  | } |