windows-nt/Source/XPSP1/NT/base/subsys/posix/programs/psxarc/archive.c
2020-09-26 16:20:57 +08:00

119 lines
2.2 KiB
C

//
// In this file are routines to perform operations on archive files.
// They do this by determining the type of the archive and calling a
// corresponding type-specific routine.
//
#include <stdlib.h>
#include <stdio.h>
#include <tar.h>
#include <string.h>
#include "buf.h"
#include "psxarc.h"
#include "tarhead.h"
#include "cpio.h"
#include "links.h"
//
// These should be in an include file.
//
extern void CpioList(), CpioRead(), CpioWrite();
extern void TarList(), TarRead(), TarWrite();
extern void cpio_itoa();
void
ListArchive(PBUF pb)
{
PCPIO_HEAD cp;
PTAR_HEAD tp;
InitLinkList();
bfill(pb);
cp = (PCPIO_HEAD)pb->data;
if (0 == strncmp(cp->c_magic, MAGIC, strlen(MAGIC))) {
CpioList(pb);
return;
}
tp = (PTAR_HEAD)pb->data;
if (0 == strncmp(tp->s.magic, TMAGIC, strlen(TMAGIC))) {
TarList(pb);
return;
}
fprintf(stderr, "%s: unknown archive type\n", progname);
exit(4);
}
void
WriteArchive(PBUF pb, int format, char **files, int count)
{
InitLinkList();
if (FORMAT_CPIO == format) {
int len, i;
CPIO_HEAD h;
CpioWrite(pb, files, count);
// write the trailer.
(void)strncpy(h.c_magic, MAGIC, strlen(MAGIC));
cpio_itoa(C_ISREG, h.c_mode, sizeof(h.c_mode));
cpio_itoa(sizeof(LASTFILENAME), h.c_namesize,
sizeof(h.c_namesize));
cpio_itoa(0, h.c_filesize, sizeof(h.c_namesize));
for (i = 0; i < sizeof(h); ++i) {
bputc(pb, ((char *)&h)[i]);
}
// "sizeof" so we get the nul, too
len = sizeof(LASTFILENAME);
for (i = 0; i < len; ++i) {
bputc(pb, LASTFILENAME[i]);
}
bflush(pb);
return;
}
if (FORMAT_TAR == format) {
TarWrite(pb, files, count);
// a tar archive is terminated by two blocks of zeroes.
memset(pb->data, 0, sizeof(pb->data));
bflush(pb);
bflush(pb);
return;
}
// shouldn't get here.
exit(10);
}
void
ReadArchive(PBUF pb)
{
PCPIO_HEAD cp;
PTAR_HEAD tp;
InitLinkList();
bfill(pb);
cp = (PCPIO_HEAD)pb->data;
if (0 == strncmp(cp->c_magic, MAGIC, strlen(MAGIC))) {
CpioRead(pb);
return;
}
tp = (PTAR_HEAD)pb->data;
if (0 == strncmp(tp->s.magic, TMAGIC, strlen(TMAGIC))) {
TarRead(pb);
return;
}
fprintf(stderr, "%s: unknown archive type\n", progname);
exit(4);
}