This commit is contained in:
Oliver Lehmann 1989-11-30 14:22:37 +00:00
parent f56acf8081
commit 0d5cefdaee
1 changed files with 88 additions and 0 deletions

View File

@ -0,0 +1,88 @@
/**************************************************************************
***************************************************************************
W E G A - Quelle (C) TU KMSt / ZFT/KEAW Abt. WAE - 1988
Programm: dosdev.c
Bearbeiter : P. Hoge
Datum : 24.11.89
Version : 1.3
***************************************************************************
**************************************************************************/
/* Bereitstellen von DCP-Disk Informationen */
#include "dos.h"
#include <signal.h>
/* dosdev() oeffnet DCP-Geraetefiles und
* belegt Struktur dosdisc mit gueltigen Werten
*/
dosdev(fn,mode,dp)
char *fn;
int mode;
register struct dosdisc *dp;
{
register int i, bps, fat=0;
unsigned long off=0;
unsigned char b[17]; /* Boot-Record-Informationen */
if ((dp->fd=open(fn,mode)) < 0)
return(-1);
if (mode) { /* nicht read only */
signal(SIGALRM, SIG_IGN);
signal(SIGHUP, SIG_IGN);
signal(SIGINT, SIG_IGN);
signal(SIGQUIT, SIG_IGN);
signal(SIGTERM, SIG_IGN);
}
/* Ermitteln ob Floppy oder Harddisk */
lseek(dp->fd,(long)0,0);
if (read(dp->fd,b,1) != 1)
return(-1);
if (b[0] != 0xeb) { /* Harddisk */
lseek(dp->fd,(long)0x1be,0);
i = 4;
while (i--) {
if (read(dp->fd,b,16) != 16)
return(-1);
if (b[4] == 1) { /* DCP-Partion */
fat = 12;
break;
}
if (b[4] == 4) {
fat = 16;
break;
}
}
if (fat == 0)
return(-1);
off = ((b[9]*256) + b[8]) * 512;
}
lseek(dp->fd,off+11,0);
if (read(dp->fd,b,17) != 17)
return(-1);
bps = b[1]*256+b[0];
dp->fat1 = (b[4]*256+b[3])*bps + off;
dp->fatnum = b[5];
dp->maindir = off + ((b[4]*256+b[3]) + (b[12]*256+b[11]) * dp->fatnum) * bps;
dp->dirnum = b[7]*256+b[6];
dp->data = dp->maindir+(dp->dirnum * 32);
dp->clustsiz = b[2] * bps;
dp->vol = b[9]*256 + b[8];
dp->nclust = ((long)dp->vol*bps - dp->data + off) / dp->clustsiz;
if (fat == 0) {
if (dp->nclust > 4095)
fat = 16;
else
fat = 12;
}
dp->fatlen = fat;
return(0);
}