home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1990 / 04 / tricks / update.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-01-15  |  5.1 KB  |  202 lines

  1. /* -----------------------------------------------------  */
  2. /*                      UPDATE.C                          */
  3. /* Update ist als einfacher Ersatz für das DOS-Programm   */
  4. /* Backup gedacht. Es dient zum Sichern bzw. Updaten      */
  5. /* der neueren Dateiversionen von einer Festplatte auf    */
  6. /* Diskette in Laufwerk a: (fest eingestellt)             */
  7. /*                                                        */
  8. /* Update.c wurde mit Turbo-C 2.0 geschrieben.            */
  9. /* Speichermodell: tiny                                   */
  10. /* Umwandeln mit "exe2bin" in eine .com - Datei           */
  11. /* Compilieren aus der Kommandozeile: tcc -mt -lt update  */
  12. /*       (c) 1990  Dieter Hartebrodt  &  TOOLBOX          */
  13. /* ------------------------------------------------------ */
  14. #include <stdlib.h>
  15. #include <stdio.h>
  16. #include <dos.h>
  17. #include <dir.h>
  18. #include <conio.h>
  19. #include <string.h>
  20. #include <io.h>
  21. #include <fcntl.h>
  22. #include <stat.h>
  23.  
  24. #define BLOCK_SIZE 1024 * 46      /* Größe Pufferspeicher */
  25. #define DRIVENUMMER 1
  26. #define UPDATE 2
  27. #define COPY 1
  28. #define NO_COPY 0
  29.  
  30. char file_ziel[20];
  31.  
  32. char path[80], drive[3], dir[66], file[9], ext[5];
  33. char *drive_arr[] = {"", "A:\\", "B:\\"};
  34.  
  35. struct ffblk fcblock, tfcblock;;
  36. unsigned long diskfree;
  37. int drive_no;
  38.  
  39. /* ------------------------------------------------------ */
  40. /* die Funktion getdiskfree() ermittelt den freien        */
  41. /* Speicherplatz auf der Diskette.                        */
  42. /* (Einfacher als die entsprechende Turbo-C Funktion)     */
  43.  
  44. unsigned long getdiskfree(int drive)  /* 1 = A, 2 = B ... */
  45. {
  46.    union REGS regs;
  47.    regs.h.dl = (char)drive;
  48.    regs.h.ah = 0x36;
  49.    intdos(®s, ®s);
  50.  
  51.    if(regs.x.ax == 0xFFFF)
  52.       return(0xFFFFFFFF);
  53.    else
  54.       return( (long)regs.x.ax * regs.x.bx * regs.x.cx);
  55. }
  56.  
  57. /* ------------------------------------------------------ */
  58. int read_write_disk(char *source, char *target)
  59. {
  60.   int fpin, fpout;
  61.   unsigned length;
  62.   char *ptr;
  63.  
  64.   if( (fpin = open(source, O_RDONLY | O_BINARY)) == -1)
  65.   {
  66.     puts("Fehler beim Öffnen der Quelldatei !");
  67.     exit(1);
  68.   }
  69.  
  70.   if ((fpout = creat(target, S_IREAD | S_IWRITE ) ) == -1)
  71.   {
  72.     close(fpin);
  73.     puts("Fehler beim Erzeugen der Zieldatei !");
  74.     exit(1);
  75.   }
  76.  
  77.   ptr = (char *)malloc(BLOCK_SIZE);
  78.   if(ptr == NULL)
  79.   {
  80.     close(fpin);
  81.     close(fpout);
  82.     puts("Speicherplatz reicht nicht aus !");
  83.     exit(1);
  84.   }
  85.  
  86.   while( (  length = read(fpin, ptr, BLOCK_SIZE)) != 0)
  87.   {
  88.     if( _write(fpout, ptr, length) != length)
  89.     {
  90.       free(ptr);
  91.       close(fpin);
  92.       close(fpout);
  93.       puts("Fehler beim Schreiben der Datei !");
  94.       exit(1);
  95.     }
  96.   }
  97.   close(fpin);
  98.   close(fpout);
  99.   free(ptr);
  100. }
  101.  
  102. /* ------------------------------------------------------ */
  103. /* copy() stellt durch einen Datums- Uhrzeitvergleich fest*/
  104. /* ob ein Update erfolgen muß. Außerdem wird der vorhanden*/
  105. /* Speicherplatz auf der Zieldiskette ermittelt.          */
  106.  
  107. void copy(void)
  108. {
  109.   unsigned long datetime, tdatetime;
  110.   int ch, flag;
  111.   FILE *fpq, *fpz;
  112.  
  113.   fnmerge(path, drive, dir, NULL, NULL);
  114.   strcat(path, fcblock.ff_name);
  115.   sprintf(file_ziel,"%s%s", drive_arr[drive_no],
  116.         fcblock.ff_name);
  117.  
  118.   flag = NO_COPY;
  119.  
  120.   if( findfirst(file_ziel, &tfcblock, 0) )
  121.     flag = COPY;
  122.   else
  123.   {
  124.     datetime = fcblock.ff_fdate;
  125.     datetime = (datetime << 16) | (long)fcblock.ff_ftime;
  126.     tdatetime = tfcblock.ff_fdate;
  127.     tdatetime = (tdatetime << 16) | (long)tfcblock.ff_ftime;
  128.  
  129.     if( datetime > tdatetime)
  130.       flag = UPDATE;
  131.     else
  132.       printf("Kein update %-13s\n", file_ziel);
  133.   }
  134.   if(flag)
  135.   {
  136.     if(flag == UPDATE)
  137.     {
  138.       diskfree += tfcblock.ff_fsize;
  139.       printf("Update    ");
  140.     }
  141.     else
  142.       printf("Kopieren  ");
  143.     while(diskfree < fcblock.ff_fsize)
  144.     {
  145.     puts( "\nDiskette voll !\n"
  146.           "Bitte wechseln ! Danach Taste betätigen! "
  147.           "(ESC) -> Abbruch\n");
  148.     if( (ch = getch()) == 0 )
  149.       ch = getch();
  150.     if(ch == 27)
  151.       exit(0);
  152.     else
  153.       diskfree = getdiskfree(drive_no);
  154.     }
  155.     printf("%-14s  ---> %-16s  Länge: %ld\n",
  156.             path, file_ziel, fcblock.ff_fsize);
  157.  
  158.     read_write_disk(path, file_ziel);
  159.     diskfree = getdiskfree(drive_no);
  160.   }
  161. }
  162.  
  163. /* ------------------------------------------------------ */
  164. main(int argc, char **argv)
  165. {
  166.   if(argc < 2)
  167.   {
  168.     puts("Argumente nicht ausreichend !\n"
  169.     "Aufruf 'update <Pfad\\Dateiname Pfad\\Dateiname...>'\n"
  170.     "Es darf kein Ziellaufwerk angegeben werden !");
  171.     exit(1);
  172.   }
  173.  
  174.   fnsplit(argv[1], drive, dir, file, ext);
  175.  
  176.   drive_no = DRIVENUMMER;
  177.   diskfree = getdiskfree(drive_no);
  178.   if( diskfree == 0xFFFFFFFF)
  179.   {
  180.     printf("Ziellaufwerk nicht vorhanden !!\n");
  181.     exit(1);
  182.   }
  183.  
  184.   while(argc-- > 1)
  185.   {
  186.  
  187.     if( findfirst(argv[argc], &fcblock, 0) )
  188.     {
  189.       printf("Pfad/Dateinamen '%s' nicht gefunden \n",
  190.             argv[argc]);
  191.       exit(1);
  192.     }
  193.     else
  194.       copy();
  195.  
  196.     while(! findnext(&fcblock)  )
  197.       copy();
  198.   }
  199. }
  200. /* ------------------------------------------------------ */
  201. /*                    Ende von UPDATE.C                   */
  202.