home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sys / stand / ls.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-05-03  |  3.1 KB  |  104 lines

  1. /*
  2.  * Copyright (c) 1982, 1986, 1988 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by the University of
  16.  *    California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  *
  33.  *    @(#)ls.c    7.9 (Berkeley) 6/28/90
  34.  */
  35.  
  36. #include "sys/param.h"
  37. #include "ufs/dir.h"
  38. #include "saio.h"
  39. #include "sys/ttychars.h"
  40.  
  41. main()
  42. {
  43.     struct dinode *ip;
  44.     int fd;
  45.  
  46.     for (;;) {
  47.         if ((fd = getfile("ls", 0)) == -1)
  48.             exit();
  49.         ip = &iob[fd - 3].i_ino;
  50.         if ((ip->di_mode & IFMT) != IFDIR) {
  51.             printf("ls: not a directory\n");
  52.             continue;
  53.         }
  54.         if (ip->di_size == 0) {
  55.             printf("ls: zero length directory\n");
  56.             continue;
  57.         }
  58.         ls(fd);
  59.     }
  60. }
  61.  
  62. #define CTRL(x)    (x&037)
  63.  
  64. getfile(prompt, mode)
  65.     char *prompt;
  66.     int mode;
  67. {
  68.     int fd;
  69.     char buf[100];
  70.  
  71.     do {
  72.         printf("%s: ", prompt);
  73.         gets(buf);
  74.         if (buf[0] == CTRL('d') && buf[1] == 0)
  75.             return (-1);
  76.     } while ((fd = open(buf, mode)) <= 0);
  77.     return(fd);
  78. }
  79.  
  80. typedef struct direct    DP;
  81. static
  82. ls(fd)
  83.     register int fd;
  84. {
  85.     register int size;
  86.     register char *dp;
  87.     char dirbuf[DIRBLKSIZ];
  88.  
  89.     printf("\ninode\tname\n");
  90.     while ((size = read(fd, dirbuf, DIRBLKSIZ)) == DIRBLKSIZ)
  91.         for(dp = dirbuf; (dp < (dirbuf + size)) &&
  92.             (dp + ((DP *)dp)->d_reclen) < (dirbuf + size);
  93.             dp += ((DP *)dp)->d_reclen) {
  94.             if (((DP *)dp)->d_ino == 0)
  95.                 continue;
  96.             if (((DP *)dp)->d_namlen > MAXNAMLEN+1) {
  97.                 printf("Corrupt file name length!  Run fsck soon!\n");
  98.                 return;
  99.             }
  100.             printf("%d\t%s\n", ((DP *)dp)->d_ino,
  101.                 ((DP *)dp)->d_name);
  102.         }
  103. }
  104.