From e5888a1ffdae813d7575f5fb02275c6bb07e5199 Mon Sep 17 00:00:00 2001 From: Taru Karttunen Date: Wed, 30 Mar 2011 15:46:40 +0300 Subject: Import sources from 2011-03-30 iso image --- sys/src/ape/9src/tar.c | 127 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100755 sys/src/ape/9src/tar.c (limited to 'sys/src/ape/9src/tar.c') diff --git a/sys/src/ape/9src/tar.c b/sys/src/ape/9src/tar.c new file mode 100755 index 000000000..b72e8d701 --- /dev/null +++ b/sys/src/ape/9src/tar.c @@ -0,0 +1,127 @@ +/* + * Attempt at emulation of Unix tar by calling Plan 9 tar. + * + * The differences from Plan 9 tar are: + * In the absence of an "f" flag, the file /dev/tape is used. + * An "f" flag with argument "-" causes use of stdin/stdout + * by passing no "f" flag (nor argument) to Plan 9 tar. + * By default, the "T" flag is passed to Plan 9 tar. + * The "m" flag to this tar inhibits this behavior. + */ + +#include +#include + +void +usage(void) +{ + fprint(2, "usage: ape/tar [crtx][vfm] [args...] [file...]\n"); + exits("usage"); +} + +void +main(int argc, char **argv) +{ + int i, j, verb, vflag, fflag, Tflag, nargc; + char *p, *file, **nargv, *cpu, flagbuf[10], execbuf[128]; + Waitmsg *w; + + argv++, argc--; + if(argc < 1) + usage(); + + p = argv[0]; + argv++, argc--; + + if(*p == '-') + p++; + + if(strchr("crtx", *p) == nil) + usage(); + verb = *p++; + + /* unix defaults */ + fflag = 1; + file = "/dev/tape"; + Tflag = 1; + vflag = 0; + + for(; *p; p++) { + switch(*p) { + default: + usage(); + case 'v': + vflag = 1; + break; + case 'f': + if(argc <= 0) + usage(); + + fflag = 1; + file = argv[0]; + argv++, argc--; + if(strcmp(file, "-") == 0) { + /* + * plan9 doesn't know about "-" meaning stdin/stdout, + * but it's the default, + * so rewrite to not use f flag at all. + */ + file = nil; + fflag = 0; + } + break; + case 'm': + Tflag = 0; + break; + case 'p': /* pretend nothing's wrong */ + break; + } + } + + nargc = 1 + 1 + fflag + argc + 1; + nargv = malloc(sizeof(char*) * nargc); + if(nargv == nil) { + fprint(2, "ape/tar: out of memory\n"); + exits("memory"); + } + + cpu = getenv("cputype"); + if(cpu == nil) { + fprint(2, "ape/tar: need cputype environment variable set\n"); + exits("cputype"); + } + snprint(execbuf, sizeof execbuf, "/%s/bin/tar", cpu); + + nargv[0] = "tar"; + sprint(flagbuf, "%c%s%s%s", verb, vflag ? "v" : "", Tflag ? "T" : "", fflag ? "f" : ""); + nargv[1] = flagbuf; + + i = 2; + if(fflag) + nargv[i++] = file; + + for(j=0; jmsg[0] == '\0') + exits(nil); + else + exits(w->msg); + } + assert(0); +} -- cgit v1.2.3