shithub: riscv

Download patch

ref: 0fb128b622024d64e4b26799cddce44e50a096cc
parent: 7e0519a5e40209e0481e761240363528de45d1cd
author: cinap_lenrek <cinap_lenrek@localhost>
date: Fri Apr 29 05:15:28 EDT 2011

proto: change mkfs to use libdisk to process proto files, inst: use -U option in mkfs so uid is set and automatic reboot, realemu: cleanup

--- a/rc/bin/inst/copydist
+++ b/rc/bin/inst/copydist
@@ -17,7 +17,7 @@
 	}
 case go
 	rm -f /tmp/copydone
-	disk/mkfs -z 16384 -p -s /n/dist -d /n/newfs /sys/lib/sysconfig/proto/allproto
+	disk/mkfs -z 16372 -U -s /n/dist -d /n/newfs /sys/lib/sysconfig/proto/allproto
 	touch /tmp/copydone
 
 case checkdone
--- a/rc/bin/inst/halt
+++ b/rc/bin/inst/halt
@@ -1,8 +1,3 @@
 #!/bin/rc
-
-echo -n 'Halting file systems...'
-fshalt
-
-echo
-echo Remember to take the install disk out of the drive.
-echo Feel free to turn off your computer.
+fshalt -r
+while(){}
--- a/sys/src/cmd/aux/realemu/xec.c
+++ b/sys/src/cmd/aux/realemu/xec.c
@@ -1063,11 +1063,11 @@
 }
 
 static int
-repcond(Cpu *cpu, int rep)
+repcond(ulong *f, int rep)
 {
 	if(rep == OREPNE)
-		return (cpu->reg[RFL] & ZF) == 0;
-	return !rep || (cpu->reg[RFL] & ZF) != 0;
+		return (*f & ZF) == 0;
+	return !rep || (*f & ZF) != 0;
 }
 
 static void
@@ -1098,7 +1098,7 @@
 		d->off += n;
 		d->off &= m;
 		c--;
-		if(repcond(cpu, i->rep))
+		if(repcond(f, i->rep))
 			break;
 	}
 	aw(areg(cpu, i->alen, RDI), d->off);
@@ -1135,7 +1135,7 @@
 		d->off += n;
 		d->off &= m;
 		c--;
-		if(repcond(cpu, i->rep))
+		if(repcond(f, i->rep))
 			break;
 	}
 	aw(areg(cpu, i->alen, RDI), d->off);
--- a/sys/src/cmd/disk/mkfs.c
+++ b/sys/src/cmd/disk/mkfs.c
@@ -1,11 +1,11 @@
 #include <u.h>
 #include <libc.h>
