summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorforsyth <forsyth@vitanuova.com>2010-01-15 06:33:20 +0000
committerforsyth <forsyth@vitanuova.com>2010-01-15 06:33:20 +0000
commitd78912f045c51c0ac413a65d982c926f397160e2 (patch)
tree8f547b6d8bb0ec8549f95ebb7301b16afd65e9ec
parentee328a911bfed5377dd08c25e9431b15832ee2f7 (diff)
20100115-0631
-rw-r--r--CHANGES2
-rw-r--r--appl/cmd/tarfs.b49
-rw-r--r--dis/tarfs.disbin6160 -> 6602 bytes
-rw-r--r--include/version.h2
4 files changed, 41 insertions, 12 deletions
diff --git a/CHANGES b/CHANGES
index cbabd8b1..c9e346ec 100644
--- a/CHANGES
+++ b/CHANGES
@@ -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
index ea65044a..7b65eee8 100644
--- a/dis/tarfs.dis
+++ b/dis/tarfs.dis
Binary files differ
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)"