new
This commit is contained in:
parent
47686fbb09
commit
d601096349
|
|
@ -0,0 +1,305 @@
|
||||||
|
/**************************************************************************
|
||||||
|
***************************************************************************
|
||||||
|
|
||||||
|
W E G A - Quelle (C) TU KMSt / ZFT/KEAW Abt. WAE - 1988
|
||||||
|
Programm: dosin.c
|
||||||
|
|
||||||
|
Bearbeiter : P. Hoge
|
||||||
|
Datum : 24.11.89
|
||||||
|
Version : 1.3
|
||||||
|
|
||||||
|
***************************************************************************
|
||||||
|
**************************************************************************/
|
||||||
|
|
||||||
|
#include "dos.h"
|
||||||
|
#include <time.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
/* dosin
|
||||||
|
* Schreibt das WEGA-File 'in' auf den
|
||||||
|
* Datentraeger dp unter dem Namen fn.
|
||||||
|
* Ist fn schon vorhanden wird die alte
|
||||||
|
* Version geloescht.
|
||||||
|
* Liefert 0 falls das uebergeordnete
|
||||||
|
* Verzeichnis nicht existiert,
|
||||||
|
* -1 bei Lesefehler,
|
||||||
|
* -2 bei Schreibfehler und
|
||||||
|
* -3 falls fn ein Verzeichnis oder
|
||||||
|
* schreibgeschuetzt ist.
|
||||||
|
* -4 Lesefehler in wega
|
||||||
|
*/
|
||||||
|
dosin(in, fn, dp, conv)
|
||||||
|
char *in, *fn;
|
||||||
|
register struct dosdisc *dp;
|
||||||
|
int conv;
|
||||||
|
{
|
||||||
|
register clustsiz = dp->clustsiz;
|
||||||
|
register i, j, res;
|
||||||
|
int infd, len, nl, mode, z;
|
||||||
|
long adr, depos;
|
||||||
|
int free, follow;
|
||||||
|
unsigned dnum, nxt, dosnxt();
|
||||||
|
int dmax, dcnt = 0;
|
||||||
|
struct stat instat;
|
||||||
|
struct dostat fnrec, dirrec;
|
||||||
|
struct tm *sttime, *localtime();
|
||||||
|
char *p, *file, s[LMAX];
|
||||||
|
char *strchr(), *strrchr();
|
||||||
|
char *buf, *outbuf, *malloc();
|
||||||
|
|
||||||
|
buf = malloc(clustsiz);
|
||||||
|
outbuf = buf;
|
||||||
|
if (conv)
|
||||||
|
outbuf = malloc(clustsiz);
|
||||||
|
|
||||||
|
strcpy(s, fn);
|
||||||
|
fn = s;
|
||||||
|
z = 1;
|
||||||
|
if ((res = dosopn(fn, dp, &fnrec)) < 0)
|
||||||
|
return(res);
|
||||||
|
|
||||||
|
/* Das DCP-File wird geloescht, falls es bereits existiert */
|
||||||
|
if (res > 0) {
|
||||||
|
if ((res = dosdel(fn, dp)) < 1)
|
||||||
|
return(res);
|
||||||
|
}
|
||||||
|
if ((file=strrchr(fn, '/')) == 0) { /* main directory */
|
||||||
|
file = fn;
|
||||||
|
dmax = 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);
|
||||||
|
if (dirrec.mode != _SDIR)
|
||||||
|
return(0);
|
||||||
|
adr = DOSADR(dirrec.first, clustsiz) + dp->data;
|
||||||
|
/* Bestimmen der Anzahl von Verzeichniseintraegen */
|
||||||
|
nxt = dirrec.first;
|
||||||
|
while ((nxt = dosnxt(dp->fd, nxt, dp->fat1, dp->fatlen)) > 0)
|
||||||
|
z++;
|
||||||
|
dnum = clustsiz / 32;
|
||||||
|
dmax = z * dnum;
|
||||||
|
nxt = dirrec.first;
|
||||||
|
}
|
||||||
|
lseek(dp->fd, adr, 0);
|
||||||
|
/* Suche des ersten freien Eintrages */
|
||||||
|
for (i = 0; i < z; i++) {
|
||||||
|
j = 1;
|
||||||
|
while (j++ <= dnum && (res = getde(dp->fd, &fnrec)) > 0) {
|
||||||
|
dcnt++;
|
||||||
|
if (fnrec.name[0] == 0xe5) {
|
||||||
|
i = z;
|
||||||
|
depos = lseek(dp->fd, (long)-32, 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (res == 0) {
|
||||||
|
depos = lseek(dp->fd, (long)-32, 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (nxt != 0) {
|
||||||
|
nxt = dosnxt(dp->fd, nxt, dp->fat1, dp->fatlen);
|
||||||
|
if (nxt < 1)
|
||||||
|
break;
|
||||||
|
else { /* Naechsten Cluster lesen */
|
||||||
|
adr = DOSADR(nxt, clustsiz) + dp->data;
|
||||||
|
lseek(dp->fd, adr, 0);
|
||||||
|
dirrec.first = nxt;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (res < 0)
|
||||||
|
return(res);
|
||||||
|
if (fn == file && dcnt >= dmax)
|
||||||
|
return(-2); /* Stammverzeichnis voll */
|
||||||
|
if (dcnt >= dmax) { /* Verzeichniscluster voll */
|
||||||
|
if ((free = fatfree(dp)) < 0)
|
||||||
|
return(free);
|
||||||
|
if ((res = fatput(dirrec.first, free, dp)) < 0)
|
||||||
|
return(res);
|
||||||
|
if ((res = fatput(free, 0xffff, dp)) < 0)
|
||||||
|
return(res);
|
||||||
|
adr = DOSADR(free, clustsiz) + dp->data;
|
||||||
|
|
||||||
|
for (i = 0; i < 512; i++)
|
||||||
|
buf[i] = 0x00;
|
||||||
|
lseek(dp->fd, adr, 0);
|
||||||
|
z = clustsiz / 512;
|
||||||
|
for (i = 0; i < z; i++)
|
||||||
|
if (write(dp->fd, buf, 512) != 512)
|
||||||
|
return(-2);
|
||||||
|
/* depos zeigt auf den zu belegenden Eintrag */
|
||||||
|
depos = lseek(dp->fd, adr, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Oeffnen des WEGA-Files */
|
||||||
|
if ((infd = open(in, 0)) < 0)
|
||||||
|
return(-4);
|
||||||
|
if (fstat(infd, &instat) < 0)
|
||||||
|
return(-4);
|
||||||
|
mode = instat.st_mode;
|
||||||
|
if ((mode & S_IFMT) == S_IFDIR)
|
||||||
|
return(-4);
|
||||||
|
|
||||||
|
/* fnrec wird mit Werten von infd belegt */
|
||||||
|
if ((p = strchr(file, '.')) != 0) {
|
||||||
|
p++;
|
||||||
|
file[strlen(file) - strlen(p) - 1] = '\0';
|
||||||
|
for (i = 0; i < 8; i++)
|
||||||
|
if (i >= strlen(file))
|
||||||
|
fnrec.name[i] = 0x20;
|
||||||
|
else
|
||||||
|
fnrec.name[i] = file[i];
|
||||||
|
|
||||||
|
for (i = 8; i < 11; i++)
|
||||||
|
if (i - 7 > strlen(p))
|
||||||
|
fnrec.name[i] = 0x20;
|
||||||
|
else
|
||||||
|
fnrec.name[i] = p[i - 8];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
for (i = 0; i < 11; i++)
|
||||||
|
if (i >= strlen(file) || i > 7)
|
||||||
|
fnrec.name[i] = 0x20;
|
||||||
|
else
|
||||||
|
fnrec.name[i] = file[i];
|
||||||
|
}
|
||||||
|
fnrec.mode = _FILE;
|
||||||
|
fnrec.flag = RW;
|
||||||
|
sttime = localtime(&(instat.st_mtime));
|
||||||
|
|
||||||
|
fnrec.time.sec = sttime->tm_sec;
|
||||||
|
fnrec.time.min = sttime->tm_min;
|
||||||
|
fnrec.time.hour = sttime->tm_hour;
|
||||||
|
|
||||||
|
fnrec.date.day = sttime->tm_mday;
|
||||||
|
fnrec.date.month = sttime->tm_mon + 1;
|
||||||
|
fnrec.date.year = sttime->tm_year;
|
||||||
|
free = fatfree(dp);
|
||||||
|
if (free < 0)
|
||||||
|
return(free);
|
||||||
|
fnrec.first = free;
|
||||||
|
fatput(free, 0xffff, dp);
|
||||||
|
fnrec.dim = instat.st_size;
|
||||||
|
|
||||||
|
/* Uebertragen der Daten */
|
||||||
|
adr = DOSADR(free, clustsiz) + dp->data;
|
||||||
|
lseek(dp->fd, adr, 0);
|
||||||
|
|
||||||
|
j = nl = 0;
|
||||||
|
|
||||||
|
while ((len = read(infd, buf, clustsiz)) > 0) {
|
||||||
|
if (conv) { /* ASCII-Copy */
|
||||||
|
|
||||||
|
for (i = 0; i < len; i++) {
|
||||||
|
if (buf[i] == 0x0a) { /* CR einfuegen */
|
||||||
|
outbuf[j++] = 0x0d;
|
||||||
|
fnrec.dim++;
|
||||||
|
nl++;
|
||||||
|
}
|
||||||
|
if (nl == 0)
|
||||||
|
lf:
|
||||||
|
outbuf[j++] = buf[i];
|
||||||
|
if (j == clustsiz) {
|
||||||
|
j = 0;
|
||||||
|
if (write(dp->fd, outbuf, clustsiz) != clustsiz) {
|
||||||
|
fatdel(&fnrec, dp);
|
||||||
|
return(-2);
|
||||||
|
}
|
||||||
|
if ((follow = fatfree(dp)) < 0) {
|
||||||
|
fatdel(&fnrec, dp);
|
||||||
|
return(follow);
|
||||||
|
}
|
||||||
|
fatput(free, follow, dp);
|
||||||
|
fatput(follow, 0xffff, dp);
|
||||||
|
free = follow;
|
||||||
|
adr = DOSADR(free, clustsiz)+dp->data;
|
||||||
|
lseek(dp->fd, adr, 0);
|
||||||
|
}
|
||||||
|
if (nl) {
|
||||||
|
nl = 0;
|
||||||
|
goto lf;
|
||||||
|
}
|
||||||
|
} /* for */
|
||||||
|
} else { /* Binary Copy */
|
||||||
|
if (len != clustsiz) {
|
||||||
|
j = len;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (write(dp->fd, outbuf, clustsiz) != clustsiz) {
|
||||||
|
fatdel(&fnrec, dp);
|
||||||
|
return(-2);
|
||||||
|
}
|
||||||
|
if ((follow = fatfree(dp)) < 0) {
|
||||||
|
fatdel(&fnrec, dp);
|
||||||
|
return(follow);
|
||||||
|
}
|
||||||
|
fatput(free, follow, dp);
|
||||||
|
fatput(follow, 0xffff, dp);
|
||||||
|
free = follow;
|
||||||
|
adr = DOSADR(free, clustsiz)+dp->data;
|
||||||
|
lseek(dp->fd, adr, 0);
|
||||||
|
}
|
||||||
|
} /* while */
|
||||||
|
if (len < 0) {
|
||||||
|
fatdel(&fnrec, dp);
|
||||||
|
return(-4);
|
||||||
|
}
|
||||||
|
if (j)
|
||||||
|
if (write(dp->fd, outbuf, j) != j) {
|
||||||
|
fatdel(&fnrec, dp);
|
||||||
|
return(-2);
|
||||||
|
}
|
||||||
|
close(infd);
|
||||||
|
|
||||||
|
/* Schreiben eines Verzeichniseintrages */
|
||||||
|
lseek(dp->fd, depos, 0);
|
||||||
|
if (putde(&fnrec, dp) < 0) {
|
||||||
|
fatdel(&fnrec, dp);
|
||||||
|
return(-2);
|
||||||
|
}
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* putde
|
||||||
|
* Schreibt fuer das File stp auf dem
|
||||||
|
* Datentraeger dp einen 32-Byte
|
||||||
|
* Verzeichniseintrag.
|
||||||
|
* Liefert -2 bei Schreibfehler.
|
||||||
|
*/
|
||||||
|
putde(stp, dp)
|
||||||
|
register struct dostat *stp;
|
||||||
|
register struct dosdisc *dp;
|
||||||
|
{
|
||||||
|
register i;
|
||||||
|
register unsigned tv;
|
||||||
|
unsigned char buf[32];
|
||||||
|
|
||||||
|
for (i = 0; i < 11; i++)
|
||||||
|
buf[i] = stp->name[i];
|
||||||
|
buf[11] = 0x20; /* Attribut */
|
||||||
|
for (i = 12; i < 22; i++)
|
||||||
|
buf[i] = '\0';
|
||||||
|
|
||||||
|
tv = stp->time.hour * 2045 + stp->time.min * 32 + stp->time.sec / 2;
|
||||||
|
buf[22] = tv % 256;
|
||||||
|
buf[23] = tv / 256;
|
||||||
|
tv = (stp->date.year - 80) * 512 + stp->date.month * 32 + stp->date.day;
|
||||||
|
buf[24] = tv % 256;
|
||||||
|
buf[25] = tv / 256;
|
||||||
|
buf[26] = stp->first % 256;
|
||||||
|
buf[27] = stp->first / 256;
|
||||||
|
buf[28] = stp->dim % 256;
|
||||||
|
buf[29] = (stp->dim % 65536) / 256;
|
||||||
|
buf[30] = (stp->dim % 16777216) / 65536;
|
||||||
|
buf[31] = stp->dim / 16777216;
|
||||||
|
if (write(dp->fd, buf, 32) != 32)
|
||||||
|
return(-2);
|
||||||
|
return(1);
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue