home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / BEEHIVE / OS / UZIUTIL.ARC / MKFS.C < prev    next >
C/C++ Source or Header  |  1988-12-22  |  3KB  |  160 lines

  1.  
  2. /**************************************************
  3. UZI (Unix Z80 Implementation) Utilities:  mkfs.c
  4. ***************************************************/
  5.  
  6.  
  7. #include <stdio.h>
  8. #include "unix.h";
  9. #include "extern.h"
  10.  
  11. /* This makes a filesystem */
  12.  
  13. int dev;
  14.  
  15. extern char zerobuf();
  16. direct dirbuf[32] = { ROOTINODE,".",ROOTINODE,".." };
  17. struct dinode inode[8];
  18.  
  19. main(argc,argv)
  20. int argc;
  21. char *argv[];
  22. {
  23.     uint16 fsize, isize;
  24.  
  25.     if (argc != 4)
  26.     {
  27.     printf("Usage: mkfs device isize fsize\n");
  28.     exit(-1);
  29.     }
  30.  
  31.     dev = atoi(argv[1]);
  32.     isize = (uint16)atoi(argv[2]);
  33.     fsize = (uint16)atoi(argv[3]);
  34.  
  35.     if (dev == 0 && argv[1][0] != '0')
  36.     {
  37.     printf("Invalid device\n");
  38.     exit(-1);
  39.     }
  40.     if (dev < 0 || dev >= NDEVS)
  41.     {
  42.     printf("Invalid device\n");
  43.     exit(-1);
  44.     }
  45.  
  46.     if (fsize < 3 || isize < 2 || isize >= fsize)
  47.     {
  48.     printf("Bad parameter values\n");
  49.     exit(-1);
  50.     }
  51.  
  52.  
  53.     printf("Making filesystem on device %d with isize %u fsize %u. Confirm? ",
  54.         dev,isize,fsize);
  55.     if (!yes())
  56.     exit(-1);
  57.  
  58.     bufinit();
  59.     if (d_open(dev))
  60.     {
  61.     printf("Can't open device");
  62.     exit(-1);
  63.     }
  64.  
  65.     mkfs(fsize,isize);
  66.     bufsync();
  67.     exit(0);
  68. }
  69.  
  70.  
  71.  
  72.  
  73. mkfs(fsize, isize)
  74. uint16 fsize, isize;
  75. {
  76.     uint16 j;
  77.  
  78.     /* Zero out the blocks */
  79.  
  80. #ifdef CPM
  81.     for (j=0; j < isize; ++j)   /* Don't waste time in CPM */
  82.     dwrite(j,zerobuf());
  83. #else
  84.     for (j=0; j < fsize; ++j)
  85.     dwrite(j,zerobuf());
  86. #endif
  87.  
  88.     /* Initialize the super-block */
  89.  
  90.     fs_tab[dev].s_mounted = SMOUNTED; /* Magic number */
  91.     fs_tab[dev].s_isize =  isize;
  92.     fs_tab[dev].s_fsize =  fsize;
  93.     fs_tab[dev].s_nfree =  1;
  94.     fs_tab[dev].s_free[0] =  0;
  95.     fs_tab[dev].s_tfree =  0;
  96.     fs_tab[dev].s_ninode = 0;
  97.     fs_tab[dev].s_tinode =  8 * (isize-2) - 2;
  98.  
  99.     /* Free each block, building the free list */
  100.  
  101.     for (j= fsize-1; j >= isize+1; --j)
  102.     {
  103.     if (fs_tab[dev].s_nfree == 50)
  104.     {
  105.         dwrite(j, (char *)&fs_tab[dev].s_nfree);
  106.         fs_tab[dev].s_nfree = 0;
  107.     }
  108.  
  109.     ++fs_tab[dev].s_tfree;
  110.     fs_tab[dev].s_free[(fs_tab[dev].s_nfree)++] = j;
  111.     }
  112.  
  113.     /* The inodes are already zeroed out */
  114.     /* create the root dir */
  115.  
  116.  
  117.     inode[ROOTINODE].i_mode = F_DIR | (0777 & MODE_MASK);
  118.     inode[ROOTINODE].i_nlink = 3;
  119.     inode[ROOTINODE].i_size.o_blkno = 0;
  120.     inode[ROOTINODE].i_size.o_offset = 32;
  121.     inode[ROOTINODE].i_addr[0] = isize;
  122.  
  123.     /* Reserve reserved inode */
  124.     inode[0].i_nlink = 1;
  125.     inode[0].i_mode = ~0;
  126.  
  127.     dwrite(2,(char *)inode);
  128.  
  129.     dwrite(isize,(char *)dirbuf);
  130.  
  131.     /* Write out super block */
  132.     dwrite(1,(char *)&fs_tab[dev]);
  133. }
  134.  
  135.  
  136.  
  137. dwrite(blk, addr)
  138. uint16 blk;
  139. char *addr;
  140. {
  141.     char *buf;
  142.     char *bread();
  143.  
  144.     buf = bread(dev, blk, 1);
  145.     bcopy(addr, buf, 512);
  146.     bfree(buf, 1);
  147. }
  148.     
  149.  
  150. yes()
  151. {
  152.     char line[20];
  153.  
  154.     if (!fgets(line,sizeof(line),stdin) || (*line != 'y' && *line != 'Y'))
  155.     return(0);
  156.  
  157.     return(1);
  158. }
  159.  
  160.