home *** CD-ROM | disk | FTP | other *** search
- /* ----------------------------------------------------- */
- /* UPDATE.C */
- /* Update ist als einfacher Ersatz für das DOS-Programm */
- /* Backup gedacht. Es dient zum Sichern bzw. Updaten */
- /* der neueren Dateiversionen von einer Festplatte auf */
- /* Diskette in Laufwerk a: (fest eingestellt) */
- /* */
- /* Update.c wurde mit Turbo-C 2.0 geschrieben. */
- /* Speichermodell: tiny */
- /* Umwandeln mit "exe2bin" in eine .com - Datei */
- /* Compilieren aus der Kommandozeile: tcc -mt -lt update */
- /* (c) 1990 Dieter Hartebrodt & TOOLBOX */
- /* ------------------------------------------------------ */
- #include <stdlib.h>
- #include <stdio.h>
- #include <dos.h>
- #include <dir.h>
- #include <conio.h>
- #include <string.h>
- #include <io.h>
- #include <fcntl.h>
- #include <stat.h>
-
- #define BLOCK_SIZE 1024 * 46 /* Größe Pufferspeicher */
- #define DRIVENUMMER 1
- #define UPDATE 2
- #define COPY 1
- #define NO_COPY 0
-
- char file_ziel[20];
-
- char path[80], drive[3], dir[66], file[9], ext[5];
- char *drive_arr[] = {"", "A:\\", "B:\\"};
-
- struct ffblk fcblock, tfcblock;;
- unsigned long diskfree;
- int drive_no;
-
- /* ------------------------------------------------------ */
- /* die Funktion getdiskfree() ermittelt den freien */
- /* Speicherplatz auf der Diskette. */
- /* (Einfacher als die entsprechende Turbo-C Funktion) */
-
- unsigned long getdiskfree(int drive) /* 1 = A, 2 = B ... */
- {
- union REGS regs;
- regs.h.dl = (char)drive;
- regs.h.ah = 0x36;
- intdos(®s, ®s);
-
- if(regs.x.ax == 0xFFFF)
- return(0xFFFFFFFF);
- else
- return( (long)regs.x.ax * regs.x.bx * regs.x.cx);
- }
-
- /* ------------------------------------------------------ */
- int read_write_disk(char *source, char *target)
- {
- int fpin, fpout;
- unsigned length;
- char *ptr;
-
- if( (fpin = open(source, O_RDONLY | O_BINARY)) == -1)
- {
- puts("Fehler beim Öffnen der Quelldatei !");
- exit(1);
- }
-
- if ((fpout = creat(target, S_IREAD | S_IWRITE ) ) == -1)
- {
- close(fpin);
- puts("Fehler beim Erzeugen der Zieldatei !");
- exit(1);
- }
-
- ptr = (char *)malloc(BLOCK_SIZE);
- if(ptr == NULL)
- {
- close(fpin);
- close(fpout);
- puts("Speicherplatz reicht nicht aus !");
- exit(1);
- }
-
- while( ( length = read(fpin, ptr, BLOCK_SIZE)) != 0)
- {
- if( _write(fpout, ptr, length) != length)
- {
- free(ptr);
- close(fpin);
- close(fpout);
- puts("Fehler beim Schreiben der Datei !");
- exit(1);
- }
- }
- close(fpin);
- close(fpout);
- free(ptr);
- }
-
- /* ------------------------------------------------------ */
- /* copy() stellt durch einen Datums- Uhrzeitvergleich fest*/
- /* ob ein Update erfolgen muß. Außerdem wird der vorhanden*/
- /* Speicherplatz auf der Zieldiskette ermittelt. */
-
- void copy(void)
- {
- unsigned long datetime, tdatetime;
- int ch, flag;
- FILE *fpq, *fpz;
-
- fnmerge(path, drive, dir, NULL, NULL);
- strcat(path, fcblock.ff_name);
- sprintf(file_ziel,"%s%s", drive_arr[drive_no],
- fcblock.ff_name);
-
- flag = NO_COPY;
-
- if( findfirst(file_ziel, &tfcblock, 0) )
- flag = COPY;
- else
- {
- datetime = fcblock.ff_fdate;
- datetime = (datetime << 16) | (long)fcblock.ff_ftime;
- tdatetime = tfcblock.ff_fdate;
- tdatetime = (tdatetime << 16) | (long)tfcblock.ff_ftime;
-
- if( datetime > tdatetime)
- flag = UPDATE;
- else
- printf("Kein update %-13s\n", file_ziel);
- }
- if(flag)
- {
- if(flag == UPDATE)
- {
- diskfree += tfcblock.ff_fsize;
- printf("Update ");
- }
- else
- printf("Kopieren ");
- while(diskfree < fcblock.ff_fsize)
- {
- puts( "\nDiskette voll !\n"
- "Bitte wechseln ! Danach Taste betätigen! "
- "(ESC) -> Abbruch\n");
- if( (ch = getch()) == 0 )
- ch = getch();
- if(ch == 27)
- exit(0);
- else
- diskfree = getdiskfree(drive_no);
- }
- printf("%-14s ---> %-16s Länge: %ld\n",
- path, file_ziel, fcblock.ff_fsize);
-
- read_write_disk(path, file_ziel);
- diskfree = getdiskfree(drive_no);
- }
- }
-
- /* ------------------------------------------------------ */
- main(int argc, char **argv)
- {
- if(argc < 2)
- {
- puts("Argumente nicht ausreichend !\n"
- "Aufruf 'update <Pfad\\Dateiname Pfad\\Dateiname...>'\n"
- "Es darf kein Ziellaufwerk angegeben werden !");
- exit(1);
- }
-
- fnsplit(argv[1], drive, dir, file, ext);
-
- drive_no = DRIVENUMMER;
- diskfree = getdiskfree(drive_no);
- if( diskfree == 0xFFFFFFFF)
- {
- printf("Ziellaufwerk nicht vorhanden !!\n");
- exit(1);
- }
-
- while(argc-- > 1)
- {
-
- if( findfirst(argv[argc], &fcblock, 0) )
- {
- printf("Pfad/Dateinamen '%s' nicht gefunden \n",
- argv[argc]);
- exit(1);
- }
- else
- copy();
-
- while(! findnext(&fcblock) )
- copy();
- }
- }
- /* ------------------------------------------------------ */
- /* Ende von UPDATE.C */