⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ls.c

📁 Version 6 Unix 核心源代码 Version 6 Unix 核心源代码
💻 C
字号:
#/* * list file or directory */struct {	int	fdes;	int	nleft;	char	*nextc;	char	buff[512];} inf;struct ibuf {	int	idev;	int	inum;	int	iflags;	char	inl;	char	iuid;	char	igid;	char	isize0;	int	isize;	int	iaddr[8];	char	*iatime[2];	char	*imtime[2];};struct lbuf {	char	lname[15];	int	lnum;	int	lflags;	char	lnl;	char	luid;	char	lgid;	char	lsize0;	int	lsize;	char	*lmtime[2];};struct lbufx {	char	*namep;};int	aflg, dflg, lflg, sflg, tflg, uflg, iflg, fflg, gflg;int	fout;int	rflg	1;char	*year;int	flags;int	uidfil	-1;int	lastuid	-1;char	tbuf[16];int	tblocks;int	statreq;struct	lbuf	*lastp	&end;struct	lbuf	*rlastp	&end;char	*dotp	".";#define	IFMT	060000#define	DIR	0100000#define	CHR	020000#define	BLK	040000#define	ISARG	01000#define	LARGE	010000#define	STXT	010000#define	SUID	04000#define	SGID	02000#define	ROWN	0400#define	WOWN	0200#define	XOWN	0100#define	RGRP	040#define	WGRP	020#define	XGRP	010#define	ROTH	04#define	WOTH	02#define	XOTH	01#define	RSTXT	01000main(argc, argv)char **argv;{	int i, j;	extern struct lbuf end;	register struct lbuf *ep, *ep1;	register struct lbuf *slastp;	struct lbuf lb;	int t;	int compar();	fout = dup(1);	time(lb.lmtime);	year = lb.lmtime[0] - 245; /* 6 months ago */	if (--argc > 0 && *argv[1] == '-') {		argv++;		while (*++*argv) switch (**argv) {		case 'a':			aflg++;			continue;		case 's':			sflg++;			statreq++;			continue;		case 'd':			dflg++;			continue;		case 'g':			gflg++;			continue;		case 'l':			lflg++;			statreq++;			continue;		case 'r':			rflg = -1;			continue;		case 't':			tflg++;			statreq++;			continue;		case 'u':			uflg++;			continue;		case 'i':			iflg++;			continue;		case 'f':			fflg++;			continue;		default:			continue;		}		argc--;	}	if (fflg) {		aflg++;		lflg = 0;		sflg = 0;		tflg = 0;		statreq = 0;	}	if(lflg) {		t = "/etc/passwd";		if(gflg)			t = "/etc/group";		uidfil = open(t, 0);	}	if (argc==0) {		argc++;		argv = &dotp - 1;	}	for (i=0; i < argc; i++) {		if ((ep = gstat(*++argv, 1))==0)			continue;		ep->namep = *argv;		ep->lflags =| ISARG;	}	qsort(&end, lastp - &end, sizeof *lastp, compar);	slastp = lastp;	for (ep = &end; ep<slastp; ep++) {		if (ep->lflags&DIR && dflg==0 || fflg) {			if (argc>1)				printf("\n%s:\n", ep->namep);			lastp = slastp;			readdir(ep->namep);			if (fflg==0)				qsort(slastp,lastp - slastp,sizeof *lastp,compar);			if (statreq)				printf("total %d\n", tblocks);			for (ep1=slastp; ep1<lastp; ep1++)				pentry(ep1);		} else 			pentry(ep);	}	flush();}pentry(ap)struct lbuf *ap;{	struct { char dminor, dmajor;};	register t;	register struct lbuf *p;	register char *cp;	p = ap;	if (p->lnum == -1)		return;	if (iflg)		printf("%5d ", p->lnum);	if (lflg) {		pmode(p->lflags);		printf("%2d ", p->lnl);		t = p->luid;		if(gflg)			t = p->lgid;		t =& 0377;		if (getname(t, tbuf)==0)			printf("%-6.6s", tbuf);		else			printf("%-6d", t);		if (p->lflags & (BLK|CHR))			printf("%3d,%3d", p->lsize.dmajor&0377,			    p->lsize.dminor&0377);		else			printf("%7s", locv(p->lsize0, p->lsize));		cp = ctime(p->lmtime);		if(p->lmtime[0] < year)			printf(" %-7.7s %-4.4s ", cp+4, cp+20); else			printf(" %-12.12s ", cp+4);	} else if (sflg)		printf("%4d ", nblock(p->lsize0, p->lsize));	if (p->lflags&ISARG)		printf("%s\n", p->namep);	else		printf("%.14s\n", p->lname);}getname(uid, buf)int uid;char buf[];{	int j, c, n, i;	if (uid==lastuid)		return(0);	inf.fdes = uidfil;	seek(inf.fdes, 0, 0);	inf.nleft = 0;	lastuid = -1;	do {		i = 0;		j = 0;		n = 0;		while((c=getc(&inf)) != '\n') {			if (c<0)				return(-1);			if (c==':') {				j++;				c = '0';			}			if (j==0)				buf[i++] = c;			if (j==2)				n = n*10 + c - '0';		}	} while (n != uid);	buf[i++] = '\0';	lastuid = uid;	return(0);}nblock(size0, size)char *size0, *size;{	register int n;	n = ldiv(size0, size, 512);	if (size&0777)		n++;	if (n>8)		n =+ (n+255)/256;	return(n);}int	m0[] { 3, DIR, 'd', BLK, 'b', CHR, 'c', '-'};int	m1[] { 1, ROWN, 'r', '-' };int	m2[] { 1, WOWN, 'w', '-' };int	m3[] { 2, SUID, 's', XOWN, 'x', '-' };int	m4[] { 1, RGRP, 'r', '-' };int	m5[] { 1, WGRP, 'w', '-' };int	m6[] { 2, SGID, 's', XGRP, 'x', '-' };int	m7[] { 1, ROTH, 'r', '-' };int	m8[] { 1, WOTH, 'w', '-' };int	m9[] { 1, XOTH, 'x', '-' };int	m10[] { 1, STXT, 't', ' ' };int	*m[] { m0, m1, m2, m3, m4, m5, m6, m7, m8, m9, m10};pmode(aflag){	register int **mp;	flags = aflag;	for (mp = &m[0]; mp < &m[11];)		select(*mp++);}select(pairp)int *pairp;{	register int n, *ap;	ap = pairp;	n = *ap++;	while (--n>=0 && (flags&*ap++)==0)		ap++;	putchar(*ap);}makename(dir, file)char *dir, *file;{	static char dfile[100];	register char *dp, *fp;	register int i;	dp = dfile;	fp = dir;	while (*fp)		*dp++ = *fp++;	*dp++ = '/';	fp = file;	for (i=0; i<14; i++)		*dp++ = *fp++;	*dp = 0;	return(dfile);}readdir(dir)char *dir;{	static struct {		int	dinode;		char	dname[14];	} dentry;	register char *p;	register int j;	register struct lbuf *ep;	if (fopen(dir, &inf) < 0) {		printf("%s unreadable\n", dir);		return;	}	tblocks = 0;	for(;;) {		p = &dentry;		for (j=0; j<16; j++)			*p++ = getc(&inf);		if (dentry.dinode==0		 || aflg==0 && dentry.dname[0]=='.')			continue;		if (dentry.dinode == -1)			break;		ep = gstat(makename(dir, dentry.dname), 0);		if (ep->lnum != -1)			ep->lnum = dentry.dinode;		for (j=0; j<14; j++)			ep->lname[j] = dentry.dname[j];	}	close(inf.fdes);}gstat(file, argfl)char *file;{	struct ibuf statb;	register struct lbuf *rep;	if (lastp+1 >= rlastp) {		sbrk(512);		rlastp.idev =+ 512;	}	rep = lastp;	lastp++;	rep->lflags = 0;	rep->lnum = 0;	if (argfl || statreq) {		if (stat(file, &statb)<0) {			printf("%s not found\n", file);			statb.inum = -1;			statb.isize0 = 0;			statb.isize = 0;			statb.iflags = 0;			if (argfl) {				lastp--;				return(0);			}		}		rep->lnum = statb.inum;		statb.iflags =& ~DIR;		if ((statb.iflags&IFMT) == 060000) {			statb.iflags =& ~020000;		} else if ((statb.iflags&IFMT)==040000) {			statb.iflags =& ~IFMT;			statb.iflags =| DIR;		}		statb.iflags =& ~ LARGE;		if (statb.iflags & RSTXT)			statb.iflags =| STXT;		statb.iflags =& ~ RSTXT;		rep->lflags = statb.iflags;		rep->luid = statb.iuid;		rep->lgid = statb.igid;		rep->lnl = statb.inl;		rep->lsize0 = statb.isize0;		rep->lsize = statb.isize;		if (rep->lflags & (BLK|CHR) && lflg)			rep->lsize = statb.iaddr[0];		rep->lmtime[0] = statb.imtime[0];		rep->lmtime[1] = statb.imtime[1];		if(uflg) {			rep->lmtime[0] = statb.iatime[0];			rep->lmtime[1] = statb.iatime[1];		}		tblocks =+ nblock(statb.isize0, statb.isize);	}	return(rep);}compar(ap1, ap2)struct lbuf *ap1, *ap2;{	register struct lbuf *p1, *p2;	register int i;	int j;	struct { char *charp;};	p1 = ap1;	p2 = ap2;	if (dflg==0) {		if ((p1->lflags&(DIR|ISARG)) == (DIR|ISARG)) {			if ((p2->lflags&(DIR|ISARG)) != (DIR|ISARG))				return(1);		} else {			if ((p2->lflags&(DIR|ISARG)) == (DIR|ISARG))				return(-1);		}	}	if (tflg) {		i = 0;		if (p2->lmtime[0] > p1->lmtime[0])			i++;		else if (p2->lmtime[0] < p1->lmtime[0])			i--;		else if (p2->lmtime[1] > p1->lmtime[1])			i++;		else if (p2->lmtime[1] < p1->lmtime[1])			i--;		return(i*rflg);	}	if (p1->lflags&ISARG)		p1 = p1->namep;	else		p1 = p1->lname;	if (p2->lflags&ISARG)		p2 = p2->namep;	else		p2 = p2->lname;	for (;;)		if ((j = *p1.charp++ - *p2.charp++) || p1.charp[-1]==0)			return(rflg*j);	return(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -