1: #include <stdio.h>
   2: #include <time.h>
   3: #include "msdos.h"
   4: 
   5: extern int dir_start, dir_len, clus_size, dir_entries, fat_error, clus_size;
   6: extern unsigned int num_clus, end_fat, last_fat;
   7: extern long dir_chain[MAX_DIR_SECS];
   8: extern unsigned char *dir_buf;
   9: 
  10: /*
  11:  * Make a subdirectory grow in length.  Only subdirectories (not root)
  12:  * may grow.  Returns a 0 on success, 1 on failure (disk full), or -1
  13:  * on error.
  14:  */
  15: 
  16: int
  17: dir_grow(fat)
  18: unsigned int fat;
  19: {
  20:     int i, num, buflen, new;
  21:     long sector;
  22:     char *memset(), *realloc();
  23:     unsigned char *offset, tbuf[MAX_CLUSTER];
  24:     unsigned int next, last, next_fat(), fat_decode();
  25:     void perror(), exit(), disk_write(), disk_read();
  26: 
  27:     last = next_fat(0);
  28:     if (last == 1)
  29:         return(1);
  30: 
  31:     /* CONSTCOND */
  32:     while (1) {
  33:         next = fat_decode(fat);
  34:         if (next == 1) {
  35:             fprintf(stderr, "dir_grow: FAT problem\n");
  36:             fat_error++;
  37:             return(-1);
  38:         }
  39:                     /* end of cluster chain */
  40:         if (next >= last_fat)
  41:             break;
  42:         fat = next;
  43:     }
  44:                     /* mark the end of the chain */
  45:     fat_encode(fat, last);
  46:     fat_encode(last, end_fat);
  47:                     /* zero the buffer */
  48:     buflen = clus_size * MSECTOR_SIZE;
  49:     memset((char *) tbuf, '\0', buflen);
  50: 
  51:                     /* write the cluster */
  52:     sector = (long) (last - 2) * clus_size + dir_start + dir_len;
  53:     disk_write(sector, tbuf, buflen);
  54: 
  55:                     /* fix up the globals.... */
  56:     num = dir_entries / 16;
  57:     dir_entries += clus_size * 16;
  58:     for (i = 0; i < clus_size; i++)
  59:         dir_chain[num + i] = sector + i;
  60: 
  61:                     /* fix up dir_buf.... */
  62:     new = num + clus_size;
  63:     dir_buf = (unsigned char *) realloc((char *) dir_buf, (unsigned int) new * MSECTOR_SIZE);
  64:     if (dir_buf == NULL) {
  65:         perror("dir_grow: malloc");
  66:         exit(1);
  67:     }
  68:     offset = dir_buf + (num * MSECTOR_SIZE);
  69:     disk_read(dir_chain[num], offset, clus_size * MSECTOR_SIZE);
  70:     return(0);
  71: }
  72: 
  73: /*
  74:  * Returns next free cluster or 1 if none are available.
  75:  */
  76: 
  77: unsigned int
  78: next_fat(last)
  79: unsigned int last;
  80: {
  81:     register unsigned int i;
  82:     unsigned int fat_decode();
  83: 
  84:     for (i = last + 1; i < num_clus + 2; i++) {
  85:         if (!fat_decode(i))
  86:             return(i);
  87:     }
  88:     return(1);
  89: }

Defined functions

dir_grow defined in line 16; used 2 times
next_fat defined in line 77; used 8 times
Last modified: 1992-06-24
Generated: 2016-12-26
Generated by src2html V0.67
page hit count: 2180
Valid CSS Valid XHTML 1.0 Strict