home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / SRC / msdos_diskaccess.lzh / MS_DISK_ACCESS / putfat.c < prev    next >
Text File  |  1990-05-10  |  3KB  |  112 lines

  1. /*
  2.  * putfat(), writedir(), zapit()
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include "msdos.h"
  7.  
  8. extern int fd, fat_len, dir_chain[25];
  9. extern unsigned char *fatbuf;
  10.  
  11. /*
  12.  * Puts a code into the FAT table.  Is the opposite of getfat().  No
  13.  * sanity checking is done on the code.  Returns a 1 on error.
  14.  */
  15.  
  16. int
  17. putfat(num, code)
  18. int num;
  19. unsigned int code;
  20. {
  21. /*
  22.  *    |    byte n     |   byte n+1    |   byte n+2    |
  23.  *    |0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|0|1|2|3|4|5|6|7|
  24.  *    | | | | | | | | | | | | | | | | | | | | | | | | |
  25.  *    |  n.0  |  n.5  | n+1.0 | n+1.5 | n+2.0 | n+2.5 |
  26.  *        \_____  \____   \______/________/_____   /
  27.  *          ____\______\________/   _____/  ____\_/
  28.  *         /     \      \          /       /     \
  29.  *    | n+1.5 |  n.0  |  n.5  | n+2.0 | n+2.5 | n+1.0 |
  30.  *    |      FAT entry k      |    FAT entry k+1      |
  31.  */
  32.     int start;
  33.                     /* which bytes contain the entry */
  34.     start = num * 3 / 2;
  35.     if (start < 0 || start+1 > (fat_len * MSECSIZ))
  36.         return(1);
  37.                     /* (odd) not on byte boundary */
  38.     if (num % 2) {
  39.         *(fatbuf+start) = (*(fatbuf+start) & 0x0f) + ((code << 4) & 0xf0);
  40.         *(fatbuf+start+1) = (code >> 4) & 0xff;
  41.     }
  42.                     /* (even) on byte boundary */
  43.     else {
  44.         *(fatbuf+start) = code & 0xff;
  45.         *(fatbuf+start+1) = (*(fatbuf+start+1) & 0xf0) + ((code >> 8) & 0x0f);
  46.     }
  47.     return(0);
  48. }
  49.  
  50. /*
  51.  * Write a directory entry.  The first argument is the directory entry
  52.  * number to write to.  The second is a pointer to the directory itself.
  53.  * All errors are fatal.
  54.  */
  55.  
  56. void
  57. writedir(num, dir)
  58. int num;
  59. struct directory *dir;
  60. {
  61.     int skip, entry;
  62.     struct directory dirs[16];
  63.     void exit(), perror(), move();
  64.                     /* which sector */
  65.     skip = dir_chain[num / 16];
  66.  
  67.     move(skip);
  68.                     /* read the sector */
  69.     if (read(fd, (char *) &dirs[0], MSECSIZ) != MSECSIZ) {
  70.         perror("writedir: read");
  71.         exit(1);
  72.     }
  73.                     /* which entry in sector */
  74.     entry = num % 16;
  75.                     /* copy the structure */
  76.     dirs[entry] = *dir;
  77.     move(skip);
  78.                     /* write the sector */
  79.     if (write(fd, (char *) &dirs[0], MSECSIZ) != MSECSIZ) {
  80.         perror("writedir: write");
  81.         exit(1);
  82.     }
  83.     return;
  84. }
  85.  
  86. /*
  87.  * Remove a string of FAT entries (delete the file).  The argument is
  88.  * the beginning of the string.  Does not consider the file length, so
  89.  * if FAT is corrupted, watch out!  All errors are fatal.
  90.  */
  91.  
  92. void
  93. zapit(fat)
  94. int fat;
  95. {
  96.     int next;
  97.  
  98.     while (1) {
  99.                     /* get next cluster number */
  100.         next = getfat(fat);
  101.                     /* mark current cluster as empty */
  102.         if (putfat(fat, 0) || next == -1) {
  103.             fprintf(stderr, "zapit: FAT problem\n");
  104.             exit(1);
  105.         }
  106.         if (next >= 0xff8)
  107.             break;
  108.         fat = next;
  109.     }
  110.     return;
  111. }
  112.