From 407cf4ac6e59556b65d29b3c0de6ada6fdcc3cc7 Mon Sep 17 00:00:00 2001 From: Ori Bernstein Date: Thu, 16 Jul 2020 15:22:42 -0700 Subject: [PATCH] ape: simplify mkfile (thanks amavect) ape cp, mv, and cc build with ?c, not pcc ape cp and mv just ignore one or two extra flags, instead of providing posix compatibility it's better to fail then do nothing remove cp.c and mv.c move cc.c to /sys/src/ape/9src so it doesn't need its own mkfile rule --- sys/src/ape/{cmd => 9src}/cc.c | 0 sys/src/ape/9src/mkfile | 1 + sys/src/ape/cmd/cp.c | 179 ----------------------- sys/src/ape/cmd/mkfile | 21 --- sys/src/ape/cmd/mv.c | 250 --------------------------------- 5 files changed, 1 insertion(+), 450 deletions(-) rename sys/src/ape/{cmd => 9src}/cc.c (100%) delete mode 100644 sys/src/ape/cmd/cp.c delete mode 100644 sys/src/ape/cmd/mv.c diff --git a/sys/src/ape/cmd/cc.c b/sys/src/ape/9src/cc.c similarity index 100% rename from sys/src/ape/cmd/cc.c rename to sys/src/ape/9src/cc.c diff --git a/sys/src/ape/9src/mkfile b/sys/src/ape/9src/mkfile index 739ce3ed7..bedef515d 100644 --- a/sys/src/ape/9src/mkfile +++ b/sys/src/ape/9src/mkfile @@ -4,6 +4,7 @@ TARG=\ stty\ tar\ + cc\ BIN=/$objtype/bin/ape -#include - -#define DEFB (8*1024) - -int failed; -int gflag; -int uflag; -int xflag; -void copy(char *from, char *to, int todir); -int copy1(int fdf, int fdt, char *from, char *to); - -void -main(int argc, char *argv[]) -{ - Dir *dirb; - int todir, i; - - ARGBEGIN { - case 'g': - gflag++; - break; - case 'u': - uflag++; - gflag++; - break; - case 'x': - xflag++; - break; - case 'p': - break; - default: - goto usage; - } ARGEND - - todir=0; - if(argc < 2) - goto usage; - dirb = dirstat(argv[argc-1]); - if(dirb!=nil && (dirb->mode&DMDIR)) - todir=1; - if(argc>2 && !todir){ - fprint(2, "cp: %s not a directory\n", argv[argc-1]); - exits("bad usage"); - } - for(i=0; iqid.type==a->qid.type) - if(b->qid.path==a->qid.path) - if(b->qid.vers==a->qid.vers) - if(b->dev==a->dev) - if(b->type==a->type){ - fprint(2, "cp: %s and %s are the same file\n", an, bn); - ret = 1; - } - free(b); - return ret; -} - -void -copy(char *from, char *to, int todir) -{ - Dir *dirb, dirt; - char name[256]; - int fdf, fdt, mode; - - if(todir){ - char *s, *elem; - elem=s=from; - while(*s++) - if(s[-1]=='/') - elem=s; - sprint(name, "%s/%s", to, elem); - to=name; - } - - if((dirb=dirstat(from))==nil){ - fprint(2,"cp: can't stat %s: %r\n", from); - failed = 1; - return; - } - mode = dirb->mode; - if(mode&DMDIR){ - fprint(2, "cp: %s is a directory\n", from); - free(dirb); - failed = 1; - return; - } - if(samefile(dirb, from, to)){ - free(dirb); - failed = 1; - return; - } - mode &= 0777; - fdf=open(from, OREAD); - if(fdf<0){ - fprint(2, "cp: can't open %s: %r\n", from); - free(dirb); - failed = 1; - return; - } - fdt=create(to, OWRITE, mode); - if(fdt<0){ - fprint(2, "cp: can't create %s: %r\n", to); - close(fdf); - free(dirb); - failed = 1; - return; - } - if(copy1(fdf, fdt, from, to)==0 && (xflag || gflag || uflag)){ - nulldir(&dirt); - if(xflag){ - dirt.mtime = dirb->mtime; - dirt.mode = dirb->mode; - } - if(uflag) - dirt.uid = dirb->uid; - if(gflag) - dirt.gid = dirb->gid; - if(dirfwstat(fdt, &dirt) < 0) - fprint(2, "cp: warning: can't wstat %s: %r\n", to); - } - free(dirb); - close(fdf); - close(fdt); -} - -int -copy1(int fdf, int fdt, char *from, char *to) -{ - char *buf; - long n, n1, rcount; - int rv; - char err[ERRMAX]; - - buf = malloc(DEFB); - /* clear any residual error */ - err[0] = '\0'; - errstr(err, ERRMAX); - rv = 0; - for(rcount=0;; rcount++) { - n = read(fdf, buf, DEFB); - if(n <= 0) - break; - n1 = write(fdt, buf, n); - if(n1 != n) { - fprint(2, "cp: error writing %s: %r\n", to); - failed = 1; - rv = -1; - break; - } - } - if(n < 0) { - fprint(2, "cp: error reading %s: %r\n", from); - failed = 1; - rv = -1; - } - free(buf); - return rv; -} diff --git a/sys/src/ape/cmd/mkfile b/sys/src/ape/cmd/mkfile index c2a059751..993f60ee1 100644 --- a/sys/src/ape/cmd/mkfile +++ b/sys/src/ape/cmd/mkfile @@ -2,11 +2,8 @@ APE=/sys/src/ape <$APE/config TARG=basename\ - cc\ - cp\ dirname\ kill\ - mv\ uname DIRS=\ @@ -46,24 +43,6 @@ $DIRS:V: mk all } -cc.$O: cc.c - mk -f /sys/src/cmd/mkfile cc.$O - -$O.cc: cc.$O - mk -f /sys/src/cmd/mkfile $O.cc - -cp.$O: cp.c - mk -f /sys/src/cmd/mkfile cp.$O - -$O.cp: cp.$O - mk -f /sys/src/cmd/mkfile $O.cp - -mv.$O: mv.c - mk -f /sys/src/cmd/mkfile mv.$O - -$O.mv: mv.$O - mk -f /sys/src/cmd/mkfile $O.mv - $BIN/%: %.rc cp -x $stem.rc $BIN/$stem diff --git a/sys/src/ape/cmd/mv.c b/sys/src/ape/cmd/mv.c deleted file mode 100644 index 4764e34f5..000000000 --- a/sys/src/ape/cmd/mv.c +++ /dev/null @@ -1,250 +0,0 @@ -#include -#include - -int copy1(int fdf, int fdt, char *from, char *to); -void hardremove(char *); -int mv(char *from, char *todir, char *toelem); -int mv1(char *from, Dir *dirb, char *todir, char *toelem); -int samefile(char *, char *); -void split(char *, char **, char **); - -void -main(int argc, char *argv[]) -{ - int i, failed; - Dir *dirto, *dirfrom; - char *todir, *toelem; - - if(argc<3){ - fprint(2, "usage: mv fromfile tofile\n"); - fprint(2, " mv fromfile ... todir\n"); - exits("bad usage"); - } - - /* Skip -f */ - if(argv[1][0] == '-' && argv[1][1] == 'f' && argv[1][2] == 0) { - for(i=2; imode&DMDIR)){ - dirfrom = nil; - if(argc == 3 - && (dirfrom = dirstat(argv[1])) != nil - && (dirfrom->mode & DMDIR)) - split(argv[argc-1], &todir, &toelem); /* mv dir1 dir2 */ - else{ /* mv file... dir */ - todir = argv[argc-1]; - toelem = nil; /* toelem will be fromelem */ - } - free(dirfrom); - }else - split(argv[argc-1], &todir, &toelem); /* mv file1 file2 */ - free(dirto); - if(argc>3 && toelem != nil){ - fprint(2, "mv: %s not a directory\n", argv[argc-1]); - exits("bad usage"); - } - - failed = 0; - for(i=1; i < argc-1; i++) - if(mv(argv[i], todir, toelem) < 0) - failed++; - if(failed) - exits("failure"); - exits(0); -} - -int -mv(char *from, char *todir, char *toelem) -{ - int stat; - Dir *dirb; - - dirb = dirstat(from); - if(dirb == nil){ - fprint(2, "mv: can't stat %s: %r\n", from); - return -1; - } - stat = mv1(from, dirb, todir, toelem); - free(dirb); - return stat; -} - -int -mv1(char *from, Dir *dirb, char *todir, char *toelem) -{ - int fdf, fdt, i, j, stat; - char toname[4096], fromname[4096]; - char *fromdir, *fromelem; - Dir *dirt, null; - - i = strlen(from); - if(i >= sizeof(fromname)){ - fprint(2, "mv: path too big (max %d): %s\n", - sizeof(fromname), from); - return -1; - } - memmove(fromname, from, i+1); - split(from, &fromdir, &fromelem); - if(toelem == 0) - toelem = fromelem; - i = strlen(toelem); - if(i==0){ - fprint(2, "mv: null last name element moving %s\n", fromname); - return -1; - } - j = strlen(todir); - if(i + j + 2 > sizeof toname){ - fprint(2, "mv: path too big (max %d): %s/%s\n", - sizeof toname, todir, toelem); - return -1; - } - memmove(toname, todir, j); - toname[j] = '/'; - memmove(toname+j+1, toelem, i); - toname[i+j+1] = 0; - - if(samefile(fromdir, todir)){ - if(samefile(fromname, toname)){ - fprint(2, "mv: %s and %s are the same\n", - fromname, toname); - return -1; - } - - /* remove target if present */ - dirt = dirstat(toname); - if(dirt != nil) { - hardremove(toname); - free(dirt); - } - - /* try wstat */ - nulldir(&null); - null.name = toelem; - if(dirwstat(fromname, &null) >= 0) - return 0; - if(dirb->mode & DMDIR){ - fprint(2, "mv: can't rename directory %s: %r\n", - fromname); - return -1; - } - } - /* - * Renaming won't work --- must copy - */ - if(dirb->mode & DMDIR){ - fprint(2, "mv: %s is a directory, not copied to %s\n", - fromname, toname); - return -1; - } - fdf = open(fromname, OREAD); - if(fdf < 0){ - fprint(2, "mv: can't open %s: %r\n", fromname); - return -1; - } - - dirt = dirstat(toname); - if(dirt != nil && (dirt->mode & DMAPPEND)) - hardremove(toname); /* because create() won't truncate file */ - free(dirt); - - fdt = create(toname, OWRITE, dirb->mode); - if(fdt < 0){ - fprint(2, "mv: can't create %s: %r\n", toname); - close(fdf); - return -1; - } - stat = copy1(fdf, fdt, fromname, toname); - close(fdf); - - if(stat >= 0){ - nulldir(&null); - null.mtime = dirb->mtime; - null.mode = dirb->mode; - dirfwstat(fdt, &null); /* ignore errors; e.g. user none always fails */ - if(remove(fromname) < 0){ - fprint(2, "mv: can't remove %s: %r\n", fromname); - stat = -1; - } - } - close(fdt); - return stat; -} - -int -copy1(int fdf, int fdt, char *from, char *to) -{ - char buf[8192]; - long n, n1; - - while ((n = read(fdf, buf, sizeof buf)) > 0) { - n1 = write(fdt, buf, n); - if(n1 != n){ - fprint(2, "mv: error writing %s: %r\n", to); - return -1; - } - } - if(n < 0){ - fprint(2, "mv: error reading %s: %r\n", from); - return -1; - } - return 0; -} - -void -split(char *name, char **pdir, char **pelem) -{ - char *s; - - s = utfrrune(name, '/'); - if(s){ - *s = 0; - *pelem = s+1; - *pdir = name; - }else if(strcmp(name, "..") == 0){ - *pdir = ".."; - *pelem = "."; - }else{ - *pdir = "."; - *pelem = name; - } -} - -int -samefile(char *a, char *b) -{ - Dir *da, *db; - int ret; - - if(strcmp(a, b) == 0) - return 1; - da = dirstat(a); - db = dirstat(b); - ret = (da != nil && db != nil && - da->qid.type==db->qid.type && - da->qid.path==db->qid.path && - da->qid.vers==db->qid.vers && - da->dev==db->dev && - da->type==db->type); - free(da); - free(db); - return ret; -} - -void -hardremove(char *a) -{ - if(remove(a) == -1){ - fprint(2, "mv: can't remove %s: %r\n", a); - exits("mv"); - } - while(remove(a) != -1) - ; -}