|
|
1.1 root 1: #include <libc.h>
2: #include "worm.h"
3: #include "sym.h"
4: #include <sys/types.h>
5: #include <sys/stat.h>
6: #include <pwd.h>
7: #include <grp.h>
8:
9: int lflag = 0;
10: int bflag = 0;
11:
12: main(argc, argv)
13: char **argv;
14: {
15: Superblock s;
16: register Inode *i;
17: char *e;
18: char *dev = "/dev/worm0";
19: int c;
20: extern char *optarg;
21: extern int optind;
22: void pr();
23:
24: while((c = getopt(argc, argv, "lbf:")) != -1)
25: switch(c)
26: {
27: case 'f': dev = optarg; break;
28: case 'l': lflag = 1; break;
29: case 'b': bflag = 1; break;
30: case '?': usage();
31: }
32: dev = mapdev(dev);
33: if((s.fd = open(dev, 0)) < 0){
34: perror(dev);
35: exit(1);
36: }
37: if(e = openinode(&s, DO_INODE|SPIN_DOWN)){
38: fprint(2, "%s: %s\n", dev, e);
39: exit(1);
40: }
41: c = 0;
42: if(optind < argc)
43: while(optind < argc){
44: if(i = inodeof(argv[optind]))
45: pr(i);
46: else {
47: Fprint(2, "%s not found\n", argv[optind]);
48: c = 1;
49: }
50: optind++;
51: }
52: else
53: inodetraverse(pr);
54: exit(c);
55: }
56:
57: char *
58: suid(n)
59: {
60: static char buf[24];
61: struct passwd *p;
62: char *s;
63:
64: sprint(buf, "#%d", n);
65: if(s = (char *)symlook(buf, S_UID, (void *)0))
66: strcpy(buf, s);
67: else {
68: s = strdup(buf);
69: if(p = getpwuid(n))
70: strcpy(buf, p->pw_name);
71: (void)symlook(s, S_UID, (void *)strdup(buf));
72: }
73: return(buf);
74: }
75:
76: char *
77: sgid(n)
78: {
79: static char buf[24];
80: struct group *g;
81: char *s;
82:
83: sprint(buf, "#%d", n);
84: if(s = (char *)symlook(buf, S_GID, (void *)0))
85: strcpy(buf, s);
86: else {
87: s = strdup(buf);
88: if(g = getgrgid(n))
89: strcpy(buf, g->gr_name);
90: (void)symlook(s, S_GID, (void *)strdup(buf));
91: }
92: return(buf);
93: }
94:
95: mode(n, sx)
96: {
97: Fputc(1, (n&4)? 'r':'-');
98: Fputc(1, (n&2)? 'w':'-');
99: Fputc(1, (n&1)? sx:'-');
100: }
101:
102: void
103: pr(i)
104: register Inode *i;
105: {
106: char *s;
107:
108: if(lflag){
109: Fputc(1, ((i->mode&S_IFMT) == S_IFDIR)? 'd':'-');
110: mode(i->mode>>6, ((i->mode&S_IFMT) == S_ISUID)? 's':'x');
111: mode(i->mode>>3, ((i->mode&S_IFMT) == S_ISGID)? 's':'x');
112: mode(i->mode, 'x');
113: Fputc(1, ((i->mode&S_IFMT) == S_IFLNK)? 'L':' ');
114: s = ctime(&i->ctime);
115: s += 4;
116: s[12] = 0;
117: Fprint(1, "%2d%8s%7s %6ld %s %s\n", 1, suid(i->uid), sgid(i->gid),
118: i->nbytes, s, i->name.n);
119: return;
120: }
121: if(bflag)
122: Fprint(1, "%s\t%ld\n", i->name.n, i->block);
123: else
124: Fprint(1, "%s\n", i->name.n);
125: }
126:
127: usage()
128: {
129: fprint(2, "Usage: worm ls [-fdevice] [-l] [-b] [files ...]\n");
130: exit(2);
131: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.