home *** CD-ROM | disk | FTP | other *** search
/ minnie.tuhs.org / unixen.tar / unixen / PDP-11 / Trees / V7 / usr / src / cmd / df.c < prev    next >
Encoding:
C/C++ Source or Header  |  1979-01-10  |  1.3 KB  |  97 lines

  1. #include <stdio.h>
  2. #include <sys/param.h>
  3. #include <sys/filsys.h>
  4. #include <sys/fblk.h>
  5.  
  6. daddr_t    blkno    = 1;
  7. char    *dargv[] = {
  8.     0,
  9.     "/dev/rp0",
  10.     "/dev/rp3",
  11.     0
  12. };
  13.  
  14.  
  15. struct    filsys sblock;
  16.  
  17. int    fi;
  18. daddr_t    alloc();
  19.  
  20. main(argc, argv)
  21. char **argv;
  22. {
  23.     int i;
  24.  
  25.     if(argc <= 1) {
  26.         for(argc = 1; dargv[argc]; argc++);
  27.         argv = dargv;
  28.     }
  29.  
  30.     for(i=1; i<argc; i++) {
  31.         dfree(argv[i]);
  32.     }
  33. }
  34.  
  35. dfree(file)
  36. char *file;
  37. {
  38.     daddr_t i;
  39.  
  40.     fi = open(file, 0);
  41.     if(fi < 0) {
  42.         fprintf(stderr,"cannot open %s\n", file);
  43.         return;
  44.     }
  45.     sync();
  46.     bread(1L, (char *)&sblock, sizeof(sblock));
  47.     i = 0;
  48.     while(alloc())
  49.         i++;
  50.     printf("%s %D\n", file, i);
  51.     close(fi);
  52. }
  53.  
  54. daddr_t
  55. alloc()
  56. {
  57.     int i;
  58.     daddr_t b;
  59.     struct fblk buf;
  60.  
  61.     i = --sblock.s_nfree;
  62.     if(i<0 || i>=NICFREE) {
  63.         printf("bad free count, b=%D\n", blkno);
  64.         return(0);
  65.     }
  66.     b = sblock.s_free[i];
  67.     if(b == 0)
  68.         return(0);
  69.     if(b<sblock.s_isize || b>=sblock.s_fsize) {
  70.         printf("bad free block (%D)\n", b);
  71.         return(0);
  72.     }
  73.     if(sblock.s_nfree <= 0) {
  74.         bread(b, (char *)&buf, sizeof(buf));
  75.         blkno = b;
  76.         sblock.s_nfree = buf.df_nfree;
  77.         for(i=0; i<NICFREE; i++)
  78.             sblock.s_free[i] = buf.df_free[i];
  79.     }
  80.     return(b);
  81. }
  82.  
  83. bread(bno, buf, cnt)
  84. daddr_t bno;
  85. char *buf;
  86. {
  87.     int n;
  88.     extern errno;
  89.  
  90.     lseek(fi, bno<<BSHIFT, 0);
  91.     if((n=read(fi, buf, cnt)) != cnt) {
  92.         printf("read error %D\n", bno);
  93.         printf("count = %d; errno = %d\n", n, errno);
  94.         exit(0);
  95.     }
  96. }
  97.