main(int argc, char** argv) { Ardir_t* dir; Ardirent_t* ent; long touch; char* file; touch = 0; while (file = *++argv) { if (!strcmp(file, "-t") && *(argv + 1)) touch = strtol(*++argv, NiL, 0); else if (dir = ardiropen(file, NiL, touch ? ARDIR_UPDATE : 0)) { sfprintf(sfstdout, "%s: type=%s truncate=%d%s\n", file, dir->meth->name, dir->truncate, (dir->flags & ARDIR_RANLIB) ? " ranlib" : ""); while (ent = ardirnext(dir)) { if (touch) { ent->mtime = touch; ardirchange(dir, ent); sfprintf(sfstdout, "touch %s\n", ent->name); } else sfprintf(sfstdout, "%s %8u %8u %8llu %8llu %s %s\n", fmtmode(ent->mode, 1), ent->uid, ent->gid, ent->size, ent->offset, fmttime("%k", ent->mtime), ent->name); } if (ardirclose(dir)) error(2, "%s: archive read error", file); } else error(ERROR_SYSTEM|2, "%s: not an archive", file); } return 0; }
static int ar_getheader(Pax_t* pax, register Archive_t* ap, register File_t* f) { register Ar_t* ar = (Ar_t*)ap->data; off_t pos; if (!(ar->ent = ardirnext(ar->dir))) { pos = lseek(ap->io->fd, (off_t)0, SEEK_END); return (pos < 0 || paxseek(pax, ap, pos, SEEK_SET, 0) != pos) ? -1 : 0; } f->name = ar->ent->name; f->st->st_dev = 0; f->st->st_ino = 0; f->st->st_mode = X_IFREG|(ar->ent->mode&X_IPERM); f->st->st_uid = ar->ent->uid; f->st->st_gid = ar->ent->gid; f->st->st_nlink = 1; IDEVICE(f->st, 0); f->st->st_mtime = ar->ent->mtime; f->st->st_size = ar->ent->size; f->linktype = NOLINK; f->linkpath = 0; f->uidname = 0; f->gidname = 0; return 1; }