xref: /csrg-svn/sys/stand.att/ls.c (revision 63370)
123231Smckusick /*
2*63370Sbostic  * Copyright (c) 1982, 1986, 1988, 1993
3*63370Sbostic  *	The Regents of the University of California.  All rights reserved.
423231Smckusick  *
544516Sbostic  * %sccs.include.redist.c%
634462Sbostic  *
7*63370Sbostic  *	@(#)ls.c	8.1 (Berkeley) 06/11/93
823231Smckusick  */
9320Sbill 
1056509Sbostic #include <sys/param.h>
1156509Sbostic #include <sys/ttychars.h>
12320Sbill 
1356509Sbostic #include <ufs/ufs/dir.h>
1460328Smckusick #include <stand.att/saio.h>
1556509Sbostic 
main()16320Sbill main()
17320Sbill {
1840502Smckusick 	struct dinode *ip;
1934462Sbostic 	int fd;
20320Sbill 
2137222Skarels 	for (;;) {
2237222Skarels 		if ((fd = getfile("ls", 0)) == -1)
2337222Skarels 			exit();
2437222Skarels 		ip = &iob[fd - 3].i_ino;
2540502Smckusick 		if ((ip->di_mode & IFMT) != IFDIR) {
2637222Skarels 			printf("ls: not a directory\n");
2737222Skarels 			continue;
2837222Skarels 		}
2940502Smckusick 		if (ip->di_size == 0) {
3037222Skarels 			printf("ls: zero length directory\n");
3137222Skarels 			continue;
3237222Skarels 		}
3337222Skarels 		ls(fd);
3437222Skarels 	}
35320Sbill }
36320Sbill 
3740502Smckusick #define CTRL(x)	(x&037)
3840502Smckusick 
getfile(prompt,mode)3937222Skarels getfile(prompt, mode)
4037222Skarels 	char *prompt;
4137222Skarels 	int mode;
4237222Skarels {
4337222Skarels 	int fd;
4437222Skarels 	char buf[100];
4537222Skarels 
4637222Skarels 	do {
4737222Skarels 		printf("%s: ", prompt);
4837222Skarels 		gets(buf);
4937222Skarels 		if (buf[0] == CTRL('d') && buf[1] == 0)
5037222Skarels 			return (-1);
5137222Skarels 	} while ((fd = open(buf, mode)) <= 0);
5237222Skarels 	return(fd);
5337222Skarels }
5437222Skarels 
5534462Sbostic typedef struct direct	DP;
5634462Sbostic static
ls(fd)5734462Sbostic ls(fd)
5834462Sbostic 	register int fd;
59320Sbill {
6034462Sbostic 	register int size;
6134462Sbostic 	register char *dp;
6234462Sbostic 	char dirbuf[DIRBLKSIZ];
63320Sbill 
6437222Skarels 	printf("\ninode\tname\n");
6534462Sbostic 	while ((size = read(fd, dirbuf, DIRBLKSIZ)) == DIRBLKSIZ)
6634462Sbostic 		for(dp = dirbuf; (dp < (dirbuf + size)) &&
6734462Sbostic 		    (dp + ((DP *)dp)->d_reclen) < (dirbuf + size);
6834462Sbostic 		    dp += ((DP *)dp)->d_reclen) {
6934462Sbostic 			if (((DP *)dp)->d_ino == 0)
7034462Sbostic 				continue;
7137222Skarels 			if (((DP *)dp)->d_namlen > MAXNAMLEN+1) {
7237222Skarels 				printf("Corrupt file name length!  Run fsck soon!\n");
7337222Skarels 				return;
7437222Skarels 			}
7537222Skarels 			printf("%d\t%s\n", ((DP *)dp)->d_ino,
7637222Skarels 			    ((DP *)dp)->d_name);
77320Sbill 		}
78320Sbill }
79