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; }
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; }