⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cpio.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 3 页
字号:
cpio_stwr()#endif{	return(dev_start());}/* * cpio_wr() *	copy the data in the ARCHD to buffer in extended byte oriented cpio *	format. * Return *      0 if file has data to be written after the header, 1 if file has NO *	data to write after the header, -1 if archive write failed */#if __STDC__intcpio_wr(register ARCHD *arcn)#elseintcpio_wr(arcn)	register ARCHD *arcn;#endif{	register HD_CPIO *hd;	register int nsz;	char hdblk[sizeof(HD_CPIO)];	/*	 * check and repair truncated device and inode fields in the header	 */	if (map_dev(arcn, (u_long)CPIO_MASK, (u_long)CPIO_MASK) < 0)		return(-1);	arcn->pad = 0L;	nsz = arcn->nlen + 1;	hd = (HD_CPIO *)hdblk;	if ((arcn->type != PAX_BLK) && (arcn->type != PAX_CHR))		arcn->sb.st_rdev = 0;	switch(arcn->type) {	case PAX_CTG:	case PAX_REG:	case PAX_HRG:		/*		 * set data size for file data		 */#		ifdef NET2_STAT		if (ul_asc((u_long)arcn->sb.st_size, hd->c_filesize,		    sizeof(hd->c_filesize), OCT)) {#		else		if (uqd_asc((u_quad_t)arcn->sb.st_size, hd->c_filesize,		    sizeof(hd->c_filesize), OCT)) {#		endif			warn(1,"File is too large for cpio format %s",			    arcn->org_name);			return(1);		}		break;	case PAX_SLK:		/*		 * set data size to hold link name		 */		if (ul_asc((u_long)arcn->ln_nlen, hd->c_filesize,		    sizeof(hd->c_filesize), OCT))			goto out;		break;	default:		/*		 * all other file types have no file data		 */		if (ul_asc((u_long)0, hd->c_filesize, sizeof(hd->c_filesize),		     OCT))			goto out;		break;	}	/*	 * copy the values to the header using octal ascii	 */	if (ul_asc((u_long)MAGIC, hd->c_magic, sizeof(hd->c_magic), OCT) ||	    ul_asc((u_long)arcn->sb.st_dev, hd->c_dev, sizeof(hd->c_dev),	        OCT) ||	    ul_asc((u_long)arcn->sb.st_ino, hd->c_ino, sizeof(hd->c_ino),		OCT) ||	    ul_asc((u_long)arcn->sb.st_mode, hd->c_mode, sizeof(hd->c_mode),		OCT) ||	    ul_asc((u_long)arcn->sb.st_uid, hd->c_uid, sizeof(hd->c_uid),		OCT) ||	    ul_asc((u_long)arcn->sb.st_gid, hd->c_gid, sizeof(hd->c_gid),		OCT) ||	    ul_asc((u_long)arcn->sb.st_nlink, hd->c_nlink, sizeof(hd->c_nlink),		 OCT) ||	    ul_asc((u_long)arcn->sb.st_rdev, hd->c_rdev, sizeof(hd->c_rdev),		OCT) ||	    ul_asc((u_long)arcn->sb.st_mtime,hd->c_mtime,sizeof(hd->c_mtime),		OCT) ||	    ul_asc((u_long)nsz, hd->c_namesize, sizeof(hd->c_namesize), OCT))		goto out;	/*	 * write the file name to the archive	 */	if ((wr_rdbuf(hdblk, (int)sizeof(HD_CPIO)) < 0) ||	    (wr_rdbuf(arcn->name, nsz) < 0)) {		warn(1, "Unable to write cpio header for %s", arcn->org_name);		return(-1);	}	/*	 * if this file has data, we are done. The caller will write the file	 * data, if we are link tell caller we are done, go to next file	 */	if ((arcn->type == PAX_CTG) || (arcn->type == PAX_REG) ||	    (arcn->type == PAX_HRG))		return(0);	if (arcn->type != PAX_SLK)		return(1);	/*	 * write the link name to the archive, tell the caller to go to the	 * next file as we are done.	 */	if (wr_rdbuf(arcn->ln_name, arcn->ln_nlen) < 0) {		warn(1,"Unable to write cpio link name for %s",arcn->org_name);		return(-1);	}	return(1);    out:	/*	 * header field is out of range	 */	warn(1, "Cpio header field is too small to store file %s",	    arcn->org_name);	return(1);}/* * Routines common to the system VR4 version of cpio (with/without file CRC) *//* * vcpio_id() *      determine if a block given to us is a valid system VR4 cpio header *	WITHOUT crc. WATCH it the magic cookies are in OCTAL, the header  *	uses HEX * Return: *      0 if a valid header, -1 otherwise */#if __STDC__intvcpio_id(char *blk, int size)#elseintvcpio_id(blk, size)	char *blk;	int size;#endif{	if ((size < sizeof(HD_VCPIO)) ||	    (strncmp(blk, AVMAGIC, sizeof(AVMAGIC) - 1) != 0))		return(-1);	return(0);}/* * crc_id() *      determine if a block given to us is a valid system VR4 cpio header *	WITH crc. WATCH it the magic cookies are in OCTAL the header uses HEX * Return: *      0 if a valid header, -1 otherwise */#if __STDC__intcrc_id(char *blk, int size)#elseintcrc_id(blk, size)	char *blk;	int size;#endif{	if ((size < sizeof(HD_VCPIO)) ||	    (strncmp(blk, AVCMAGIC, sizeof(AVCMAGIC) - 1) != 0))		return(-1);	return(0);}/* * crc_strd() w	set file data CRC calculations. Fire up the hard link detection code * Return: *      0 if ok -1 otherwise (the return values of lnk_start()) */#if __STDC__intcrc_strd(void)#elseintcrc_strd()#endif{	docrc = 1;	return(lnk_start());}/* * vcpio_rd() *	determine if a buffer is a system VR4 archive entry. (with/without CRC) *	convert and store the values in the ARCHD parameter. * Return: *	0 if a valid header, -1 otherwise. */#if __STDC__intvcpio_rd(register ARCHD *arcn, register char *buf)#elseintvcpio_rd(arcn, buf)	register ARCHD *arcn;	register char *buf;#endif{	register HD_VCPIO *hd;	dev_t devminor;	dev_t devmajor;	register int nsz;	/*	 * during the id phase it was determined if we were using CRC, use the	 * proper id routine.	 */	if (docrc) {		if (crc_id(buf, sizeof(HD_VCPIO)) < 0)			return(-1);	} else {		if (vcpio_id(buf, sizeof(HD_VCPIO)) < 0)			return(-1);	}	hd = (HD_VCPIO *)buf;	arcn->pad = 0L;	/*	 * extract the hex ascii fields from the header	 */	arcn->sb.st_ino = (ino_t)asc_ul(hd->c_ino, sizeof(hd->c_ino), HEX);	arcn->sb.st_mode = (mode_t)asc_ul(hd->c_mode, sizeof(hd->c_mode), HEX);	arcn->sb.st_uid = (uid_t)asc_ul(hd->c_uid, sizeof(hd->c_uid), HEX);	arcn->sb.st_gid = (gid_t)asc_ul(hd->c_gid, sizeof(hd->c_gid), HEX);	arcn->sb.st_mtime = (time_t)asc_ul(hd->c_mtime,sizeof(hd->c_mtime),HEX);	arcn->sb.st_ctime = arcn->sb.st_atime = arcn->sb.st_mtime;#	ifdef NET2_STAT	arcn->sb.st_size = (off_t)asc_ul(hd->c_filesize,	    sizeof(hd->c_filesize), HEX);#	else	arcn->sb.st_size = (off_t)asc_uqd(hd->c_filesize,	    sizeof(hd->c_filesize), HEX);#	endif	arcn->sb.st_nlink = (nlink_t)asc_ul(hd->c_nlink, sizeof(hd->c_nlink),	    HEX);	devmajor = (dev_t)asc_ul(hd->c_maj, sizeof(hd->c_maj), HEX);	devminor = (dev_t)asc_ul(hd->c_min, sizeof(hd->c_min), HEX);	arcn->sb.st_dev = TODEV(devmajor, devminor);	devmajor = (dev_t)asc_ul(hd->c_rmaj, sizeof(hd->c_maj), HEX);	devminor = (dev_t)asc_ul(hd->c_rmin, sizeof(hd->c_min), HEX);	arcn->sb.st_rdev = TODEV(devmajor, devminor);	arcn->crc = asc_ul(hd->c_chksum, sizeof(hd->c_chksum), HEX);	/*	 * check the length of the file name, if ok read it in, return -1 if	 * bogus	 */	if ((nsz = (int)asc_ul(hd->c_namesize,sizeof(hd->c_namesize),HEX)) < 2)		return(-1);	arcn->nlen = nsz - 1;	if (rd_nm(arcn, nsz) < 0)		return(-1);	/*	 * skip padding. header + filename is aligned to 4 byte boundries	 */	if (rd_skip((off_t)(VCPIO_PAD(sizeof(HD_VCPIO) + nsz))) < 0)		return(-1);	/*	 * if not a link (or a file with no data), calculate pad size (for	 * padding which follows the file data), clear the link name and return	 */	if (((arcn->sb.st_mode&C_IFMT) != C_ISLNK)||(arcn->sb.st_size == 0)) {		/*		 * we have a valid header (not a link)		 */		arcn->ln_nlen = 0;		arcn->ln_name[0] = '\0';		arcn->pad = VCPIO_PAD(arcn->sb.st_size);		return(com_rd(arcn));	}	/*	 * read in the link name and skip over the padding	 */	if ((rd_ln_nm(arcn) < 0) ||	    (rd_skip((off_t)(VCPIO_PAD(arcn->sb.st_size))) < 0))		return(-1);	/*	 * we have a valid header (with a link)	 */	return(com_rd(arcn));}/* * vcpio_endrd() *      no cleanup needed here, just return size of the trailer (for append) * Return: *      size of trailer header in this format */#if __STDC__off_tvcpio_endrd(void)#elseoff_tvcpio_endrd()#endif{	return((off_t)(sizeof(HD_VCPIO) + sizeof(TRAILER) +		(VCPIO_PAD(sizeof(HD_VCPIO) + sizeof(TRAILER)))));}/* * crc_stwr() *	start up the device mapping table, enable crc file calculation * Return: *	0 if ok, -1 otherwise (what dev_start() returns) */#if __STDC__intcrc_stwr(void)#elseintcrc_stwr()#endif{	docrc = 1;	return(dev_start());}/* * vcpio_wr() *	copy the data in the ARCHD to buffer in system VR4 cpio *	(with/without crc) format. * Return *	0 if file has data to be written after the header, 1 if file has *	NO data to write after the header, -1 if archive write failed */#if __STDC__intvcpio_wr(register ARCHD *arcn)#elseintvcpio_wr(arcn)	register ARCHD *arcn;#endif{	register HD_VCPIO *hd;	unsigned int nsz;	char hdblk[sizeof(HD_VCPIO)];	/*	 * check and repair truncated device and inode fields in the cpio	 * header	 */	if (map_dev(arcn, (u_long)VCPIO_MASK, (u_long)VCPIO_MASK) < 0)		return(-1);	nsz = arcn->nlen + 1;	hd = (HD_VCPIO *)hdblk;	if ((arcn->type != PAX_BLK) && (arcn->type != PAX_CHR))		arcn->sb.st_rdev = 0;	/*	 * add the proper magic value depending whether we were asked for	 * file data crc's, and the crc if needed.	 */	if (docrc) {		if (ul_asc((u_long)VCMAGIC, hd->c_magic, sizeof(hd->c_magic),	    		OCT) ||		    ul_asc((u_long)arcn->crc,hd->c_chksum,sizeof(hd->c_chksum),	    		HEX))			goto out;	} else {		if (ul_asc((u_long)VMAGIC, hd->c_magic, sizeof(hd->c_magic),	    		OCT) ||		    ul_asc((u_long)0L, hd->c_chksum, sizeof(hd->c_chksum),HEX))			goto out;	}	switch(arcn->type) {	case PAX_CTG:	case PAX_REG:	case PAX_HRG:		/*		 * caller will copy file data to the archive. tell him how		 * much to pad.		 */		arcn->pad = VCPIO_PAD(arcn->sb.st_size);#		ifdef NET2_STAT		if (ul_asc((u_long)arcn->sb.st_size, hd->c_filesize,		    sizeof(hd->c_filesize), HEX)) {#		else		if (uqd_asc((u_quad_t)arcn->sb.st_size, hd->c_filesize,		    sizeof(hd->c_filesize), HEX)) {#		endif			warn(1,"File is too large for sv4cpio format %s",			    arcn->org_name);			return(1);		}		break;	case PAX_SLK:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -