|
|
1.1 root 1: #include <stdio.h>
2: #include <sys/param.h>
3: #include <sys/stat.h>
4: #include <sys/ino.h>
5: #include <time.h>
6:
7: #define tp(x,y) {if(j&x) putchar(y); else putchar('-');}
8:
9: struct stat sbuf;
10: struct dinode dsbuf;
11:
12: main(argc,argv) char *argv[];
13: {
14: int i,j;
15: int f, iflag=0;
16: unsigned ino;
17: char *tm;
18:
19: for(i=1;i<argc;i++) {
20: if (strcmp(argv[i], "-i")==0) {
21: iflag++;
22: i++;
23: f = open(argv[i], 0);
24: if (f<0) {
25: printf("stat: can't open %s\n", argv[i]);
26: exit(2);
27: }
28: continue;
29: }
30: if (iflag) {
31: ino = atoi(argv[i]);
32: lseek(f, (ino-1)*64L+1024, 0);
33: j = 0;
34: if (read(f, &dsbuf, sizeof(dsbuf)) != sizeof(dsbuf))
35: j = -1;
36: sbuf.st_mode = dsbuf.di_mode;
37: sbuf.st_nlink = dsbuf.di_nlink;
38: sbuf.st_uid = dsbuf.di_uid;
39: sbuf.st_gid = dsbuf.di_gid;
40: sbuf.st_size = dsbuf.di_size;
41: sbuf.st_atime = dsbuf.di_atime;
42: sbuf.st_mtime = dsbuf.di_mtime;
43: sbuf.st_ctime = dsbuf.di_ctime;
44: sbuf.st_rdev = 0;
45: sbuf.st_dev = 0;
46: } else if (strcmp(argv[i], "-")==0)
47: j = fstat(atoi(argv[i]+1));
48: else
49: j = stat(argv[i],&sbuf);
50: if(j==-1) {
51: perror(argv[i]);
52: continue;
53: }
54: j=sbuf.st_mode;
55: switch(j&S_IFMT) {
56: case S_IFREG: putchar('-'); break;
57: case S_IFDIR: putchar('d'); break;
58: case S_IFCHR: putchar('c'); break;
59: case S_IFBLK: putchar('b'); break;
60: default: putchar('?'); break;
61: }
62: tp(S_ISUID,'u');
63: tp(S_ISGID,'g');
64: tp(S_ISVTX,'t');
65: tp(0400,'r');
66: tp(0200,'w');
67: tp(0100,'x');
68: tp(040,'r');
69: tp(020,'w');
70: tp(010,'x');
71: tp(4,'r');
72: tp(2,'w');
73: tp(1,'x');
74: putchar(' ');
75: printf("M%d m%d Mr%d mr%d u%d g%d L%d %ld i%u: %s\n",
76: major(sbuf.st_dev),minor(sbuf.st_dev),
77: major(sbuf.st_rdev),minor(sbuf.st_rdev),
78: sbuf.st_uid,sbuf.st_gid,sbuf.st_nlink,
79: sbuf.st_size,sbuf.st_ino,argv[i]);
80: ptime(&sbuf.st_atime);
81: ptime(&sbuf.st_mtime);
82: ptime(&sbuf.st_ctime);
83: printf("\n\n");
84: }
85: }
86:
87: ptime(t)
88: long *t;
89: {
90: register struct tm *ctp;
91:
92: ctp = localtime(t);
93: printf(" %02d:%02d:%02d %02d/%02d/%02d",
94: ctp->tm_hour, ctp->tm_min, ctp->tm_sec,
95: ctp->tm_year, ctp->tm_mon+1, ctp->tm_mday);
96: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.