+#include <disk.h>
 #include <auth.h>
 #include <bio.h>
 
 enum{
-	LEN	= 8*1024,
-	HUNKS	= 128,
+	LEN = 4096,
 
 	/*
 	 * types of destination file sytems
@@ -15,44 +15,19 @@
 	Archive,
 };
 
-typedef struct File	File;
+void	protowarn(char *msg, void *);
+void	protoenum(char *new, char *old, Dir *d, void *);
 
-struct File{
-	char	*new;
-	char	*elem;
-	char	*old;
-	char	*uid;
-	char	*gid;
-	ulong	mode;
-};
-
 void	arch(Dir*);
 void	copy(Dir*);
-int	copyfile(File*, Dir*, int);
-void*	emalloc(ulong);
 void	error(char *, ...);
-void	freefile(File*);
-File*	getfile(File*);
-char*	getmode(char*, ulong*);
-char*	getname(char*, char**);
-char*	getpath(char*);
 void	kfscmd(char *);
 void	mkdir(Dir*);
-int	mkfile(File*);
-void	mkfs(File*, int);
-char*	mkpath(char*, char*);
-void	mktree(File*, int);
 void	mountkfs(char*);
-void	printfile(File*);
-void	setnames(File*);
-void	setusers(void);
-void	skipdir(void);
-char*	strdup(char*);
 int	uptodate(Dir*, char*);
 void	usage(void);
 void	warn(char *, ...);
 
-Biobuf	*b;
 Biobufhdr bout;			/* stdout when writing archive */
 uchar	boutbuf[2*LEN];
 char	newfile[LEN];
@@ -63,11 +38,9 @@
 char	*oldroot;
 char	*newroot;
 char	*prog = "mkfs";
-int	lineno;
 char	*buf;
 char	*zbuf;
 int	buflen = 1024-8;
-int	indent;
 int	verb;
 int	modes;
 int	ream;
@@ -81,7 +54,6 @@
 void
 main(int argc, char **argv)
 {
-	File file;
 	char *name;
 	int i, errs;
 
@@ -88,9 +60,6 @@
 	quotefmtinstall();
 	user = getuser();
 	name = "";
-	memset(&file, 0, sizeof file);
-	file.new = "";
-	file.old = 0;
 	oldroot = "";
 	newroot = "/n/kfs";
 	users = 0;
@@ -150,34 +119,25 @@
 	if(!argc)	
 		usage();
 
-	buf = emalloc(buflen);
-	zbuf = emalloc(buflen);
+	buf = malloc(buflen);
+	zbuf = malloc(buflen);
 	memset(zbuf, 0, buflen);
 
 	mountkfs(name);
 	kfscmd("allow");
-	proto = "users";
-	setusers();
 	cputype = getenv("cputype");
 	if(cputype == 0)
-		cputype = "68020";
+		cputype = "386";
 
 	errs = 0;
 	for(i = 0; i < argc; i++){
 		proto = argv[i];
 		fprint(2, "processing %q\n", proto);
-
-		b = Bopen(proto, OREAD);
-		if(!b){
+		if(rdproto(proto, oldroot, protoenum, protowarn, nil) < 0){
 			fprint(2, "%q: can't open %q: skipping\n", prog, proto);
 			errs++;
 			continue;
 		}
-
-		lineno = 0;
-		indent = 0;
-		mkfs(&file, -1);
-		Bterm(b);
 	}
 	fprint(2, "file system made\n");
 	kfscmd("disallow");
@@ -191,139 +151,6 @@
 	exits(0);
 }
 
-void
-mkfs(File *me, int level)
-{
-	File *child;
-	int rec;
-
-	child = getfile(me);
-	if(!child)
-		return;
-	if((child->elem[0] == '+' || child->elem[0] == '*') && child->elem[1] == '\0'){
-		rec = child->elem[0] == '+';
-		free(child->new);
-		child->new = strdup(me->new);
-		setnames(child);
-		mktree(child, rec);
-		freefile(child);
-		child = getfile(me);
-	}
-	while(child && indent > level){
-		if(mkfile(child))
-			mkfs(child, indent);
-		freefile(child);
-		child = getfile(me);
-	}
-	if(child){
-		freefile(child);
-		Bseek(b, -Blinelen(b), 1);
-		lineno--;
-	}
-}
-
-void
-mktree(File *me, int rec)
-{
-	File child;
-	Dir *d;
-	int i, n, fd;
-
-	fd = open(oldfile, OREAD);
-	if(fd < 0){
-		warn("can't open %q: %r", oldfile);
-		return;
-	}
-
-	child = *me;
-	while((n = dirread(fd, &d)) > 0){
-		for(i = 0; i < n; i++){
-			child.new = mkpath(me->new, d[i].name);
-			if(me->old)
-				child.old = mkpath(me->old, d[i].name);
-			child.elem = d[i].name;
-			setnames(&child);
-			if(copyfile(&child, &d[i], 1) && rec)
-				mktree(&child, rec);
-			free(child.new);
-			if(child.old)
-				free(child.old);
-		}
-	}
-	close(fd);
-}
-
-int
-mkfile(File *f)
-{
-	Dir *dir;
-
-	if((dir = dirstat(oldfile)) == nil){
-		warn("can't stat file %q: %r", oldfile);
-		skipdir();
-		return 0;
-	}
-	return copyfile(f, dir, 0);
-}
-
-int
-copyfile(File *f, Dir *d, int permonly)
-{
-	ulong mode;
-	Dir nd;
-
-	if(xflag){
-		Bprint(&bout, "%q\t%ld\t%lld\n", f->new, d->mtime, d->length);
-		return (d->mode & DMDIR) != 0;
-	}
-	if(verb && (fskind == Archive || ream))
-		fprint(2, "%q\n", f->new);
-	d->name = f->elem;
-	if(d->type != 'M'){
-		d->uid = "sys";
-		d->gid = "sys";
-		mode = (d->mode >> 6) & 7;
-		d->mode |= mode | (mode << 3);
-	}
-	if(strcmp(f->uid, "-") != 0)
-		d->uid = f->uid;
-	if(strcmp(f->gid, "-") != 0)
-		d->gid = f->gid;
-	if(fskind == Fs && !setuid){
-		d->uid = "";
-		d->gid = "";
-	}
-	if(f->mode != ~0){
-		if(permonly)
-			d->mode = (d->mode & ~0666) | (f->mode & 0666);
-		else if((d->mode&DMDIR) != (f->mode&DMDIR))
-			warn("inconsistent mode for %q", f->new);
-		else
-			d->mode = f->mode;
-	}
-	if(!uptodate(d, newfile)){
-		if(verb && (fskind != Archive && ream == 0))
-			fprint(2, "%q\n", f->new);
-		if(d->mode & DMDIR)
-			mkdir(d);
-		else
-			copy(d);
-	}else if(modes){
-		nulldir(&nd);
-		nd.mode = d->mode;
-		nd.gid = d->gid;
-		nd.mtime = d->mtime;
-		if(verb && (fskind != Archive && ream == 0))
-			fprint(2, "%q\n", f->new);
-		if(dirwstat(newfile, &nd) < 0)
-			warn("can't set modes for %q: %r", f->new);
-		nulldir(&nd);
-		nd.uid = d->uid;
-		dirwstat(newfile, &nd);
-	}
-	return (d->mode & DMDIR) != 0;
-}
-
 /*
  * check if file to is up to date with
  * respect to the file represented by df
@@ -478,276 +305,53 @@
 		newfile, d->mode, d->uid, d->gid, d->mtime, d->length);
 }
 
-char *
-mkpath(char *prefix, char *elem)
-{
-	char *p;
-	int n;
-
-	n = strlen(prefix) + strlen(elem) + 2;
-	p = emalloc(n);
-	sprint(p, "%s/%s", prefix, elem);
-	return p;
-}
-
-char *
-strdup(char *s)
-{
-	char *t;
-
-	t = emalloc(strlen(s) + 1);
-	return strcpy(t, s);
-}
-
 void
-setnames(File *f)
+protowarn(char *msg, void *)
 {
-	sprint(newfile, "%s%s", newroot, f->new);
-	if(f->old){
-		if(f->old[0] == '/')
-			sprint(oldfile, "%s%s", oldroot, f->old);
-		else
-			strcpy(oldfile, f->old);
-	}else
-		sprint(oldfile, "%s%s", oldroot, f->new);
-	if(strlen(newfile) >= sizeof newfile 
-	|| strlen(oldfile) >= sizeof oldfile)
-		error("name overfile");
+	warn("%s", msg);
 }
 
 void
-freefile(File *f)
+protoenum(char *new, char *old, Dir *d, void *)
 {
-	if(f->old)
-		free(f->old);
-	if(f->new)
-		free(f->new);
-	free(f);
-}
+	Dir nd;
 
-/*
- * skip all files in the proto that
- * could be in the current dir
- */
-void
-skipdir(void)
-{
-	char *p, c;
-	int level;
+	sprint(newfile, "%s%s", newroot, new);
+	sprint(oldfile, "%s", old);
 
-	if(indent < 0 || b == nil)	/* b is nil when copying adm/users */
+	if(xflag){
+		Bprint(&bout, "%q\t%ld\t%lld\n", new, d->mtime, d->length);
 		return;
-	level = indent;
-	for(;;){
-		indent = 0;
-		p = Brdline(b, '\n');
-		lineno++;
-		if(!p){
-			indent = -1;
-			return;
-		}
-		while((c = *p++) != '\n')
-			if(c == ' ')
-				indent++;
-			else if(c == '\t')
-				indent += 8;
-			else
-				break;
-		if(indent <= level){
-			Bseek(b, -Blinelen(b), 1);
-			lineno--;
-			return;
-		}
 	}
-}
-
-File*
-getfile(File *old)
-{
-	File *f;
-	char *elem;
-	char *p;
-	int c;
-
-	if(indent < 0)
-		return 0;
-loop:
-	indent = 0;
-	p = Brdline(b, '\n');
-	lineno++;
-	if(!p){
-		indent = -1;
-		return 0;
+	if(verb && (fskind == Archive || ream))
+		fprint(2, "%q\n", new);
+	if(fskind == Fs && !setuid){
+		d->uid = "";
+		d->gid = "";
 	}
-	while((c = *p++) != '\n')
-		if(c == ' ')
-			indent++;
-		else if(c == '\t')
-			indent += 8;
+	if(!uptodate(d, newfile)){
+		if(verb && (fskind != Archive && ream == 0))
+			fprint(2, "%q\n", new);
+		if(d->mode & DMDIR)
+			mkdir(d);
 		else
-			break;
-	if(c == '\n' || c == '#')
-		goto loop;
-	p--;
-	f = emalloc(sizeof *f);
-	p = getname(p, &elem);
-	if(debug)
-		fprint(2, "getfile: %q root %q\n", elem, old->new);
-	f->new = mkpath(old->new, elem);
-	f->elem = utfrrune(f->new, L'/') + 1;
-	p = getmode(p, &f->mode);
-	p = getname(p, &f->uid);
-	if(!*f->uid)
-		f->uid = "-";
-	p = getname(p, &f->gid);
-	if(!*f->gid)
-		f->gid = "-";
-	f->old = getpath(p);
-	if(f->old && strcmp(f->old, "-") == 0){
-		free(f->old);
-		f->old = 0;
+			copy(d);
+	}else if(modes){
+		nulldir(&nd);
+		nd.mode = d->mode;
+		nd.gid = d->gid;
+		nd.mtime = d->mtime;
+		if(verb && (fskind != Archive && ream == 0))
+			fprint(2, "%q\n", new);
+		if(dirwstat(newfile, &nd) < 0)
+			warn("can't set modes for %q: %r", new);
+		nulldir(&nd);
+		nd.uid = d->uid;
+		dirwstat(newfile, &nd);
 	}
-	setnames(f);
-
-	if(debug)
-		printfile(f);
-
-	return f;
 }
 
-char*
-getpath(char *p)
-{
-	char *q, *new;
-	int c, n;
-
-	while((c = *p) == ' ' || c == '\t')
-		p++;
-	q = p;
-	while((c = *q) != '\n' && c != ' ' && c != '\t')
-		q++;
-	if(q == p)
-		return 0;
-	n = q - p;
-	new = emalloc(n + 1);
-	memcpy(new, p, n);
-	new[n] = 0;
-	return new;
-}
-
-char*
-getname(char *p, char **buf)
-{
-	char *s, *start;
-	int c;
-
-	while((c = *p) == ' ' || c == '\t')
-		p++;
-
-	start = p;
-	while((c = *p) != '\n' && c != ' ' && c != '\t' && c != '\0')
-		p++;
-
-	*buf = malloc(p+1-start);
-	if(*buf == nil)
-		return nil;
-	memmove(*buf, start, p-start);
-	(*buf)[p-start] = '\0';
-
-	if(**buf == '$'){
-		s = getenv(*buf+1);
-		if(s == 0){
-			warn("can't read environment variable %q", *buf+1);
-			skipdir();
-			free(*buf);
-			return nil;
-		}
-		free(*buf);
-		*buf = s;
-	}
-	return p;
-}
-
-char*
-getmode(char *p, ulong *xmode)
-{
-	char *buf, *s;
-	ulong m;
-
-	*xmode = ~0;
-	p = getname(p, &buf);
-	if(p == nil)
-		return nil;
-
-	s = buf;
-	if(!*s || strcmp(s, "-") == 0)
-		return p;
-	m = 0;
-	if(*s == 'd'){
-		m |= DMDIR;
-		s++;
-	}
-	if(*s == 'a'){
-		m |= DMAPPEND;
-		s++;
-	}
-	if(*s == 'l'){
-		m |= DMEXCL;
-		s++;
-	}
-	if(s[0] < '0' || s[0] > '7'
-	|| s[1] < '0' || s[1] > '7'
-	|| s[2] < '0' || s[2] > '7'
-	|| s[3]){
-		warn("bad mode specification %q", buf);
-		free(buf);
-		return p;
-	}
-	*xmode = m | strtoul(s, 0, 8);
-	free(buf);
-	return p;
-}
-
 void
-setusers(void)
-{
-	File file;
-	int m;
-
-	if(fskind != Kfs)
-		return;
-	m = modes;
-	modes = 1;
-	file.uid = "adm";
-	file.gid = "adm";
-	file.mode = DMDIR|0775;
-	file.new = "/adm";
-	file.elem = "adm";
-	file.old = 0;
-	setnames(&file);
-	strcpy(oldfile, file.new);	/* Don't use root for /adm */
-	mkfile(&file);
-	file.new = "/adm/users";
-	file.old = users;
-	file.elem = "users";
-	file.mode = 0664;
-	setnames(&file);
-	if (file.old)
-		strcpy(oldfile, file.old);	/* Don't use root for /adm/users */
-	mkfile(&file);
-	kfscmd("user");
-	mkfile(&file);
-	file.mode = DMDIR|0775;
-	file.new = "/adm";
-	file.old = "/adm";
-	file.elem = "adm";
-	setnames(&file);
-	strcpy(oldfile, file.old);	/* Don't use root for /adm */
-	mkfile(&file);
-	modes = m;
-}
-
-void
 mountkfs(char *name)
 {
 	char kname[64];
@@ -802,16 +406,6 @@
 	}
 }
 
-void *
-emalloc(ulong n)
-{
-	void *p;
-
-	if((p = malloc(n)) == 0)
-		error("out of memory");
-	return p;
-}
-
 void
 error(char *fmt, ...)
 {
@@ -818,7 +412,7 @@
 	char buf[1024];
 	va_list arg;
 
-	sprint(buf, "%q: %q:%d: ", prog, proto, lineno);
+	sprint(buf, "%q: %q: ", prog, proto);
 	va_start(arg, fmt);
 	vseprint(buf+strlen(buf), buf+sizeof(buf), fmt, arg);
 	va_end(arg);
@@ -834,7 +428,7 @@
 	char buf[1024];
 	va_list arg;
 
-	sprint(buf, "%q: %q:%d: ", prog, proto, lineno);
+	sprint(buf, "%q: %q: ", prog, proto);
 	va_start(arg, fmt);
 	vseprint(buf+strlen(buf), buf+sizeof(buf), fmt, arg);
 	va_end(arg);
@@ -842,17 +436,8 @@
 }
 
 void
-printfile(File *f)
-{
-	if(f->old)
-		fprint(2, "%q from %q %q %q %lo\n", f->new, f->old, f->uid, f->gid, f->mode);
-	else
-		fprint(2, "%q %q %q %lo\n", f->new, f->uid, f->gid, f->mode);
-}
-
-void
 usage(void)
 {
-	fprint(2, "usage: %q [-aprvx] [-d root] [-n name] [-s source] [-u users] [-z n] proto ...\n", prog);
+	fprint(2, "usage: %q [-adprvxUD] [-d root] [-n name] [-s source] [-u users] [-z n] proto ...\n", prog);
 	exits("usage");
 }
--- a/sys/src/libdisk/proto.c
+++ b/sys/src/libdisk/proto.c
@@ -68,7 +68,7 @@
 static int	mkfile(Mkaux*, File*);
 static char*	mkpath(Mkaux*, char*, char*);
 static void	mktree(Mkaux*, File*, int);
-static void	setnames(Mkaux*, File*);
+static void	setname(Mkaux*, Name*, File*);
 static void	skipdir(Mkaux*);
 static void	warn(Mkaux*, char *, ...);
 static void	popopt(Mkaux *mkaux);
@@ -154,7 +154,7 @@
 		rec = child->elem[0] == '+';
 		free(child->new);
 		child->new = estrdup(mkaux, me->new);
-		setnames(mkaux, child);
+		setname(mkaux, &mkaux->oldfile, child);
 		mktree(mkaux, child, rec);
 		freefile(child);
 		child = getfile(mkaux, me);
@@ -194,7 +194,7 @@
 			if(me->old)
 				child.old = mkpath(mkaux, me->old, d[i].name);
 			child.elem = d[i].name;
-			setnames(mkaux, &child);
+			setname(mkaux, &mkaux->oldfile, &child);
 			if((!(d[i].mode&DMDIR) || rec) && copyfile(mkaux, &child, &d[i], 1) && rec)
 				mktree(mkaux, &child, rec);
 			free(child.new);
@@ -223,19 +223,36 @@
 };
 
 static void
-setname(Mkaux *mkaux, Name *name, char *s1, char *s2)
+setname(Mkaux *mkaux, Name *name, File *f)
 {
+	char *s1, *s2, *ss;
 	int l;
+	
+	s1 = mkaux->root;
+	s2 = "";
+	if(f->old){
+		/* if old is not a absolute path, dont append root to it */
+		if(f->old[0] != '/')
+			s1 = f->old;
+		else
+			s2 = f->old;
+	}else
+		s2 = f->new;
 
-	l = strlen(s1)+strlen(s2)+1;
+	l = strlen(s1);
+	ss = (*s1 && *s2 && *s2 != '/' && s1[l-1] != '/') ? "/" : "";
+	l += strlen(ss);
+	l += strlen(s2);
+	l++;
 	if(name->n < l+SLOP/2) {
 		free(name->s);
 		name->s = emalloc(mkaux, l+SLOP);
 		name->n = l+SLOP;
 	}
-	snprint(name->s, name->n, "%s%s%s", s1, *s1==0 || s1[strlen(s1)-1]!='/' ? "/" : "", s2);
+	snprint(name->s, name->n, "%s%s%s", s1, ss, s2);
 }
 
+
 static int
 copyfile(Mkaux *mkaux, File *f, Dir *d, int permonly)
 {
@@ -244,7 +261,8 @@
 	ulong xmode;
 	char *p;
 
-	setname(mkaux, &mkaux->fullname, mkaux->root, f->old ? f->old : f->new);
+	setname(mkaux, &mkaux->fullname, f);
+
 	/*
 	 * Extra stat here is inefficient but accounts for binds.
 	 */
@@ -301,19 +319,6 @@
 }
 
 static void
-setnames(Mkaux *mkaux, File *f)
-{
-	
-	if(f->old){
-		if(f->old[0] == '/')
-			setname(mkaux, &mkaux->oldfile, f->old, "");
-		else
-			setname(mkaux, &mkaux->oldfile, mkaux->root, f->old);
-	} else
-		setname(mkaux, &mkaux->oldfile, mkaux->root, f->new);
-}
-
-static void
 setopt(Mkaux *mkaux, char *key, char *val)
 {
 	Opt *o;
@@ -475,7 +480,7 @@
 		free(f->old);
 		f->old = 0;
 	}
-	setnames(mkaux, f);
+	setname(mkaux, &mkaux->oldfile, f);
 
 	return f;
 }