xref: /csrg-svn/sys/tahoe/stand/ls.c (revision 25868)
1*25868Ssam /*	ls.c	1.1	86/01/12	*/
2*25868Ssam /*	ls.c	6.1	83/07/29	*/
3*25868Ssam 
4*25868Ssam #include "param.h"
5*25868Ssam #include "inode.h"
6*25868Ssam #include "dir.h"
7*25868Ssam #include "fs.h"
8*25868Ssam 
9*25868Ssam #include "saio.h"
10*25868Ssam 
11*25868Ssam char line[100];
12*25868Ssam 
main()13*25868Ssam main()
14*25868Ssam {
15*25868Ssam 	int io;
16*25868Ssam 	register char	*ptr;
17*25868Ssam 	struct inode	*ip;
18*25868Ssam 
19*25868Ssam 	for(;;) {
20*25868Ssam 		line[0] = 0;
21*25868Ssam 		printf("\n\nls: ");
22*25868Ssam 		gets(line);
23*25868Ssam 		/* scan to end of line */
24*25868Ssam 		for(ptr=line; *ptr; ptr++)
25*25868Ssam 			;
26*25868Ssam 		/* check to see if a file was specified */
27*25868Ssam 		if(ptr == line) {
28*25868Ssam 			printf("usage: dev(unit,0)/directory\n");
29*25868Ssam 			continue;
30*25868Ssam 		}
31*25868Ssam 		/* do one correction first so the raw dev is not opened */
32*25868Ssam 		if(*(--ptr) == ')') {
33*25868Ssam 			*(++ptr) = '/';
34*25868Ssam 			*(++ptr) = '.';
35*25868Ssam 			*(++ptr) = (char)0;
36*25868Ssam 		}
37*25868Ssam 		if(*ptr == '/') {
38*25868Ssam 			*(++ptr) = '.';
39*25868Ssam 			*(++ptr) = (char)0;
40*25868Ssam 		}
41*25868Ssam 		if((io = open(line, 0)) >= 0)
42*25868Ssam 			break;
43*25868Ssam 	}
44*25868Ssam 	if((io >= NFILES+3) || (io < 3))
45*25868Ssam 		_stop("open returned corrupt file index!");
46*25868Ssam 	ip = &iob[io-3].i_ino;
47*25868Ssam 	if ((ip->i_mode & IFMT) != IFDIR) {
48*25868Ssam 		printf("%s is not a directory!\n", line);
49*25868Ssam 		_stop("");
50*25868Ssam 	}
51*25868Ssam 	if (ip->i_size == 0) {
52*25868Ssam 		printf("%s is a zero length directory!\n", line);
53*25868Ssam 		_stop("");
54*25868Ssam 	}
55*25868Ssam 
56*25868Ssam 	ls(io);
57*25868Ssam }
58*25868Ssam 
ls(io)59*25868Ssam ls(io)
60*25868Ssam register io;
61*25868Ssam {
62*25868Ssam 
63*25868Ssam 	register int	i, size;
64*25868Ssam 	register char	*dp;
65*25868Ssam 	static char	dirbuf[DIRBLKSIZ];
66*25868Ssam 
67*25868Ssam 	printf ("\nInode -> Name\n");
68*25868Ssam 	while ((size = read(io, dirbuf, DIRBLKSIZ)) == DIRBLKSIZ) {
69*25868Ssam 		for(dp = dirbuf; (dp < (dirbuf + size)) &&
70*25868Ssam 		    (dp + ((struct direct *)dp)->d_reclen) < (dirbuf + size);
71*25868Ssam 		    dp += ((struct direct *)dp)->d_reclen) {
72*25868Ssam 			if(((struct direct *)dp)->d_ino == 0)
73*25868Ssam 				continue;
74*25868Ssam 			if(((struct direct *)dp)->d_reclen >
75*25868Ssam 			    DIRSIZ(((struct direct *)dp)))
76*25868Ssam 				continue;
77*25868Ssam 			if(((struct direct *)dp)->d_namlen > MAXNAMLEN+1)
78*25868Ssam 				_stop("Corrupt file name length!  Run fsck soon!\n");
79*25868Ssam 			printf("%s -> %d\n", ((struct direct *)dp)->d_name,
80*25868Ssam 			    ((struct direct *)dp)->d_ino);
81*25868Ssam 		}
82*25868Ssam 	}
83*25868Ssam }
84