From 059c794ba7bea143006a35ef06261692f96a2e34 Mon Sep 17 00:00:00 2001 From: Oliver Lehmann Date: Fri, 1 Dec 1989 06:02:50 +0000 Subject: [PATCH] new --- WEGA/src/cmd/doscopy/dosdel.c | 140 ++++++++++++++++++++++++++++++++++ WEGA/src/cmd/doscopy/dosfat.c | 65 ++++++++++++++++ 2 files changed, 205 insertions(+) create mode 100644 WEGA/src/cmd/doscopy/dosdel.c create mode 100644 WEGA/src/cmd/doscopy/dosfat.c diff --git a/WEGA/src/cmd/doscopy/dosdel.c b/WEGA/src/cmd/doscopy/dosdel.c new file mode 100644 index 0000000..f40ed38 --- /dev/null +++ b/WEGA/src/cmd/doscopy/dosdel.c @@ -0,0 +1,140 @@ +/************************************************************************** +*************************************************************************** + + W E G A - Quelle (C) TU KMSt / ZFT/KEAW Abt. WAE - 1988 + Programm: dosdel.c + + Bearbeiter : P. Hoge + Datum : 24.11.89 + Version : 1.3 + +*************************************************************************** +**************************************************************************/ + +#include "dos.h" + +/* dosdel + * Loescht die DCP-Datei fn auf dem Datentraeger dp. + * Liefert 0, wenn nicht gefunden, + * -1, bei Lesefehler, + * -2, bei Schreibfehler und + * -3, falls fn ein Verzeichnis bzw + * schreibgeschuetzt ist. + */ +dosdel(fn,dp) +register char *fn; +register struct dosdisc *dp; +{ + register struct dostat fnrec, dirrec; + long adr; + unsigned char delsign=0xe5; + char s[LMAX],*file,*strrchr(); + unsigned dnum,nxt,dosnxt(); + int res; + + strcpy(s,fn); + fn = s; + if ((res=dosopn(fn,dp,&fnrec)) < 1) + return(res); + if (fnrec.mode == _SDIR || fnrec.flag == RO) + return(-3); + + if (fn[0] == '/') + fn++; + if ((file=strrchr(fn,'/')) == 0) { /* main directory */ + file = fn; + dnum = dp->dirnum; + adr = dp->maindir; + nxt = 0; + } + else { /* sub directory */ + fn[strlen(fn)-strlen(file)] = '\0'; + file++; + + if ((res=dosopn(fn,dp,&dirrec)) < 1) + return(res); + nxt = dirrec.first; + adr = DOSADR(nxt,dp->clustsiz)+dp->data; + dnum = dp->clustsiz/32; + } + /* Suchen des zu loeschenden Eintrages */ + while (-1) { + if ((res=dosrde(dp->fd,file,dnum,adr,&fnrec)) < 0) + return(res); + if (res == 1) { + lseek(dp->fd,(long)-32,1); + if (write(dp->fd,&delsign,1) != 1) + return(-2); + return(fatdel(&fnrec,dp)); + } + if (nxt == 0) + return(0); + if ((nxt=dosnxt(dp->fd,nxt,dp->fat1,dp->fatlen)) < 1) + return(0); + /* naechsten Cluster lesen */ + adr = DOSADR(nxt,dp->clustsiz)+dp->data; + } +} + +/* fatdel + * Gibt die Belegungskette der DCP-Datei stp + * frei. Liefert -1 bei Lese- und -2 bei Schreibfehler. + */ +fatdel(stp,dp) +register struct dostat *stp; +register struct dosdisc *dp; +{ + register int res; + register unsigned first, next; + + next = stp->first; + while (next) { + first = next; + next = dosnxt(dp->fd,first,dp->fat1,dp->fatlen); + if ((res=fatput(first,0x0000,dp)) < 0) + return(res); + } + return(1); +} + +/* fatput + * Schreibt in alle FAT-Versionen fuer den Wert + * des Eintrages ent den Wert val. + * Liefert -1 bei Lesefehler + * und -2 bei Schreibfehler. + */ +fatput(ent,val,dp) +register unsigned ent,val; +register struct dosdisc *dp; +{ + register long fat=dp->fat1; + unsigned char b[2]; + int n; + + for (n = dp->fatnum; n >= 1; n--) { + if (dp->fatlen == 12) { + val &= 0x0fff; + lseek(dp->fd,fat+(long)(1.5*ent),0); + if (read(dp->fd,b,2) != 2) + return(-1); + lseek(dp->fd,(long)-2,1); + if (ent % 2 == 0) { + b[0] = val%256; + b[1] = (b[1]/16)*16+(val/256); + } + else { + b[1] = val/16; + b[0] = (val%16)*16+(b[0]&0x0f); + } + } + else { + lseek(dp->fd,fat+(long)(2*ent),0); + b[0] = val% 256; + b[1] = val/256; + } + if (write(dp->fd,b,2) != 2) + return(-2); + fat = (dp->maindir-fat)/n+fat; + } + return(1); +} diff --git a/WEGA/src/cmd/doscopy/dosfat.c b/WEGA/src/cmd/doscopy/dosfat.c new file mode 100644 index 0000000..04d1775 --- /dev/null +++ b/WEGA/src/cmd/doscopy/dosfat.c @@ -0,0 +1,65 @@ +/************************************************************************** +*************************************************************************** + + W E G A - Quelle (C) TU KMSt / ZFT/KEAW Abt. WAE - 1988 + Programm: dosfat.c + + Bearbeiter : P. Hoge + Datum : 24.11.89 + Version : 1.3 + +*************************************************************************** +**************************************************************************/ + +#include "dos.h" +#include + +/* fatfree + * Liefert die naechste freie Clusternummer + * auf dem Datentraeger dp. + * Liefert -1 bei Lesefehler und + * -3 falls die Disk voll ist + */ +fatfree(dp) +register struct dosdisc *dp; +{ + static long freeadr = 0; + static FILE *fp; + register unsigned nclust; + unsigned char n[3]; + + nclust = dp->nclust; + if (fp == 0) + fp = fdopen(dp->fd, "r"); + + if (dp->fatlen == 12) { + fseek(fp, dp->fat1+freeadr+3, 0); + while (nclust -= 2) { + if (fread(n, sizeof(*n),3,fp) != 3) + return (-1); + + if (n[0] == 0 && (n[1]&0x0f) == 0) { + freeadr = ftell(fp) - dp->fat1 - 3; + return(freeadr/1.5); + } + + if ((n[1]&0xf0) == 0 && n[2] == 0) { + freeadr = ftell(fp) - dp->fat1 - 3; + return(freeadr/1.5 + 1); + } + } + } + else { + fseek(fp, dp->fat1+freeadr+2, 0); + while (nclust--) { + if (fread(n,sizeof(*n),2,fp) != 2) + return(-1); + + if (n[0] == 0 && n[1] == 0) { + freeadr = ftell(fp) - dp->fat1 - 2; + return(freeadr/2); + } + } + } + return(-3); +}