1 /*
2 * Copyright (c) 1982, 1986, 1988, 1993
3 * The Regents of the University of California. All rights reserved.
4 *
5 * %sccs.include.redist.c%
6 *
7 * @(#)ls.c 8.1 (Berkeley) 06/11/93
8 */
9
10 #include <sys/param.h>
11 #include <sys/ttychars.h>
12
13 #include <ufs/ufs/dir.h>
14 #include <stand.att/saio.h>
15
main()16 main()
17 {
18 struct dinode *ip;
19 int fd;
20
21 for (;;) {
22 if ((fd = getfile("ls", 0)) == -1)
23 exit();
24 ip = &iob[fd - 3].i_ino;
25 if ((ip->di_mode & IFMT) != IFDIR) {
26 printf("ls: not a directory\n");
27 continue;
28 }
29 if (ip->di_size == 0) {
30 printf("ls: zero length directory\n");
31 continue;
32 }
33 ls(fd);
34 }
35 }
36
37 #define CTRL(x) (x&037)
38
getfile(prompt,mode)39 getfile(prompt, mode)
40 char *prompt;
41 int mode;
42 {
43 int fd;
44 char buf[100];
45
46 do {
47 printf("%s: ", prompt);
48 gets(buf);
49 if (buf[0] == CTRL('d') && buf[1] == 0)
50 return (-1);
51 } while ((fd = open(buf, mode)) <= 0);
52 return(fd);
53 }
54
55 typedef struct direct DP;
56 static
ls(fd)57 ls(fd)
58 register int fd;
59 {
60 register int size;
61 register char *dp;
62 char dirbuf[DIRBLKSIZ];
63
64 printf("\ninode\tname\n");
65 while ((size = read(fd, dirbuf, DIRBLKSIZ)) == DIRBLKSIZ)
66 for(dp = dirbuf; (dp < (dirbuf + size)) &&
67 (dp + ((DP *)dp)->d_reclen) < (dirbuf + size);
68 dp += ((DP *)dp)->d_reclen) {
69 if (((DP *)dp)->d_ino == 0)
70 continue;
71 if (((DP *)dp)->d_namlen > MAXNAMLEN+1) {
72 printf("Corrupt file name length! Run fsck soon!\n");
73 return;
74 }
75 printf("%d\t%s\n", ((DP *)dp)->d_ino,
76 ((DP *)dp)->d_name);
77 }
78 }
79