# 2.11BSD#431 - /usr/src/local/mtools/dir_make.c

##### Functions

    dir_grow          X
    next_fat          X

       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

- in /usr/src/local/mtools/mmd.c line 130
- in /usr/src/local/mtools/mwrite.c line 210

next_fat defined in line 77; used 8 times

- in line 24-27(2)
- in /usr/src/local/mtools/file_write.c line 22, 49
- in /usr/src/local/mtools/mmd.c line 33, 138
- in /usr/src/local/mtools/mwrite.c line 249, 297

Last modified: 1992-06-24 Generated: 2016-12-26 | Generated by src2html V0.67 page hit count: 627 |