home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume11 / mtools / part02 / mkentry.c next >
C/C++ Source or Header  |  1987-08-27  |  2KB  |  112 lines

  1. /*
  2.  * mk_entry(), grow()
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <time.h>
  7. #include "msdos.h"
  8.  
  9. extern int fd, dir_start, dir_len, clus_size, dir_entries;
  10. extern int dir_chain[25];
  11.  
  12. /*
  13.  * Make a directory entry.  Builds a directory entry based on the
  14.  * name, attribute, starting cluster number, and size.  Returns a pointer
  15.  * to the directory structure.
  16.  */
  17.  
  18. struct directory *
  19. mk_entry(filename, attr, fat, size)
  20. char *filename;
  21. unsigned char attr;
  22. int fat;
  23. int size;
  24. {
  25.     long clock, time();
  26.     int i;
  27.     char *strncpy();
  28.     static struct directory ndir;
  29.     struct tm *now, *localtime();
  30.     unsigned char hour, min_hi, min_low, sec;
  31.     unsigned char year, month_hi, month_low, day;
  32.  
  33.     time(&clock);
  34.     now = localtime(&clock);
  35.     strncpy(ndir.name, filename, 8);
  36.     strncpy(ndir.ext, filename+8, 3);
  37.     ndir.attr = attr;
  38.     for (i=0; i<10; i++)
  39.         ndir.reserved[i] = NULL;
  40.     hour = now->tm_hour << 3;
  41.     min_hi = now->tm_min >> 3;
  42.     min_low = now->tm_min << 5;
  43.     sec = 0;
  44.     ndir.time[1] = hour + min_hi;
  45.     ndir.time[0] = min_low + sec;
  46.     year = (now->tm_year - 80) << 1;
  47.     month_hi = (now->tm_mon+1) >> 3;
  48.     month_low = (now->tm_mon+1) << 5;
  49.     day = now->tm_mday;
  50.     ndir.date[1] = year + month_hi;
  51.     ndir.date[0] = month_low + day;
  52.     ndir.start[1] = fat / 0x100;
  53.     ndir.start[0] = fat % 0x100;
  54.     ndir.size[3] = 0;        /* can't be THAT large */
  55.     ndir.size[2] = size / 0x10000;
  56.     ndir.size[1] = (size % 0x10000) / 0x100;
  57.     ndir.size[0] = (size % 0x10000) % 0x100;
  58.     return(&ndir);
  59. }
  60.  
  61. /*
  62.  * Make a subdirectory grow in length.  Only subdirectories (not root) 
  63.  * may grow.  Returns a 0 on success or 1 on failure (disk full).
  64.  */
  65.  
  66. int
  67. grow(fat)
  68. int fat;
  69. {
  70.     int i, next, last, getfat(), nextfat(), num, sector, buflen;
  71.     char tbuf[1024];
  72.     void perror(), exit();
  73.  
  74.     last = nextfat(0);
  75.     if (last == -1)
  76.         return(1);
  77.  
  78.     while (1) {
  79.         next = getfat(fat);
  80.         if (next == -1) {
  81.             fprintf(stderr, "grow: FAT problem\n");
  82.             exit(1);
  83.         }
  84.                     /* end of cluster chain */
  85.         if (next >= 0xff8)
  86.             break;
  87.         fat = next;
  88.     }
  89.                     /* mark the end of the chain */
  90.     putfat(fat, last);
  91.     putfat(last, 0xfff);
  92.                     /* zero the buffer */
  93.     buflen = clus_size * MSECSIZ;
  94.     for (i=0; i<buflen; i++)
  95.         tbuf[i] = NULL;
  96.  
  97.                     /* write the cluster */
  98.     sector = (last - 2) * clus_size + dir_start + dir_len;
  99.     move(sector);
  100.     if (write(fd, tbuf, buflen) != buflen) {
  101.         perror("grow: write");
  102.         exit(1);
  103.     }
  104.                     /* fix up the globals.... */
  105.     num = dir_entries / 16;
  106.     dir_entries += clus_size * 16;
  107.     dir_chain[num] = sector;
  108.     if (clus_size == 2)
  109.         dir_chain[num+1] = sector +1;
  110.     return(0);
  111. }
  112.