X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/a34cad540062a6d5759ec9e0664497d930e3743a..9c50374f0792e9289728367cb68f8e6448721f05:/usr/src/sys/stand.att/ls.c diff --git a/usr/src/sys/stand.att/ls.c b/usr/src/sys/stand.att/ls.c index a0dc90f8f6..ab7378bf6a 100644 --- a/usr/src/sys/stand.att/ls.c +++ b/usr/src/sys/stand.att/ls.c @@ -1,41 +1,63 @@ -/* ls.c 1.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; iinode\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"); - } }