-/* ls.c 4.1 %G% */
+/*
+ * 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.4 (Berkeley) %G%
+ */
-#include "../h/param.h"
-#include "../h/inode.h"
-#include "../h/ino.h"
-#include "../h/dir.h"
+#include "param.h"
+#include "inode.h"
+#include "dir.h"
+#include "fs.h"
#include "saio.h"
-char line[100];
-
main()
{
- int i;
-
- printf("ls\n");
- do {
- printf(": "); gets(line);
- i = open(line, 0);
- } while (i < 0);
+ struct inode *ip;
+ int fd;
- ls(i);
+ fd = getfile("ls", 0);
+ ip = &iob[fd - 3].i_ino;
+ if ((ip->i_mode & IFMT) != IFDIR)
+ _stop("ls: not a directory");
+ if (ip->i_size == 0)
+ _stop("ls: zero length directory");
+ ls(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("\nname->inode\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_reclen > DIRSIZ(((DP *)dp)))
+ continue;
+ if (((DP *)dp)->d_namlen > MAXNAMLEN+1)
+ _stop("Corrupt file name length! Run fsck soon!\n");
+ printf("%s->%d\n", ((DP *)dp)->d_name,
+ ((DP *)dp)->d_ino);
}
- printf("\n");
- }
}