V10/cmd/stat.c

Compare this file to the similar file:
Show the results in this format:

#include <stdio.h>
#include <sys/param.h>
#include <sys/stat.h>
#include <sys/ino.h>
#include <time.h>

#define tp(x,y) {if(j&x) putchar(y); else putchar('-');}

struct stat sbuf;
struct	dinode	dsbuf;

main(argc,argv) char *argv[];
{
	int i,j;
	int f, iflag=0;
	unsigned ino;
	char *tm;

	for(i=1;i<argc;i++) {
		if (strcmp(argv[i], "-i")==0) {
			iflag++;
			i++;
			f = open(argv[i], 0);
			if (f<0) {
				printf("stat: can't open %s\n", argv[i]);
				exit(2);
			}
			continue;
		}
		if (iflag) {
			ino = atoi(argv[i]);
			lseek(f, (ino-1)*64L+1024, 0);
			j = 0;
			if (read(f, &dsbuf, sizeof(dsbuf)) != sizeof(dsbuf))
				j = -1;
		sbuf.st_mode = dsbuf.di_mode;
		sbuf.st_nlink = dsbuf.di_nlink;
		sbuf.st_uid = dsbuf.di_uid;
		sbuf.st_gid = dsbuf.di_gid;
		sbuf.st_size = dsbuf.di_size;
		sbuf.st_atime = dsbuf.di_atime;
		sbuf.st_mtime = dsbuf.di_mtime;
		sbuf.st_ctime = dsbuf.di_ctime;
		sbuf.st_rdev = 0;
		sbuf.st_dev = 0;
		} else if (strcmp(argv[i], "-")==0)
			j = fstat(atoi(argv[i]+1));
		else
			j = stat(argv[i],&sbuf);
		if(j==-1) {
			perror(argv[i]);
			continue;
		}
		j=sbuf.st_mode;
		switch(j&S_IFMT) {
		case S_IFREG: putchar('-'); break;
		case S_IFDIR: putchar('d'); break;
		case S_IFCHR: putchar('c'); break;
		case S_IFBLK: putchar('b'); break;
		default: putchar('?'); break;
		}
		tp(S_ISUID,'u');
		tp(S_ISGID,'g');
		tp(S_ISVTX,'t');
		tp(0400,'r');
		tp(0200,'w');
		tp(0100,'x');
		tp(040,'r');
		tp(020,'w');
		tp(010,'x');
		tp(4,'r');
		tp(2,'w');
		tp(1,'x');
		putchar(' ');
		printf("M%d m%d Mr%d mr%d u%d g%d L%d %ld i%u: %s\n",
			major(sbuf.st_dev),minor(sbuf.st_dev),
			major(sbuf.st_rdev),minor(sbuf.st_rdev),
			sbuf.st_uid,sbuf.st_gid,sbuf.st_nlink,
			sbuf.st_size,sbuf.st_ino,argv[i]);
		ptime(&sbuf.st_atime);
		ptime(&sbuf.st_mtime);
		ptime(&sbuf.st_ctime);
		printf("\n\n");
	}
}

ptime(t)
long *t;
{
	register struct tm *ctp;

	ctp = localtime(t);
	printf("  %02d:%02d:%02d %02d/%02d/%02d",
	  ctp->tm_hour, ctp->tm_min, ctp->tm_sec,
	  ctp->tm_year, ctp->tm_mon+1, ctp->tm_mday);
}