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;
}