diff options
| -rw-r--r-- | CHANGES | 2 | ||||
| -rw-r--r-- | appl/cmd/tarfs.b | 49 | ||||
| -rw-r--r-- | dis/tarfs.dis | bin | 6160 -> 6602 bytes | |||
| -rw-r--r-- | include/version.h | 2 |
4 files changed, 41 insertions, 12 deletions
@@ -1,3 +1,5 @@ +20100115 + appl/cmd/tarfs.b man/4/tarfs changes to permission handling from mecchiel [issue 220] 20100110 appl/cmd/tcs.b [issue 12, arvindht]: process unconverted bytes next cycle, flush conversion state; improve error checking 20091219 diff --git a/appl/cmd/tarfs.b b/appl/cmd/tarfs.b index b0ec5add..6e4b653f 100644 --- a/appl/cmd/tarfs.b +++ b/appl/cmd/tarfs.b @@ -6,7 +6,6 @@ implement Tarfs; include "sys.m"; sys: Sys; - Qid: import Sys; include "draw.m"; @@ -33,8 +32,8 @@ File: adt { x: int; name: string; mode: int; - uid: int; - gid: int; + uid: string; + gid: string; mtime: int; length: big; offset: big; @@ -47,6 +46,7 @@ File: adt { }; tarfd: ref Sys->FD; +pflag: int; root: ref File; files: array of ref File; pathgen: int; @@ -86,6 +86,7 @@ init(nil: ref Draw->Context, args: list of string) 'a' => flags = Sys->MAFTER; 'b' => flags = Sys->MBEFORE; 'D' => styxservers->traceset(1); + 'p' => pflag++; * => arg->usage(); } args = arg->argv(); @@ -104,8 +105,8 @@ init(nil: ref Draw->Context, args: list of string) root.x = 0; root.name = "/"; root.mode = Sys->DMDIR | 8r555; - root.uid = 0; - root.gid = 0; + root.uid = "0"; + root.gid = "0"; root.length = big 0; root.offset = big 0; root.mtime = 0; @@ -204,11 +205,17 @@ File.stat(f: self ref File): ref Sys->Dir { d := ref sys->zerodir; d.mode = f.mode; + if(pflag) { + d.mode &= 16rff<<24; + d.mode |= 8r444; + if(f.mode & Sys->DMDIR) + d.mode |= 8r111; + } d.qid.path = big f.x; d.qid.qtype = f.mode>>24; d.name = f.name; - d.uid = string f.uid; - d.gid = string f.gid; + d.uid = f.uid; + d.gid = f.gid; d.muid = d.uid; d.length = f.length; d.mtime = f.mtime; @@ -229,10 +236,18 @@ split(s: string): (string, string) putfile(f: ref File) { - n := f.name; + orign := n := f.name; df := root; for(;;){ (d, rest) := split(n); + if(d == ".") { + n = rest; + continue; + } + if(d == "..") { + warn(sys->sprint("ignoring %q", orign)); + return; + } if(d == nil || rest == nil){ f.name = n; break; @@ -247,7 +262,8 @@ putfile(f: ref File) n = rest; df = g; } - df.enter(f); + if(f.name != "." && f.name != "..") + df.enter(f); } navigator(navops: chan of ref Navop) @@ -352,8 +368,8 @@ readtar(fd: ref Sys->FD): int f.name = f.name[:len f.name-1]; } f.mode = mode; - f.uid = int octal(buf[Ouid:Ogid]); - f.gid = int octal(buf[Ogid:Osize]); + f.uid = string octal(buf[Ouid:Ogid]); + f.gid = string octal(buf[Ogid:Osize]); f.length = octal(buf[Osize:Omtime]); if(f.length < big 0) error(sys->sprint("tar file size is negative: %s", f.name)); @@ -368,6 +384,12 @@ readtar(fd: ref Sys->FD): int v := int (f.length % big Blocksize); if(v != 0) offset += big (Blocksize-v); + + if(ascii(buf[Omagic:Ouname]) == "ustar" && string buf[Omagic+6:Omagic+8] == "00") { + f.uid = ascii(buf[Ouname:Ogname]); + f.gid = ascii(buf[Ogname:Omajor]); + } + putfile(f); } return 0; @@ -409,3 +431,8 @@ checksum(b: array of byte): int c += int b[i]; return c; } + +warn(s: string) +{ + sys->fprint(sys->fildes(2), "%s\n", s); +} diff --git a/dis/tarfs.dis b/dis/tarfs.dis Binary files differindex ea65044a..7b65eee8 100644 --- a/dis/tarfs.dis +++ b/dis/tarfs.dis diff --git a/include/version.h b/include/version.h index e011be2e..5dbe9821 100644 --- a/include/version.h +++ b/include/version.h @@ -1 +1 @@ -#define VERSION "Fourth Edition (20100112)" +#define VERSION "Fourth Edition (20100115)" |
