Browse Source

Plan 9 from Bell Labs 2003-09-06

David du Colombier 20 years ago
parent
commit
91a8c1e603
3 changed files with 26 additions and 7 deletions
  1. 2 2
      dist/replica/plan9.db
  2. 2 0
      dist/replica/plan9.log
  3. 22 5
      sys/src/cmd/ramfs.c

+ 2 - 2
dist/replica/plan9.db

@@ -344,7 +344,7 @@
 386/bin/proof - 775 sys sys 1056364329 176456
 386/bin/ps - 775 sys sys 1056364329 64653
 386/bin/pwd - 775 sys sys 1039758584 37188
-386/bin/ramfs - 775 sys sys 1056364330 89911
+386/bin/ramfs - 775 sys sys 1062759946 90119
 386/bin/rc - 775 sys sys 1056364331 141610
 386/bin/rdbfs - 775 sys sys 1056364332 170550
 386/bin/read - 775 sys sys 1056364332 56564
@@ -9849,7 +9849,7 @@ sys/src/cmd/ql/optab.c - 664 sys sys 944961082 12648
 sys/src/cmd/ql/pass.c - 664 sys sys 1045503973 8914
 sys/src/cmd/ql/sched.c - 664 sys sys 944961082 10778
 sys/src/cmd/ql/span.c - 664 sys sys 1045503974 14051
-sys/src/cmd/ramfs.c - 664 sys sys 1055699293 15087
+sys/src/cmd/ramfs.c - 664 sys sys 1062759940 15377
 sys/src/cmd/ratfs - 20000000775 sys sys 1016943965 0
 sys/src/cmd/ratfs/ctlfiles.c - 664 sys sys 1016943964 6694
 sys/src/cmd/ratfs/main.c - 664 sys sys 1016943964 6516

+ 2 - 0
dist/replica/plan9.log

@@ -13126,3 +13126,5 @@
 1062721914 0 c sys/src/9/boot/libboot.a8 - 664 sys sys 1062721685 54780
 1062721914 1 c sys/src/9/pc/pcauth - 664 sys sys 1062721660 632
 1062721914 2 c sys/src/9/port/systab.h - 664 sys sys 1062721698 3044
+1062761471 0 c 386/bin/ramfs - 775 sys sys 1062759946 90119
+1062761471 1 c sys/src/cmd/ramfs.c - 664 sys sys 1062759940 15377

+ 22 - 5
sys/src/cmd/ramfs.c

@@ -116,6 +116,7 @@ char	Eisopen[] = 	"file already open for I/O";
 char	Excl[] = 	"exclusive use file already open";
 char	Ename[] = 	"illegal name";
 char	Eversion[] =	"unknown 9P version";
+char	Enotempty[] =	"directory not empty";
 
 int debug;
 int private;
@@ -546,9 +547,23 @@ rwrite(Fid *f)
 	return 0;
 }
 
-void
+static int
+emptydir(Ram *dr)
+{
+	long didx = dr - ram;
+	Ram *r;
+
+	for(r=ram; r<&ram[nram]; r++)
+		if(r->busy && didx==r->parent)
+			return 0;
+	return 1;
+}
+
+char *
 realremove(Ram *r)
 {
+	if(r->qid.type & QTDIR && !emptydir(r))
+		return Enotempty;
 	r->ndata = 0;
 	if(r->data)
 		free(r->data);
@@ -558,19 +573,22 @@ realremove(Ram *r)
 	free(r->name);
 	r->name = nil;
 	r->busy = 0;
+	return nil;
 }
 
 char *
 rclunk(Fid *f)
 {
+	char *e = nil;
+
 	if(f->open)
 		f->ram->open--;
 	if(f->rclose)
-		realremove(f->ram);
+		e = realremove(f->ram);
 	f->busy = 0;
 	f->open = 0;
 	f->ram = 0;
-	return 0;
+	return e;
 }
 
 char *
@@ -587,8 +605,7 @@ rremove(Fid *f)
 	if(r->qid.path == 0 || !perm(f, &ram[r->parent], Pwrite))
 		return Eperm;
 	ram[r->parent].mtime = time(0);
-	realremove(r);
-	return 0;
+	return realremove(r);
 }
 
 char *