BSD 4_3_Tahoe release
[unix-history] / usr / src / sys / stand / ls.c
index aaf58ba..ef1b673 100644 (file)
@@ -1,39 +1,87 @@
-#include "../h/param.h"
-#include "../h/inode.h"
-#include "../h/ino.h"
-#include "../h/dir.h"
-#include "saio.h"
+/*
+ * Copyright (c) 1982, 1986, 1988 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the above copyright notice and this paragraph are
+ * duplicated in all such forms and that any documentation,
+ * advertising materials, and other materials related to such
+ * distribution and use acknowledge that the software was developed
+ * by the University of California, Berkeley.  The name of the
+ * University may not be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
+ * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ *     @(#)ls.c        7.5 (Berkeley) 3/21/89
+ */
 
 
-char line[100];
+#include "param.h"
+#include "inode.h"
+#include "dir.h"
+#include "fs.h"
+#include "saio.h"
+#include "ttychars.h"
 
 main()
 {
 
 main()
 {
-       int i;
+       struct inode *ip;
+       int fd;
+
+       for (;;) {
+               if ((fd = getfile("ls", 0)) == -1)
+                       exit();
+               ip = &iob[fd - 3].i_ino;
+               if ((ip->i_mode & IFMT) != IFDIR) {
+                       printf("ls: not a directory\n");
+                       continue;
+               }
+               if (ip->i_size == 0) {
+                       printf("ls: zero length directory\n");
+                       continue;
+               }
+               ls(fd);
+       }
+}
 
 
-       printf("ls\n");
-       do  {
-               printf(": "); gets(line);
-               i = open(line, 0);
-       } while (i < 0);
+getfile(prompt, mode)
+       char *prompt;
+       int mode;
+{
+       int fd;
+       char buf[100];
 
 
-       ls(i);
+       do {
+               printf("%s: ", prompt);
+               gets(buf);
+               if (buf[0] == CTRL('d') && buf[1] == 0)
+                       return (-1);
+       } while ((fd = open(buf, mode)) <= 0);
+       return(fd);
 }
 
 }
 
-ls(io)
-register io;
+typedef struct direct  DP;
+static
+ls(fd)
+       register int fd;
 {
 {
-       struct direct d;
-       register i;
+       register int size;
+       register char *dp;
+       char dirbuf[DIRBLKSIZ];
 
 
-       while (read(io, (char *)&d, sizeof d) == sizeof d) {
-               if (d.d_ino == 0)
-                       continue;
-               printf("%d\t", d.d_ino);
-               for (i=0; i<DIRSIZ; i++) {
-                       if (d.d_name[i] == 0)
-                               break;
-                       printf("%c", d.d_name[i]);
+       printf("\ninode\tname\n");
+       while ((size = read(fd, dirbuf, DIRBLKSIZ)) == DIRBLKSIZ)
+               for(dp = dirbuf; (dp < (dirbuf + size)) &&
+                   (dp + ((DP *)dp)->d_reclen) < (dirbuf + size);
+                   dp += ((DP *)dp)->d_reclen) {
+                       if (((DP *)dp)->d_ino == 0)
+                               continue;
+                       if (((DP *)dp)->d_namlen > MAXNAMLEN+1) {
+                               printf("Corrupt file name length!  Run fsck soon!\n");
+                               return;
+                       }
+                       printf("%d\t%s\n", ((DP *)dp)->d_ino,
+                           ((DP *)dp)->d_name);
                }
                }
-               printf("\n");
-       }
 }
 }