Switch to unified set of error codes. Also, do more checks for 2IMG files.

This commit is contained in:
Stephen Heumann 2018-08-11 01:53:53 -05:00
parent ccc9594412
commit 610a638e5c
11 changed files with 112 additions and 72 deletions

View File

@ -11,7 +11,7 @@
#include "asmglue.h" #include "asmglue.h"
#include "version.h" #include "version.h"
#define TWO_IMG_MAGIC ('2' | 'I'<<8 | (LongWord)'M'<<16 | (LongWord)'G'<<24) #define BLOCK_SIZE 512
struct DIB dibs[NDIBS] = {0}; struct DIB dibs[NDIBS] = {0};
struct DIBList dibList = {NDIBS}; struct DIBList dibList = {NDIBS};
@ -192,20 +192,36 @@ Word DriverDispatch(Word callNum, struct GSOSDP *dp) {
} }
#pragma databank 0 #pragma databank 0
/*
static Word CheckTwoImg(Session *sess) { * Check for a 2IMG file, and process its header if one is found.
* Returns a non-zero error code for an invalid or unsupported 2IMG file,
* OPERATION_SUCCESSFUL otherwise (whether it's a 2IMG file or not).
*/
static enum NetDiskError CheckTwoImg(Session *sess) {
struct TwoImgHeader *hdr = &sess->fileHeader.twoImgHeader; struct TwoImgHeader *hdr = &sess->fileHeader.twoImgHeader;
/* Check if it's a 2IMG file */
if (hdr->twoImgID != TWO_IMG_MAGIC) if (hdr->twoImgID != TWO_IMG_MAGIC)
return 0; return OPERATION_SUCCESSFUL;
/* It's a 2IMG file, but is it one we can handle? */
if (hdr->version > 1)
return UNSUPPORTED_2IMG_FILE;
if (hdr->imgFormat != IMAGE_FORMAT_PRODOS_ORDER)
return UNSUPPORTED_2IMG_FILE;
if (hdr->dataLength % BLOCK_SIZE != 0)
return UNSUPPORTED_2IMG_FILE;
// TODO more checks // TODO more checks
sess->dataOffset = hdr->dataOffset; sess->dataOffset = hdr->dataOffset;
return 0; return OPERATION_SUCCESSFUL;
} }
static Word DoMountURL(struct GSOSDP *dp) { static Word DoMountURL(struct GSOSDP *dp) {
enum NetDiskError err;
if (dp->dibPointer->extendedDIBPtr != NULL) { if (dp->dibPointer->extendedDIBPtr != NULL) {
dp->transferCount = 0; dp->transferCount = 0;
return drvrBusy; return drvrBusy;
@ -217,16 +233,16 @@ static Word DoMountURL(struct GSOSDP *dp) {
return drvrNoResrc; return drvrNoResrc;
} }
enum SetURLResult setResult = SetURL(sess, (char*)dp->controlListPtr, TRUE, FALSE); err = SetURL(sess, (char*)dp->controlListPtr, TRUE, FALSE);
if (setResult != SETURL_SUCCESSFUL) { if (err != OPERATION_SUCCESSFUL) {
// TODO arrange for more detailed error reporting // TODO arrange for more detailed error reporting
EndNetDiskSession(sess); EndNetDiskSession(sess);
dp->transferCount = 0; dp->transferCount = 0;
return drvrIOError; return drvrIOError;
} }
enum RequestResult requestResult = DoHTTPRequest(sess, 0, sizeof(sess->fileHeader) - 1); err = DoHTTPRequest(sess, 0, sizeof(sess->fileHeader) - 1);
if (requestResult != REQUEST_SUCCESSFUL) { if (err != OPERATION_SUCCESSFUL) {
// TODO arrange for more detailed error reporting // TODO arrange for more detailed error reporting
EndNetDiskSession(sess); EndNetDiskSession(sess);
dp->transferCount = 0; dp->transferCount = 0;
@ -239,8 +255,8 @@ static Word DoMountURL(struct GSOSDP *dp) {
/* keep reading */ ; /* keep reading */ ;
//TODO detect errors //TODO detect errors
Word checkResult = CheckTwoImg(sess); err = CheckTwoImg(sess);
if (checkResult != 0) { if (err != OPERATION_SUCCESSFUL) {
EndNetDiskSession(sess); EndNetDiskSession(sess);
// TODO error // TODO error
} }
@ -265,8 +281,8 @@ static Word DoRead(struct GSOSDP *dp) {
unsigned long readStart = dp->blockNum * dp->blockSize + sess->dataOffset; unsigned long readStart = dp->blockNum * dp->blockSize + sess->dataOffset;
unsigned long readEnd = readStart + dp->requestCount - 1; unsigned long readEnd = readStart + dp->requestCount - 1;
enum RequestResult requestResult = DoHTTPRequest(sess, readStart, readEnd); enum NetDiskError err = DoHTTPRequest(sess, readStart, readEnd);
if (requestResult != REQUEST_SUCCESSFUL) { if (err != OPERATION_SUCCESSFUL) {
// TODO arrange for more detailed error reporting // TODO arrange for more detailed error reporting
dp->transferCount = 0; dp->transferCount = 0;
return drvrIOError; return drvrIOError;

8
http.c
View File

@ -90,13 +90,13 @@ Boolean BuildHTTPRequest(Session *sess, char *resourceStr) {
return TRUE; return TRUE;
} }
enum RequestResult enum NetDiskError
DoHTTPRequest(Session *sess, unsigned long start, unsigned long end) { DoHTTPRequest(Session *sess, unsigned long start, unsigned long end) {
top:; top:;
rlrBuff rlrBuff = {0}; rlrBuff rlrBuff = {0};
Word tcpError; Word tcpError;
Boolean wantRedirect = FALSE, gotRedirect = FALSE; Boolean wantRedirect = FALSE, gotRedirect = FALSE;
enum RequestResult result; enum NetDiskError result;
UpdateRequestRange(sess, start, end); UpdateRequestRange(sess, start, end);
@ -300,7 +300,7 @@ netRetry:
goto errorReturn; goto errorReturn;
if (wantRedirect) { if (wantRedirect) {
*endPtr = '\0'; *endPtr = '\0';
if (SetURL(sess, response, FALSE, TRUE) != SETURL_SUCCESSFUL) { if (SetURL(sess, response, FALSE, TRUE) != OPERATION_SUCCESSFUL) {
result = REDIRECT_ERROR; result = REDIRECT_ERROR;
goto errorReturn; goto errorReturn;
} }
@ -354,7 +354,7 @@ netRetry:
&& sess->contentLength != (sess->desiredEnd - sess->desiredStart + 1)) && sess->contentLength != (sess->desiredEnd - sess->desiredStart + 1))
goto errorReturn; goto errorReturn;
result = REQUEST_SUCCESSFUL; result = OPERATION_SUCCESSFUL;
DisposeHandle(rlrBuff.rlrBuffHandle); DisposeHandle(rlrBuff.rlrBuffHandle);
return result; return result;

16
http.h
View File

@ -3,21 +3,9 @@
#include <types.h> #include <types.h>
#include "session.h" #include "session.h"
#include "netdiskerror.h"
enum RequestResult {
REQUEST_SUCCESSFUL = 0,
NETWORK_ERROR,
NO_RESPONSE,
INVALID_RESPONSE,
EXCESSIVE_REDIRECTS,
UNSUPPORTED_RESPONSE,
UNSUPPORTED_HEADER_VALUE,
REDIRECT_ERROR,
NOT_DESIRED_CONTENT,
DIFFERENT_LENGTH, /* Might be considered successful later */
};
Boolean BuildHTTPRequest(Session *sess, char *resourceStr); Boolean BuildHTTPRequest(Session *sess, char *resourceStr);
enum RequestResult DoHTTPRequest(Session *sess, unsigned long start, unsigned long end); enum NetDiskError DoHTTPRequest(Session *sess, unsigned long start, unsigned long end);
#endif #endif

View File

@ -39,9 +39,9 @@ int main(int argc, char **argv) {
char *url = (argc > 1) ? argv[1] : defaultURL; char *url = (argc > 1) ? argv[1] : defaultURL;
enum SetURLResult result = SetURL(&sess, url, TRUE, FALSE); enum NetDiskError result = SetURL(&sess, url, TRUE, FALSE);
if (result != SETURL_SUCCESSFUL) { if (result != OPERATION_SUCCESSFUL) {
printf("SetURL error %i\n", (int)result); printf("SetURL error %i\n", (int)result);
goto exit; goto exit;
} }
@ -62,12 +62,12 @@ int main(int argc, char **argv) {
printf("=========\n"); printf("=========\n");
printf("\n"); printf("\n");
enum RequestResult requestResult; enum NetDiskError requestResult;
requestResult = DoHTTPRequest(&sess, startByte, startByte + 511); requestResult = DoHTTPRequest(&sess, startByte, startByte + 511);
printf("RequestResult %i\n", requestResult); printf("RequestResult %i\n", requestResult);
printf("Response code %lu\n", sess.responseCode); printf("Response code %lu\n", sess.responseCode);
if (requestResult == REQUEST_SUCCESSFUL) { if (requestResult == OPERATION_SUCCESSFUL) {
printf("rangeStart = %lu\n", sess.rangeStart); printf("rangeStart = %lu\n", sess.rangeStart);
printf("rangeEnd = %lu\n", sess.rangeEnd); printf("rangeEnd = %lu\n", sess.rangeEnd);
printf("totalLength = %lu\n", sess.totalLength); printf("totalLength = %lu\n", sess.totalLength);
@ -87,7 +87,7 @@ int main(int argc, char **argv) {
printf("RequestResult %i\n", requestResult); printf("RequestResult %i\n", requestResult);
printf("Response code %lu\n", sess.responseCode); printf("Response code %lu\n", sess.responseCode);
if (requestResult == REQUEST_SUCCESSFUL) { if (requestResult == OPERATION_SUCCESSFUL) {
printf("rangeStart = %lu\n", sess.rangeStart); printf("rangeStart = %lu\n", sess.rangeStart);
printf("rangeEnd = %lu\n", sess.rangeEnd); printf("rangeEnd = %lu\n", sess.rangeEnd);
printf("totalLength = %lu\n", sess.totalLength); printf("totalLength = %lu\n", sess.totalLength);

37
netdiskerror.h Normal file
View File

@ -0,0 +1,37 @@
#ifndef NETDISKERROR_H
#define NETDISKERROR_H
enum NetDiskError {
OPERATION_SUCCESSFUL = 0,
/* SetURL errors */
URL_TOO_LONG = 100,
INVALID_CHARACTER_IN_URL,
BAD_URL_SYNTAX,
UNSUPPORTED_URL_SCHEME,
AUTHENTICATION_NOT_SUPPORTED,
FRAGMENT_NOT_SUPPORTED,
INVALID_PORT_NUMBER,
NO_HOST_SPECIFIED,
IPV6_NOT_SUPPORTED,
HOSTNAME_TOO_LONG,
NAME_LOOKUP_FAILED,
OUT_OF_MEMORY,
/* StartTCPConnection and DoHTTPRequest errors */
NETWORK_ERROR = 200,
NO_RESPONSE,
INVALID_RESPONSE,
EXCESSIVE_REDIRECTS,
UNSUPPORTED_RESPONSE,
UNSUPPORTED_HEADER_VALUE,
REDIRECT_ERROR,
NOT_DESIRED_CONTENT,
DIFFERENT_LENGTH, /* Might be considered successful later */
/* File format errors */
UNSUPPORTED_2IMG_FILE = 300,
};
#endif

View File

@ -2,18 +2,7 @@
#define SESSION_H #define SESSION_H
#include <types.h> #include <types.h>
#include "twoimg.h"
struct TwoImgHeader {
LongWord twoImgID;
LongWord appTag;
Word headerLength;
Word version;
LongWord imgFormat;
LongWord flag;
LongWord nBlocks;
LongWord dataOffset;
LongWord dataLength;
};
typedef struct Session { typedef struct Session {
/* Marinetti TCP connection status */ /* Marinetti TCP connection status */

View File

@ -18,7 +18,7 @@
#define MAX_URL_LENGTH 30000 #define MAX_URL_LENGTH 30000
enum SetURLResult enum NetDiskError
SetURL(Session *sess, char *url, Boolean permissive, Boolean partialOK) { SetURL(Session *sess, char *url, Boolean permissive, Boolean partialOK) {
if (strlen(url) > MAX_URL_LENGTH) { if (strlen(url) > MAX_URL_LENGTH) {
return URL_TOO_LONG; return URL_TOO_LONG;
@ -95,5 +95,5 @@ SetURL(Session *sess, char *url, Boolean permissive, Boolean partialOK) {
/* End any existing TCP connection to old URL */ /* End any existing TCP connection to old URL */
EndTCPConnection(sess); EndTCPConnection(sess);
return SETURL_SUCCESSFUL; return OPERATION_SUCCESSFUL;
} }

View File

@ -1,23 +1,9 @@
#ifndef SETURL_H #ifndef SETURL_H
#define SETURL_H #define SETURL_H
enum SetURLResult { #include "netdiskerror.h"
SETURL_SUCCESSFUL = 0,
URL_TOO_LONG,
INVALID_CHARACTER_IN_URL,
BAD_URL_SYNTAX,
UNSUPPORTED_URL_SCHEME,
AUTHENTICATION_NOT_SUPPORTED,
FRAGMENT_NOT_SUPPORTED,
INVALID_PORT_NUMBER,
NO_HOST_SPECIFIED,
IPV6_NOT_SUPPORTED,
HOSTNAME_TOO_LONG,
NAME_LOOKUP_FAILED,
OUT_OF_MEMORY
};
enum SetURLResult enum NetDiskError
SetURL(Session *sess, char *url, Boolean permissive, Boolean partialOK); SetURL(Session *sess, char *url, Boolean permissive, Boolean partialOK);
#endif #endif

View File

@ -15,7 +15,7 @@
* On success, returns 0 and sets sess->ipid. * On success, returns 0 and sets sess->ipid.
* On failure, returns an error code. * On failure, returns an error code.
*/ */
Word StartTCPConnection(Session *sess) { enum NetDiskError StartTCPConnection(Session *sess) {
Word tcperr; Word tcperr;
srBuff mySRBuff; srBuff mySRBuff;
LongWord initialTime; LongWord initialTime;
@ -26,15 +26,15 @@ Word StartTCPConnection(Session *sess) {
sess->ipid = sess->ipid =
TCPIPLogin(userid(), sess->ipAddr, sess->port, 0, 0x40); TCPIPLogin(userid(), sess->ipAddr, sess->port, 0, 0x40);
if (toolerror()) if (toolerror())
return NETWORK_ERR; return NETWORK_ERROR;
tcperr = TCPIPOpenTCP(sess->ipid); tcperr = TCPIPOpenTCP(sess->ipid);
if (toolerror()) { if (toolerror()) {
TCPIPLogout(sess->ipid); TCPIPLogout(sess->ipid);
return NETWORK_ERR; return NETWORK_ERROR;
} else if (tcperr != tcperrOK) { } else if (tcperr != tcperrOK) {
TCPIPLogout(sess->ipid); TCPIPLogout(sess->ipid);
return NO_RESP_ERR; return NO_RESPONSE;
} }
initialTime = GetTick(); initialTime = GetTick();
@ -45,7 +45,7 @@ Word StartTCPConnection(Session *sess) {
if (mySRBuff.srState != TCPSESTABLISHED) { if (mySRBuff.srState != TCPSESTABLISHED) {
TCPIPAbortTCP(sess->ipid); TCPIPAbortTCP(sess->ipid);
TCPIPLogout(sess->ipid); TCPIPLogout(sess->ipid);
return NO_RESP_ERR; return NO_RESPONSE;
} }
sess->tcpLoggedIn = TRUE; sess->tcpLoggedIn = TRUE;

View File

@ -2,8 +2,9 @@
#define TCPCONNECTION_H #define TCPCONNECTION_H
#include "session.h" #include "session.h"
#include "netdiskerror.h"
Word StartTCPConnection(Session *sess); enum NetDiskError StartTCPConnection(Session *sess);
void EndTCPConnection(Session *sess); void EndTCPConnection(Session *sess);
#endif #endif

23
twoimg.h Normal file
View File

@ -0,0 +1,23 @@
#ifndef TWOIMG_H
#define TWOIMG_H
#define TWO_IMG_MAGIC ('2' | 'I'<<8 | (LongWord)'M'<<16 | (LongWord)'G'<<24)
#define IMAGE_FORMAT_DOS_33_ORDER 0
#define IMAGE_FORMAT_PRODOS_ORDER 1
#define IMAGE_FORMAT_NIBBLIZED 2
struct TwoImgHeader {
LongWord twoImgID;
LongWord appTag;
Word headerLength;
Word version;
LongWord imgFormat;
LongWord flag;
LongWord nBlocks;
LongWord dataOffset;
LongWord dataLength;
/* Remaining header fields are unimportant for us */
};
#endif