Commit Diff


commit - 08e793723cad1c7aed2e8cb16c8592aba5ad05e9
commit + c9ed52730b352448c7c644f6942d310dd3509bf6
blob - f62c45b7668abf0f7fd29b672dd9f5ac71e2f368 (mode 644)
blob + /dev/null
--- src/cmd/du.C
+++ /dev/null
@@ -1,194 +0,0 @@
-#include <u.h>
-#include <libc.h>
-
-extern	vlong	du(char*, Dir*);
-extern	vlong	k(vlong);
-extern	void	err(char*);
-extern	int	warn(char*);
-extern	int	seen(Dir*);
-
-int	aflag;
-int	fflag;
-int	nflag;
-int	sflag;
-int	tflag;
-int	uflag;
-int	qflag;
-char	*fmt = "%llud\t%s\n";
-vlong	blocksize = 1024LL;
-
-void
-main(int argc, char *argv[])
-{
-	int i;
-	char *s, *ss;
-
-	ARGBEGIN {
-	case 'a':	/* all files */
-		aflag = 1;
-		break;
-	case 's':	/* only top level */
-		sflag = 1;
-		break;
-	case 'f':	/* ignore errors */
-		fflag = 1;
-		break;
-	case 'n':	/* all files, number of bytes */
-		aflag = 1;
-		nflag = 1;
-		break;
-	case 't':	/* return modified/accessed time */
-		tflag = 1;
-		break;
-	case 'u':	/* accessed time */
-		uflag = 1;
-		break;
-	case 'q':	/* qid */
-		fmt = "%.16llux\t%s\n";
-		qflag = 1;
-		break;
-	case 'b':	/* block size */
-		s = ARGF();
-		if(s) {
-			blocksize = strtoul(s, &ss, 0);
-			if(s == ss)
-				blocksize = 1;
-			if(*ss == 'k')
-				blocksize *= 1024;
-		}
-		break;
-	} ARGEND
-	if(argc==0)
-		print(fmt, du(".", dirstat(".")), ".");
-	else
-		for(i=0; i<argc; i++)
-			print(fmt, du(argv[i], dirstat(argv[i])), argv[i]);
-	exits(0);
-}
-
-vlong
-du(char *name, Dir *dir)
-{
-	int fd, i, n;
-	Dir *buf, *d;
-	char file[256];
-	vlong nk, t;
-
-	if(dir == nil)
-		return warn(name);
-
-	fd = open(name, OREAD);
-	if(fd < 0)
-		return warn(name);
-
-	if((dir->qid.type&QTDIR) == 0)
-		nk = k(dir->length);
-	else{
-		nk = 0;
-		while((n=dirread(fd, &buf)) > 0) {
-			d = buf;
-			for(i=0; i<n; i++, d++) {
-				if((d->qid.type&QTDIR) == 0) {
-					t = k(d->length);
-					nk += t;
-					if(aflag) {
-						sprint(file, "%s/%s", name, d->name);
-						if(tflag) {
-							t = d->mtime;
-							if(uflag)
-								t = d->atime;
-						}
-						if(qflag)
-							t = d->qid.path;
-						print(fmt, t, file);
-					}
-					continue;
-				}
-				if(strcmp(d->name, ".") == 0 ||
-				   strcmp(d->name, "..") == 0 ||
-				   seen(d))
-					continue;
-				sprint(file, "%s/%s", name, d->name);
-				t = du(file, d);
-				nk += t;
-				if(tflag) {
-					t = d->mtime;
-					if(uflag)
-						t = d->atime;
-				}
-				if(qflag)
-					t = d->qid.path;
-				if(!sflag)
-					print(fmt, t, file);
-			}
-			free(buf);
-		}
-		if(n < 0)
-			warn(name);
-	}
-	close(fd);
-	if(tflag) {
-		if(uflag)
-			return dir->atime;
-		return dir->mtime;
-	}
-	if(qflag)
-		return dir->qid.path;
-	return nk;
-}
-
-#define	NCACHE	128	/* must be power of two */
-typedef	struct	Cache	Cache;
-struct	Cache
-{
-	Dir*	cache;
-	int	n;
-	int	max;
-} cache[NCACHE];
-
-int
-seen(Dir *dir)
-{
-	Dir *dp;
-	int i;
-	Cache *c;
-
-	c = &cache[dir->qid.path&(NCACHE-1)];
-	dp = c->cache;
-	for(i=0; i<c->n; i++, dp++)
-		if(dir->qid.path == dp->qid.path &&
-		   dir->type == dp->type &&
-		   dir->dev == dp->dev)
-			return 1;
-	if(c->n == c->max){
-		c->cache = realloc(c->cache, (c->max+=20)*sizeof(Dir));
-		if(c->cache == 0)
-			err("malloc failure");
-	}
-	c->cache[c->n++] = *dir;
-	return 0;
-}
-
-void
-err(char *s)
-{
-	fprint(2, "du: %s: %r\n", s);
-	exits(s);
-}
-
-int
-warn(char *s)
-{
-	if(fflag == 0)
-		fprint(2, "du: %s: %r\n", s);
-	return 0;
-}
-
-vlong
-k(vlong n)
-{
-	if(nflag)
-		return n;
-	n = (n+blocksize-1)/blocksize;
-	return n*blocksize/1024LL;
-}
blob - /dev/null
blob + f62c45b7668abf0f7fd29b672dd9f5ac71e2f368 (mode 644)
--- /dev/null
+++ src/cmd/du.c
@@ -0,0 +1,194 @@
+#include <u.h>
+#include <libc.h>
+
+extern	vlong	du(char*, Dir*);
+extern	vlong	k(vlong);
+extern	void	err(char*);
+extern	int	warn(char*);
+extern	int	seen(Dir*);
+
+int	aflag;
+int	fflag;
+int	nflag;
+int	sflag;
+int	tflag;
+int	uflag;
+int	qflag;
+char	*fmt = "%llud\t%s\n";
+vlong	blocksize = 1024LL;
+
+void
+main(int argc, char *argv[])
+{
+	int i;
+	char *s, *ss;
+
+	ARGBEGIN {
+	case 'a':	/* all files */
+		aflag = 1;
+		break;
+	case 's':	/* only top level */
+		sflag = 1;
+		break;
+	case 'f':	/* ignore errors */
+		fflag = 1;
+		break;
+	case 'n':	/* all files, number of bytes */
+		aflag = 1;
+		nflag = 1;
+		break;
+	case 't':	/* return modified/accessed time */
+		tflag = 1;
+		break;
+	case 'u':	/* accessed time */
+		uflag = 1;
+		break;
+	case 'q':	/* qid */
+		fmt = "%.16llux\t%s\n";
+		qflag = 1;
+		break;
+	case 'b':	/* block size */
+		s = ARGF();
+		if(s) {
+			blocksize = strtoul(s, &ss, 0);
+			if(s == ss)
+				blocksize = 1;
+			if(*ss == 'k')
+				blocksize *= 1024;
+		}
+		break;
+	} ARGEND
+	if(argc==0)
+		print(fmt, du(".", dirstat(".")), ".");
+	else
+		for(i=0; i<argc; i++)
+			print(fmt, du(argv[i], dirstat(argv[i])), argv[i]);
+	exits(0);
+}
+
+vlong
+du(char *name, Dir *dir)
+{
+	int fd, i, n;
+	Dir *buf, *d;
+	char file[256];
+	vlong nk, t;
+
+	if(dir == nil)
+		return warn(name);
+
+	fd = open(name, OREAD);
+	if(fd < 0)
+		return warn(name);
+
+	if((dir->qid.type&QTDIR) == 0)
+		nk = k(dir->length);
+	else{
+		nk = 0;
+		while((n=dirread(fd, &buf)) > 0) {
+			d = buf;
+			for(i=0; i<n; i++, d++) {
+				if((d->qid.type&QTDIR) == 0) {
+					t = k(d->length);
+					nk += t;
+					if(aflag) {
+						sprint(file, "%s/%s", name, d->name);
+						if(tflag) {
+							t = d->mtime;
+							if(uflag)
+								t = d->atime;
+						}
+						if(qflag)
+							t = d->qid.path;
+						print(fmt, t, file);
+					}
+					continue;
+				}
+				if(strcmp(d->name, ".") == 0 ||
+				   strcmp(d->name, "..") == 0 ||
+				   seen(d))
+					continue;
+				sprint(file, "%s/%s", name, d->name);
+				t = du(file, d);
+				nk += t;
+				if(tflag) {
+					t = d->mtime;
+					if(uflag)
+						t = d->atime;
+				}
+				if(qflag)
+					t = d->qid.path;
+				if(!sflag)
+					print(fmt, t, file);
+			}
+			free(buf);
+		}
+		if(n < 0)
+			warn(name);
+	}
+	close(fd);
+	if(tflag) {
+		if(uflag)
+			return dir->atime;
+		return dir->mtime;
+	}
+	if(qflag)
+		return dir->qid.path;
+	return nk;
+}
+
+#define	NCACHE	128	/* must be power of two */
+typedef	struct	Cache	Cache;
+struct	Cache
+{
+	Dir*	cache;
+	int	n;
+	int	max;
+} cache[NCACHE];
+
+int
+seen(Dir *dir)
+{
+	Dir *dp;
+	int i;
+	Cache *c;
+
+	c = &cache[dir->qid.path&(NCACHE-1)];
+	dp = c->cache;
+	for(i=0; i<c->n; i++, dp++)
+		if(dir->qid.path == dp->qid.path &&
+		   dir->type == dp->type &&
+		   dir->dev == dp->dev)
+			return 1;
+	if(c->n == c->max){
+		c->cache = realloc(c->cache, (c->max+=20)*sizeof(Dir));
+		if(c->cache == 0)
+			err("malloc failure");
+	}
+	c->cache[c->n++] = *dir;
+	return 0;
+}
+
+void
+err(char *s)
+{
+	fprint(2, "du: %s: %r\n", s);
+	exits(s);
+}
+
+int
+warn(char *s)
+{
+	if(fflag == 0)
+		fprint(2, "du: %s: %r\n", s);
+	return 0;
+}
+
+vlong
+k(vlong n)
+{
+	if(nflag)
+		return n;
+	n = (n+blocksize-1)/blocksize;
+	return n*blocksize/1024LL;
+}
blob - 60615059bf495daa3f88cc58d7692ca7b9033c3b (mode 644)
blob + /dev/null
--- src/cmd/ls.C
+++ /dev/null
@@ -1,308 +0,0 @@
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-
-#define dirbuf p9dirbuf	/* avoid conflict on sun */
-
-typedef struct NDir NDir;
-struct NDir
-{
-	Dir *d;
-	char	*prefix;
-};
-
-int	errs = 0;
-int	dflag;
-int	lflag;
-int	mflag;
-int	nflag;
-int	pflag;
-int	qflag;
-int	Qflag;
-int	rflag;
-int	sflag;
-int	tflag;
-int	uflag;
-int	Fflag;
-int	ndirbuf;
-int	ndir;
-NDir*	dirbuf;
-int	ls(char*, int);
-int	compar(NDir*, NDir*);
-char*	asciitime(long);
-char*	darwx(long);
-void	rwx(long, char*);
-void	growto(long);
-void	dowidths(Dir*);
-void	format(Dir*, char*);
-void	output(void);
-ulong	clk;
-int	swidth;			/* max width of -s size */
-int	qwidth;			/* max width of -q version */
-int	vwidth;			/* max width of dev */
-int	uwidth;			/* max width of userid */
-int	mwidth;			/* max width of muid */
-int	glwidth;		/* max width of groupid and length */
-Biobuf	bin;
-
-void
-main(int argc, char *argv[])
-{
-	int i;
-
-	Binit(&bin, 1, OWRITE);
-	ARGBEGIN{
-	case 'F':	Fflag++; break;
-	case 'd':	dflag++; break;
-	case 'l':	lflag++; break;
-	case 'm':	mflag++; break;
-	case 'n':	nflag++; break;
-	case 'p':	pflag++; break;
-	case 'q':	qflag++; break;
-	case 'Q':	Qflag++; break;
-	case 'r':	rflag++; break;
-	case 's':	sflag++; break;
-	case 't':	tflag++; break;
-	case 'u':	uflag++; break;
-	default:	fprint(2, "usage: ls [-dlmnpqrstuFQ] [file ...]\n");
-			exits("usage");
-	}ARGEND
-
-	doquote = needsrcquote;
-	quotefmtinstall();
-	fmtinstall('M', dirmodefmt);
-
-	if(lflag)
-		clk = time(0);
-	if(argc == 0)
-		errs = ls(".", 0);
-	else for(i=0; i<argc; i++)
-		errs |= ls(argv[i], 1);
-	output();
-	exits(errs? "errors" : 0);
-}
-
-int
-ls(char *s, int multi)
-{
-	int fd;
-	long i, n;
-	char *p;
-	Dir *db;
-
-	for(;;) {
-		p = utfrrune(s, '/');
-		if(p == 0 || p[1] != 0 || p == s)
-			break;
-		*p = 0;
-	}
-	db = dirstat(s);
-	if(db == nil){
-    error:
-		fprint(2, "ls: %s: %r\n", s);
-		return 1;
-	}
-	if(db->qid.type&QTDIR && dflag==0){
-		free(db);
-		db = nil;
-		output();
-		fd = open(s, OREAD);
-		if(fd == -1)
-			goto error;
-		n = dirreadall(fd, &db);
-		if(n < 0)
-			goto error;
-		growto(ndir+n);
-		for(i=0; i<n; i++){
-			dirbuf[ndir+i].d = db+i;
-			dirbuf[ndir+i].prefix = multi? s : 0;
-		}
-		ndir += n;
-		close(fd);
-		output();
-	}else{
-		growto(ndir+1);
-		dirbuf[ndir].d = db;
-		dirbuf[ndir].prefix = 0;
-		p = utfrrune(s, '/');
-		if(p){
-			dirbuf[ndir].prefix = s;
-			*p = 0;
-			/* restore original name; don't use result of stat */
-			dirbuf[ndir].d->name = strdup(p+1);
-		}
-		ndir++;
-	}
-	return 0;
-}
-
-void
-output(void)
-{
-	int i;
-	char buf[4096];
-	char *s;
-
-	if(!nflag)
-		qsort(dirbuf, ndir, sizeof dirbuf[0], (int (*)(const void*, const void*))compar);
-	for(i=0; i<ndir; i++)
-		dowidths(dirbuf[i].d);
-	for(i=0; i<ndir; i++) {
-		if(!pflag && (s = dirbuf[i].prefix)) {
-			if(strcmp(s, "/") ==0)	/* / is a special case */
-				s = "";
-			sprint(buf, "%s/%s", s, dirbuf[i].d->name);
-			format(dirbuf[i].d, buf);
-		} else
-			format(dirbuf[i].d, dirbuf[i].d->name);
-	}
-	ndir = 0;
-	Bflush(&bin);
-}
-
-void
-dowidths(Dir *db)
-{
-	char buf[256];
-	int n;
-
-	if(sflag) {
-		n = sprint(buf, "%llud", (db->length+1023)/1024);
-		if(n > swidth)
-			swidth = n;
-	}
-	if(qflag) {
-		n = sprint(buf, "%lud", db->qid.vers);
-		if(n > qwidth)
-			qwidth = n;
-	}
-	if(mflag) {
-		n = snprint(buf, sizeof buf, "[%s]", db->muid);
-		if(n > mwidth)
-			mwidth = n;
-	}
-	if(lflag) {
-		n = sprint(buf, "%ud", db->dev);
-		if(n > vwidth)
-			vwidth = n;
-		n = strlen(db->uid);
-		if(n > uwidth)
-			uwidth = n;
-		n = sprint(buf, "%llud", db->length);
-		n += strlen(db->gid);
-		if(n > glwidth)
-			glwidth = n;
-	}
-}
-
-char*
-fileflag(Dir *db)
-{
-	if(Fflag == 0)
-		return "";
-	if(QTDIR & db->qid.type)
-		return "/";
-	if(0111 & db->mode)
-		return "*";
-	return "";
-}
-
-void
-format(Dir *db, char *name)
-{
-	int i;
-
-	if(sflag)
-		Bprint(&bin, "%*llud ",
-			swidth, (db->length+1023)/1024);
-	if(mflag){
-		Bprint(&bin, "[%s] ", db->muid);
-		for(i=2+strlen(db->muid); i<mwidth; i++)
-			Bprint(&bin, " ");
-	}
-	if(qflag)
-		Bprint(&bin, "(%.16llux %*lud %.2ux) ",
-			db->qid.path,
-			qwidth, db->qid.vers,
-			db->qid.type);
-	if(lflag)
-		Bprint(&bin,
-			"%M %C %*ud %*s %s %*llud %s ",
-			db->mode, db->type,
-			vwidth, db->dev,
-			-uwidth, db->uid,
-			db->gid,
-			(int)(glwidth-strlen(db->gid)), db->length,
-			asciitime(uflag? db->atime : db->mtime));
-	Bprint(&bin,
-		Qflag? "%s%s\n" : "%q%s\n",
-		name, fileflag(db));
-}
-
-void
-growto(long n)
-{
-	if(n <= ndirbuf)
-		return;
-	ndirbuf = n;
-	dirbuf=(NDir *)realloc(dirbuf, ndirbuf*sizeof(NDir));
-	if(dirbuf == 0){
-		fprint(2, "ls: malloc fail\n");
-		exits("malloc fail");
-	}		
-}
-
-int
-compar(NDir *a, NDir *b)
-{
-	long i;
-	Dir *ad, *bd;
-
-	ad = a->d;
-	bd = b->d;
-
-	if(tflag){
-		if(uflag)
-			i = bd->atime-ad->atime;
-		else
-			i = bd->mtime-ad->mtime;
-	}else{
-		if(a->prefix && b->prefix){
-			i = strcmp(a->prefix, b->prefix);
-			if(i == 0)
-				i = strcmp(ad->name, bd->name);
-		}else if(a->prefix){
-			i = strcmp(a->prefix, bd->name);
-			if(i == 0)
-				i = 1;	/* a is longer than b */
-		}else if(b->prefix){
-			i = strcmp(ad->name, b->prefix);
-			if(i == 0)
-				i = -1;	/* b is longer than a */
-		}else
-			i = strcmp(ad->name, bd->name);
-	}
-	if(i == 0)
-		i = (ad<bd? -1 : 1);
-	if(rflag)
-		i = -i;
-	return i;
-}
-
-char*
-asciitime(long l)
-{
-	static char buf[32];
-	char *t;
-
-	t = ctime(l);
-	/* 6 months in the past or a day in the future */
-	if(l<clk-180L*24*60*60 || clk+24L*60*60<l){
-		memmove(buf, t+4, 7);		/* month and day */
-		memmove(buf+7, t+23, 5);		/* year */
-	}else
-		memmove(buf, t+4, 12);		/* skip day of week */
-	buf[12] = 0;
-	return buf;
-}
-
blob - /dev/null
blob + 60615059bf495daa3f88cc58d7692ca7b9033c3b (mode 644)
--- /dev/null
+++ src/cmd/ls.c
@@ -0,0 +1,308 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+
+#define dirbuf p9dirbuf	/* avoid conflict on sun */
+
+typedef struct NDir NDir;
+struct NDir
+{
+	Dir *d;
+	char	*prefix;
+};
+
+int	errs = 0;
+int	dflag;
+int	lflag;
+int	mflag;
+int	nflag;
+int	pflag;
+int	qflag;
+int	Qflag;
+int	rflag;
+int	sflag;
+int	tflag;
+int	uflag;
+int	Fflag;
+int	ndirbuf;
+int	ndir;
+NDir*	dirbuf;
+int	ls(char*, int);
+int	compar(NDir*, NDir*);
+char*	asciitime(long);
+char*	darwx(long);
+void	rwx(long, char*);
+void	growto(long);
+void	dowidths(Dir*);
+void	format(Dir*, char*);
+void	output(void);
+ulong	clk;
+int	swidth;			/* max width of -s size */
+int	qwidth;			/* max width of -q version */
+int	vwidth;			/* max width of dev */
+int	uwidth;			/* max width of userid */
+int	mwidth;			/* max width of muid */
+int	glwidth;		/* max width of groupid and length */
+Biobuf	bin;
+
+void
+main(int argc, char *argv[])
+{
+	int i;
+
+	Binit(&bin, 1, OWRITE);
+	ARGBEGIN{
+	case 'F':	Fflag++; break;
+	case 'd':	dflag++; break;
+	case 'l':	lflag++; break;
+	case 'm':	mflag++; break;
+	case 'n':	nflag++; break;
+	case 'p':	pflag++; break;
+	case 'q':	qflag++; break;
+	case 'Q':	Qflag++; break;
+	case 'r':	rflag++; break;
+	case 's':	sflag++; break;
+	case 't':	tflag++; break;
+	case 'u':	uflag++; break;
+	default:	fprint(2, "usage: ls [-dlmnpqrstuFQ] [file ...]\n");
+			exits("usage");
+	}ARGEND
+
+	doquote = needsrcquote;
+	quotefmtinstall();
+	fmtinstall('M', dirmodefmt);
+
+	if(lflag)
+		clk = time(0);
+	if(argc == 0)
+		errs = ls(".", 0);
+	else for(i=0; i<argc; i++)
+		errs |= ls(argv[i], 1);
+	output();
+	exits(errs? "errors" : 0);
+}
+
+int
+ls(char *s, int multi)
+{
+	int fd;
+	long i, n;
+	char *p;
+	Dir *db;
+
+	for(;;) {
+		p = utfrrune(s, '/');
+		if(p == 0 || p[1] != 0 || p == s)
+			break;
+		*p = 0;
+	}
+	db = dirstat(s);
+	if(db == nil){
+    error:
+		fprint(2, "ls: %s: %r\n", s);
+		return 1;
+	}
+	if(db->qid.type&QTDIR && dflag==0){
+		free(db);
+		db = nil;
+		output();
+		fd = open(s, OREAD);
+		if(fd == -1)
+			goto error;
+		n = dirreadall(fd, &db);
+		if(n < 0)
+			goto error;
+		growto(ndir+n);
+		for(i=0; i<n; i++){
+			dirbuf[ndir+i].d = db+i;
+			dirbuf[ndir+i].prefix = multi? s : 0;
+		}
+		ndir += n;
+		close(fd);
+		output();
+	}else{
+		growto(ndir+1);
+		dirbuf[ndir].d = db;
+		dirbuf[ndir].prefix = 0;
+		p = utfrrune(s, '/');
+		if(p){
+			dirbuf[ndir].prefix = s;
+			*p = 0;
+			/* restore original name; don't use result of stat */
+			dirbuf[ndir].d->name = strdup(p+1);
+		}
+		ndir++;
+	}
+	return 0;
+}
+
+void
+output(void)
+{
+	int i;
+	char buf[4096];
+	char *s;
+
+	if(!nflag)
+		qsort(dirbuf, ndir, sizeof dirbuf[0], (int (*)(const void*, const void*))compar);
+	for(i=0; i<ndir; i++)
+		dowidths(dirbuf[i].d);
+	for(i=0; i<ndir; i++) {
+		if(!pflag && (s = dirbuf[i].prefix)) {
+			if(strcmp(s, "/") ==0)	/* / is a special case */
+				s = "";
+			sprint(buf, "%s/%s", s, dirbuf[i].d->name);
+			format(dirbuf[i].d, buf);
+		} else
+			format(dirbuf[i].d, dirbuf[i].d->name);
+	}
+	ndir = 0;
+	Bflush(&bin);
+}
+
+void
+dowidths(Dir *db)
+{
+	char buf[256];
+	int n;
+
+	if(sflag) {
+		n = sprint(buf, "%llud", (db->length+1023)/1024);
+		if(n > swidth)
+			swidth = n;
+	}
+	if(qflag) {
+		n = sprint(buf, "%lud", db->qid.vers);
+		if(n > qwidth)
+			qwidth = n;
+	}
+	if(mflag) {
+		n = snprint(buf, sizeof buf, "[%s]", db->muid);
+		if(n > mwidth)
+			mwidth = n;
+	}
+	if(lflag) {
+		n = sprint(buf, "%ud", db->dev);
+		if(n > vwidth)
+			vwidth = n;
+		n = strlen(db->uid);
+		if(n > uwidth)
+			uwidth = n;
+		n = sprint(buf, "%llud", db->length);
+		n += strlen(db->gid);
+		if(n > glwidth)
+			glwidth = n;
+	}
+}
+
+char*
+fileflag(Dir *db)
+{
+	if(Fflag == 0)
+		return "";
+	if(QTDIR & db->qid.type)
+		return "/";
+	if(0111 & db->mode)
+		return "*";
+	return "";
+}
+
+void
+format(Dir *db, char *name)
+{
+	int i;
+
+	if(sflag)
+		Bprint(&bin, "%*llud ",
+			swidth, (db->length+1023)/1024);
+	if(mflag){
+		Bprint(&bin, "[%s] ", db->muid);
+		for(i=2+strlen(db->muid); i<mwidth; i++)
+			Bprint(&bin, " ");
+	}
+	if(qflag)
+		Bprint(&bin, "(%.16llux %*lud %.2ux) ",
+			db->qid.path,
+			qwidth, db->qid.vers,
+			db->qid.type);
+	if(lflag)
+		Bprint(&bin,
+			"%M %C %*ud %*s %s %*llud %s ",
+			db->mode, db->type,
+			vwidth, db->dev,
+			-uwidth, db->uid,
+			db->gid,
+			(int)(glwidth-strlen(db->gid)), db->length,
+			asciitime(uflag? db->atime : db->mtime));
+	Bprint(&bin,
+		Qflag? "%s%s\n" : "%q%s\n",
+		name, fileflag(db));
+}
+
+void
+growto(long n)
+{
+	if(n <= ndirbuf)
+		return;
+	ndirbuf = n;
+	dirbuf=(NDir *)realloc(dirbuf, ndirbuf*sizeof(NDir));
+	if(dirbuf == 0){
+		fprint(2, "ls: malloc fail\n");
+		exits("malloc fail");
+	}		
+}
+
+int
+compar(NDir *a, NDir *b)
+{
+	long i;
+	Dir *ad, *bd;
+
+	ad = a->d;
+	bd = b->d;
+
+	if(tflag){
+		if(uflag)
+			i = bd->atime-ad->atime;
+		else
+			i = bd->mtime-ad->mtime;
+	}else{
+		if(a->prefix && b->prefix){
+			i = strcmp(a->prefix, b->prefix);
+			if(i == 0)
+				i = strcmp(ad->name, bd->name);
+		}else if(a->prefix){
+			i = strcmp(a->prefix, bd->name);
+			if(i == 0)
+				i = 1;	/* a is longer than b */
+		}else if(b->prefix){
+			i = strcmp(ad->name, b->prefix);
+			if(i == 0)
+				i = -1;	/* b is longer than a */
+		}else
+			i = strcmp(ad->name, bd->name);
+	}
+	if(i == 0)
+		i = (ad<bd? -1 : 1);
+	if(rflag)
+		i = -i;
+	return i;
+}
+
+char*
+asciitime(long l)
+{
+	static char buf[32];
+	char *t;
+
+	t = ctime(l);
+	/* 6 months in the past or a day in the future */
+	if(l<clk-180L*24*60*60 || clk+24L*60*60<l){
+		memmove(buf, t+4, 7);		/* month and day */
+		memmove(buf+7, t+23, 5);		/* year */
+	}else
+		memmove(buf, t+4, 12);		/* skip day of week */
+	buf[12] = 0;
+	return buf;
+}
+
blob - 8eabbf62f0c6bc31f74c6f35aee59f79f6ffc058 (mode 644)
blob + /dev/null
--- src/cmd/md5sum.C
+++ /dev/null
@@ -1,61 +0,0 @@
-#include <u.h>
-#include <libc.h>
-#include <bio.h>
-#include <libsec.h>
-
-static int
-digestfmt(Fmt *fmt)
-{
-	char buf[MD5dlen*2+1];
-	uchar *p;
-	int i;
-
-	p = va_arg(fmt->args, uchar*);
-	for(i=0; i<MD5dlen; i++)
-		sprint(buf+2*i, "%.2ux", p[i]);
-	return fmtstrcpy(fmt, buf);
-}
-
-static void
-sum(int fd, char *name)
-{
-	int n;
-	uchar buf[8192], digest[MD5dlen];
-	DigestState *s;
-
-	s = md5(nil, 0, nil, nil);
-	while((n = read(fd, buf, sizeof buf)) > 0)
-		md5(buf, n, nil, s);
-	md5(nil, 0, digest, s);
-	if(name == nil)
-		print("%M\n", digest);
-	else
-		print("%M\t%s\n", digest, name);
-}
-
-void
-main(int argc, char *argv[])
-{
-	int i, fd;
-
-	ARGBEGIN{
-	default:
-		fprint(2, "usage: md5sum [file...]\n");
-		exits("usage");
-	}ARGEND
-
-	fmtinstall('M', digestfmt);
-
-	if(argc == 0)
-		sum(0, nil);
-	else for(i = 0; i < argc; i++){
-		fd = open(argv[i], OREAD);
-		if(fd < 0){
-			fprint(2, "md5sum: can't open %s: %r\n", argv[i]);
-			continue;
-		}
-		sum(fd, argv[i]);
-		close(fd);
-	}
-	exits(nil);
-}
blob - /dev/null
blob + 8eabbf62f0c6bc31f74c6f35aee59f79f6ffc058 (mode 644)
--- /dev/null
+++ src/cmd/md5sum.c
@@ -0,0 +1,61 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include <libsec.h>
+
+static int
+digestfmt(Fmt *fmt)
+{
+	char buf[MD5dlen*2+1];
+	uchar *p;
+	int i;
+
+	p = va_arg(fmt->args, uchar*);
+	for(i=0; i<MD5dlen; i++)
+		sprint(buf+2*i, "%.2ux", p[i]);
+	return fmtstrcpy(fmt, buf);
+}
+
+static void
+sum(int fd, char *name)
+{
+	int n;
+	uchar buf[8192], digest[MD5dlen];
+	DigestState *s;
+
+	s = md5(nil, 0, nil, nil);
+	while((n = read(fd, buf, sizeof buf)) > 0)
+		md5(buf, n, nil, s);
+	md5(nil, 0, digest, s);
+	if(name == nil)
+		print("%M\n", digest);
+	else
+		print("%M\t%s\n", digest, name);
+}
+
+void
+main(int argc, char *argv[])
+{
+	int i, fd;
+
+	ARGBEGIN{
+	default:
+		fprint(2, "usage: md5sum [file...]\n");
+		exits("usage");
+	}ARGEND
+
+	fmtinstall('M', digestfmt);
+
+	if(argc == 0)
+		sum(0, nil);
+	else for(i = 0; i < argc; i++){
+		fd = open(argv[i], OREAD);
+		if(fd < 0){
+			fprint(2, "md5sum: can't open %s: %r\n", argv[i]);
+			continue;
+		}
+		sum(fd, argv[i]);
+		close(fd);
+	}
+	exits(nil);
+}
blob - 1c16565d5be8c3c819bc941c34129b1e29929784 (mode 644)
blob + /dev/null
--- src/cmd/mkdir.C
+++ /dev/null
@@ -1,80 +0,0 @@
-#include <u.h>
-#include <libc.h>
-
-char *e;
-ulong mode = 0777L;
-
-void
-usage(void)
-{
-	fprint(2, "usage: mkdir [-p] [-m mode] dir...\n");
-	exits("usage");
-}
-
-int
-makedir(char *s)
-{
-	int f;
-
-	if(access(s, AEXIST) == 0){
-		fprint(2, "mkdir: %s already exists\n", s);
-		e = "error";
-		return -1;
-	}
-	f = create(s, OREAD, DMDIR | mode);
-	if(f < 0){
-		fprint(2, "mkdir: can't create %s: %r\n", s);
-		e = "error";
-		return -1;
-	}
-	close(f);
-	return 0;
-}
-
-void
-mkdirp(char *s)
-{
-	char *p;
-
-	for(p=strchr(s+1, '/'); p; p=strchr(p+1, '/')){
-		*p = 0;
-		if(access(s, AEXIST) != 0 && makedir(s) < 0)
-			return;
-		*p = '/';
-	}
-	if(access(s, AEXIST) != 0)
-		makedir(s);
-}
-
-
-void
-main(int argc, char *argv[])
-{
-	int i, pflag;
-	char *m;
-
-	pflag = 0;
-	ARGBEGIN{
-	default:
-		usage();
-	case 'm':
-		m = ARGF();
-		if(m == nil)
-			usage();
-		mode = strtoul(m, &m, 8);
-		if(mode > 0777)
-			usage();
-		break;
-	case 'p':
-		pflag = 1;
-		break;
-	}ARGEND
-
-	for(i=0; i<argc; i++){
-		if(pflag)
-			mkdirp(argv[i]);
-		else
-			makedir(argv[i]);
-	}
-	exits(e);
-}
blob - /dev/null
blob + 1c16565d5be8c3c819bc941c34129b1e29929784 (mode 644)
--- /dev/null
+++ src/cmd/mkdir.c
@@ -0,0 +1,80 @@
+#include <u.h>
+#include <libc.h>
+
+char *e;
+ulong mode = 0777L;
+
+void
+usage(void)
+{
+	fprint(2, "usage: mkdir [-p] [-m mode] dir...\n");
+	exits("usage");
+}
+
+int
+makedir(char *s)
+{
+	int f;
+
+	if(access(s, AEXIST) == 0){
+		fprint(2, "mkdir: %s already exists\n", s);
+		e = "error";
+		return -1;
+	}
+	f = create(s, OREAD, DMDIR | mode);
+	if(f < 0){
+		fprint(2, "mkdir: can't create %s: %r\n", s);
+		e = "error";
+		return -1;
+	}
+	close(f);
+	return 0;
+}
+
+void
+mkdirp(char *s)
+{
+	char *p;
+
+	for(p=strchr(s+1, '/'); p; p=strchr(p+1, '/')){
+		*p = 0;
+		if(access(s, AEXIST) != 0 && makedir(s) < 0)
+			return;
+		*p = '/';
+	}
+	if(access(s, AEXIST) != 0)
+		makedir(s);
+}
+
+
+void
+main(int argc, char *argv[])
+{
+	int i, pflag;
+	char *m;
+
+	pflag = 0;
+	ARGBEGIN{
+	default:
+		usage();
+	case 'm':
+		m = ARGF();
+		if(m == nil)
+			usage();
+		mode = strtoul(m, &m, 8);
+		if(mode > 0777)
+			usage();
+		break;
+	case 'p':
+		pflag = 1;
+		break;
+	}ARGEND
+
+	for(i=0; i<argc; i++){
+		if(pflag)
+			mkdirp(argv[i]);
+		else
+			makedir(argv[i]);
+	}
+	exits(e);
+}