Пример #1
0
static int
tp_getprologue(Pax_t* pax, Paxformat_t* fp, register Paxarchive_t* ap, Paxfile_t* f, unsigned char* buf, size_t size)
{
	register Ar_t*		ar;
	register ui1*		s;
	register ui1*		e;
	int16_t			w;
	size_t			n;

	if (size < 2 * TP_BLOCK)
		return 0;
	w = 0;
	for (e = (s = (ui1*)buf + TP_BLOCK) + TP_BLOCK; s < e; s += 2)
		w += s[0] + (s[1]<<8);
	if (w)
		return 0;
	w = ((Dir_t*)buf)->checksum[0] + (((Dir_t*)buf)->checksum[1]<<8);
	if (w < 0 || w > DIRMAG)
		w = DIRMAG;
	n = (size_t)w * sizeof(Dir_t);
	if (!(ar = newof(0, Ar_t, 1, n - sizeof(Dir_t))))
		return paxnospace(pax);
	if (paxread(pax, ap, NiL, PAX_BLOCK, 0, 0) != PAX_BLOCK || paxread(pax, ap, ar->dir, n, 0, 0) != n)
	{
		error(2, "%s: %s format directory read error", ap->name, fp->name);
		free(ar);
		return -1;
	}
	ar->dp = ar->dir;
	ar->ep = ar->dir + w;
	ar->pax = pax;
	ar->ap = ap;
	ap->data = ar;
	return 1;
}
Пример #2
0
static Sfio_t*
paxpart(Pax_t* pax, Paxarchive_t* ap, off_t n)
{
	register Part_t*	part;

	static int		fd = -1;

	if (!(part = ap->partio))
	{
		if (!(part = newof(0, Part_t, 1, 0)) || !(part->sp = sfstropen()))
		{
			paxnospace(pax);
			return 0;
		}
		part->sp->_flags &= ~(SF_READ|SF_WRITE|SF_STRING);
		if (ap->flags & PAX_IN)
			part->sp->_flags |= SF_READ;
		else
			part->sp->_flags |= SF_WRITE;
		if (fd < 0)
			fd = open("/dev/null", O_RDWR);
		part->sp->_file = fd;
		part->disc.readf = part_read;
		part->disc.writef = part_write;
		if (sfdisc(part->sp, &part->disc) != &part->disc)
		{
			sfclose(part->sp);
			free(part);
			return 0;
		}
		part->pax = pax;
		part->ap = ap;
		ap->partio = part;
	}
	part->n = n;
	return part->sp;
}