xref: /csrg-svn/sys/stand/ls.c (revision 63370)
163275Smckusick /*-
2*63370Sbostic  * Copyright (c) 1993
3*63370Sbostic  *	The Regents of the University of California.  All rights reserved.
463275Smckusick  *
563275Smckusick  * %sccs.include.redist.c%
663275Smckusick  */
763275Smckusick 
863275Smckusick #ifndef lint
9*63370Sbostic static char copyright[] =
10*63370Sbostic "@(#) Copyright (c) 1993\n\
11*63370Sbostic 	The Regents of the University of California.  All rights reserved.\n";
1263275Smckusick #endif /* not lint */
1363275Smckusick 
1463275Smckusick #ifndef lint
15*63370Sbostic static char sccsid[] = "@(#)ls.c	8.1 (Berkeley) 06/11/93";
1663275Smckusick #endif /* not lint */
1763275Smckusick 
1863275Smckusick #include <sys/param.h>
1963275Smckusick #include <ufs/ufs/dir.h>
2063275Smckusick #include <sys/ttychars.h>
2163275Smckusick #include <stand/stand.h>
2263275Smckusick 
main()2363275Smckusick main()
2463275Smckusick {
2563275Smckusick 	struct dinode *ip;
2663275Smckusick 	int fd;
2763275Smckusick 
2863275Smckusick 	for (;;) {
2963275Smckusick 		if ((fd = getfile("ls", 0)) == -1)
3063275Smckusick 			exit();
3163275Smckusick 		ip = &iob[fd - 3].i_ino;
3263275Smckusick 		if ((ip->di_mode & IFMT) != IFDIR) {
3363275Smckusick 			printf("ls: not a directory\n");
3463275Smckusick 			continue;
3563275Smckusick 		}
3663275Smckusick 		if (ip->di_size == 0) {
3763275Smckusick 			printf("ls: zero length directory\n");
3863275Smckusick 			continue;
3963275Smckusick 		}
4063275Smckusick 		ls(fd);
4163275Smckusick 	}
4263275Smckusick }
4363275Smckusick 
4463275Smckusick #define CTRL(x)	(x&037)
4563275Smckusick 
getfile(prompt,mode)4663275Smckusick getfile(prompt, mode)
4763275Smckusick 	char *prompt;
4863275Smckusick 	int mode;
4963275Smckusick {
5063275Smckusick 	int fd;
5163275Smckusick 	char buf[100];
5263275Smckusick 
5363275Smckusick 	do {
5463275Smckusick 		printf("%s: ", prompt);
5563275Smckusick 		gets(buf);
5663275Smckusick 		if (buf[0] == CTRL('d') && buf[1] == 0)
5763275Smckusick 			return (-1);
5863275Smckusick 	} while ((fd = open(buf, mode)) < 0);
5963275Smckusick 	return(fd);
6063275Smckusick }
6163275Smckusick 
6263275Smckusick typedef struct direct	DP;
6363275Smckusick static
ls(fd)6463275Smckusick ls(fd)
6563275Smckusick 	register int fd;
6663275Smckusick {
6763275Smckusick 	register int size;
6863275Smckusick 	register char *dp;
6963275Smckusick 	char dirbuf[DIRBLKSIZ];
7063275Smckusick 
7163275Smckusick 	printf("\ninode\tname\n");
7263275Smckusick 	while ((size = read(fd, dirbuf, DIRBLKSIZ)) == DIRBLKSIZ)
7363275Smckusick 		for (dp = dirbuf; (dp < (dirbuf + size)) &&
7463275Smckusick 		    (dp + ((DP *)dp)->d_reclen) < (dirbuf + size);
7563275Smckusick 		    dp += ((DP *)dp)->d_reclen) {
7663275Smckusick 			if (((DP *)dp)->d_ino == 0)
7763275Smckusick 				continue;
7863275Smckusick 			if (((DP *)dp)->d_namlen > MAXNAMLEN+1) {
7963275Smckusick 				printf("Corrupt file name length!  Run fsck soon!\n");
8063275Smckusick 				return;
8163275Smckusick 			}
8263275Smckusick 			printf("%d\t%s\n", ((DP *)dp)->d_ino,
8363275Smckusick 			    ((DP *)dp)->d_name);
8463275Smckusick 		}
8563275Smckusick }
86