mirror of
https://github.com/sheumann/NetDisk.git
synced 2025-04-12 08:37:01 +00:00
Add basic support for 2img format.
This commit is contained in:
parent
d718d82ff1
commit
2670da4f59
28
driver.c
28
driver.c
@ -7,8 +7,11 @@
|
||||
#include "seturl.h"
|
||||
#include "http.h"
|
||||
#include "readtcp.h"
|
||||
#include "asmglue.h"
|
||||
#include "version.h"
|
||||
|
||||
#define TWO_IMG_MAGIC ('2' | 'I'<<8 | (LongWord)'M'<<16 | (LongWord)'G'<<24)
|
||||
|
||||
struct DIB dibs[NDIBS] = {0};
|
||||
struct DIBList dibList = {NDIBS};
|
||||
|
||||
@ -47,6 +50,7 @@ void InitDIBs(void) {
|
||||
|
||||
#pragma databank 1
|
||||
Word DriverDispatch(Word callNum, struct GSOSDP *dp) {
|
||||
Word stateReg = ForceRomIn();
|
||||
Word retVal = 0;
|
||||
|
||||
switch (callNum) {
|
||||
@ -182,11 +186,24 @@ Word DriverDispatch(Word callNum, struct GSOSDP *dp) {
|
||||
break;
|
||||
}
|
||||
|
||||
RestoreStateReg(stateReg);
|
||||
return retVal;
|
||||
}
|
||||
#pragma databank 0
|
||||
|
||||
|
||||
static Word CheckTwoImg(Session *sess) {
|
||||
struct TwoImgHeader *hdr = &sess->fileHeader.twoImgHeader;
|
||||
if (hdr->twoImgID != TWO_IMG_MAGIC)
|
||||
return 0;
|
||||
|
||||
// TODO more checks
|
||||
|
||||
sess->dataOffset = hdr->dataOffset;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static Word DoMountURL(struct GSOSDP *dp) {
|
||||
if (dp->dibPointer->extendedDIBPtr != NULL) {
|
||||
dp->transferCount = 0;
|
||||
@ -207,20 +224,23 @@ static Word DoMountURL(struct GSOSDP *dp) {
|
||||
return drvrIOError;
|
||||
}
|
||||
|
||||
enum RequestResult requestResult = DoHTTPRequest(sess, 0, sizeof(sess->fileHeaderBuf) - 1);
|
||||
enum RequestResult requestResult = DoHTTPRequest(sess, 0, sizeof(sess->fileHeader) - 1);
|
||||
if (requestResult != REQUEST_SUCCESSFUL) {
|
||||
// TODO arrange for more detailed error reporting
|
||||
dp->transferCount = 0;
|
||||
return drvrIOError;
|
||||
}
|
||||
|
||||
InitReadTCP(sess, sizeof(sess->fileHeaderBuf), &sess->fileHeaderBuf);
|
||||
InitReadTCP(sess, sizeof(sess->fileHeader.buf), &sess->fileHeader.buf);
|
||||
while (TryReadTCP(sess) == rsWaiting)
|
||||
// TODO timeout
|
||||
/* keep reading */ ;
|
||||
//TODO detect errors
|
||||
|
||||
//TODO detect 2mg
|
||||
Word checkResult = CheckTwoImg(sess);
|
||||
if (checkResult != 0) {
|
||||
// TODO error
|
||||
}
|
||||
|
||||
//TODO report disk switch
|
||||
|
||||
@ -237,7 +257,7 @@ static Word DoRead(struct GSOSDP *dp) {
|
||||
//TODO check size is multiple of a block
|
||||
//TODO disk-switched logic
|
||||
|
||||
unsigned long readStart = dp->blockNum * dp->blockSize;
|
||||
unsigned long readStart = dp->blockNum * dp->blockSize + sess->dataOffset;
|
||||
unsigned long readEnd = readStart + dp->requestCount - 1;
|
||||
|
||||
enum RequestResult requestResult = DoHTTPRequest(sess, readStart, readEnd);
|
||||
|
20
session.h
20
session.h
@ -3,6 +3,18 @@
|
||||
|
||||
#include <types.h>
|
||||
|
||||
struct TwoImgHeader {
|
||||
LongWord twoImgID;
|
||||
LongWord appTag;
|
||||
Word headerLength;
|
||||
Word version;
|
||||
LongWord imgFormat;
|
||||
LongWord flag;
|
||||
LongWord nBlocks;
|
||||
LongWord dataOffset;
|
||||
LongWord dataLength;
|
||||
};
|
||||
|
||||
typedef struct Session {
|
||||
/* Marinetti TCP connection status */
|
||||
Word ipid;
|
||||
@ -48,8 +60,14 @@ typedef struct Session {
|
||||
/* Expected length of disk image */
|
||||
LongWord expectedLength;
|
||||
|
||||
/* Offset of disk image blocks within file */
|
||||
LongWord dataOffset;
|
||||
|
||||
/* Buffer for initial bytes of file (which may be a disk image header) */
|
||||
unsigned char fileHeaderBuf[32];
|
||||
union {
|
||||
unsigned char buf[32];
|
||||
struct TwoImgHeader twoImgHeader;
|
||||
} fileHeader;
|
||||
} Session;
|
||||
|
||||
#endif
|
||||
|
Loading…
x
Reference in New Issue
Block a user