home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The Fred Fish Collection 1.5
/
ffcollection-1-5-1992-11.iso
/
ff_disks
/
200-299
/
ff236.lzh
/
DiskHandler
/
main.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-08-09
|
10KB
|
243 lines
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* |_o_o|\\ Copyright (c) 1988 The Software Distillery. All Rights Reserved */
/* |. o.| || This program may not be distributed without the permission of */
/* | . | || the authors: BBS: (919) 481-6436 */
/* | o | || John Toebes John Mainwaring Jim Cooper */
/* | . |// Bruce Drake Gordon Keener Dave Baker */
/* ====== */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
#include "handler.h"
/******************************************************************************/
/******************************************************************************/
/********************* Dispatch table to handle all packets *******************/
/******************************************************************************/
/******************************************************************************/
#define BP1 1
#define BP2 2
#define BP3 4
#define BP4 8
typedef void (*ifuncp)(GLOBAL, struct DosPacket *);
struct LookupTable
{
ifuncp subr;
int flags;
};
#define LO_FIRST 0
#define LO_LAST 34
struct LookupTable lowork[LO_LAST+1] = {
{ NULL, 0 | 0 | 0 | 0 }, /* 0 - ACTION_NIL */
{ NULL, 0 | 0 | 0 | 0 }, /* 1 - Unknown */
{ NULL, BP1| BP2| BP3| 0 }, /* 2 - ACTION_GET_BLOCK */
{ NULL, 0 | BP2| BP3| 0 }, /* 3 - Unknown */
{ NULL, BP1| BP2| BP3| 0 }, /* 4 - ACTION_SET_MAP */
{ ActDie, 0 | 0 | 0 | 0 }, /* 5 - ACTION_DIE */
{ NULL, 0 | 0 | 0 | 0 }, /* 6 - ACTION_EVENT */
{ ActCurentVol, BP1| 0 | 0 | 0 }, /* 7 - ACTION_CURRENT_VOLUME */
{ ActLock, BP1| BP2| 0 | 0 }, /* 8 - ACTION_LOCATE_OBJECT */
{ ActRenameDisk, BP1| BP2| 0 | 0 }, /* 9 - ACTION_RENAME_DISK */
{ NULL, 0 | 0 | 0 | 0 }, /* 10 - Unknown */
{ NULL, 0 | 0 | 0 | 0 }, /* 11 - Unknown */
{ NULL, 0 | 0 | 0 | 0 }, /* 12 - Unknown */
{ NULL, 0 | 0 | 0 | 0 }, /* 13 - Unknown */
{ NULL, 0 | 0 | 0 | 0 }, /* 14 - Unknown */
{ ActUnLock, BP1| 0 | 0 | 0 }, /* 15 - ACTION_FREE_LOCK */
{ ActDelete, BP1| BP2| 0 | 0 }, /* 16 - ACTION_DELETE_OBJECT */
{ ActRename, BP1| BP2| BP3| BP4 }, /* 17 - ACTION_RENAME_OBJECT */
{ NULL, 0 | 0 | 0 | 0 }, /* 18 - ACTION_MORE_CACHE */
{ ActDupLock, BP1| 0 | 0 | 0 }, /* 19 - ACTION_COPY_DIR */
{ NULL, 0 | 0 | 0 | 0 }, /* 20 - ACTION_WAIT_CHAR */
{ ActSetProtection, 0 | BP2| BP3| 0 }, /* 21 - ACTION_SET_PROTECT */
{ ActCreateDir, BP1| BP2| 0 | 0 }, /* 22 - ACTION_CREATE_DIR */
{ ActExamine, BP1| BP2| 0 | 0 }, /* 23 - ACTION_EXAMINE_OBJECT */
{ ActExNext, BP1| BP2| 0 | 0 }, /* 24 - ACTION_EXAMINE_NEXT */
{ ActDiskInfo, BP1| 0 | 0 | 0 }, /* 25 - ACTION_DISK_INFO */
{ ActInfo, BP1| BP2| 0 | 0 }, /* 26 - ACTION_INFO */
{ ActFlush, 0 | 0 | 0 | 0 }, /* 27 - ACTION_FLUSH */
{ ActSetComment, 0 | BP2| BP3| BP4 }, /* 28 - ACTION_SET_COMMENT */
{ ActParent, BP1| 0 | 0 | 0 }, /* 29 - ACTION_PARENT */
{ ActTimer, BP1| 0 | 0 | 0 }, /* 30 - ACTION_TIMER */
{ ActInhibit, 0 | 0 | 0 | 0 }, /* 31 - ACTION_INHIBIT */
{ NULL, BP1| 0 | 0 | 0 }, /* 32 - ACTION_DISK_TYPE */
{ NULL, 0 | 0 | 0 | 0 }, /* 33 - ACTION_DISK_CHANGE */
{ NULL, 0 | 0 | 0 | 0 } /* 34 - ACTION_SET_FILE_DATE */
};
#define HI_FIRST 1004
#define HI_LAST 1008
struct LookupTable hiwork[5] = {
{ ActFindwrite, BP1| BP2| BP3| 0 }, /* ACTION_FIND_WRITE - 1004 */
{ ActFindin, BP1| BP2| BP3| 0 }, /* ACTION_FIND_INPUT - 1005 */
{ ActFindout, BP1| BP2| BP3| 0 }, /* ACTION_FIND_OUTPUT - 1006 */
{ ActEnd, 0 | 0 | 0 | 0 }, /* ACTION_END - 1007 */
{ ActSeek, 0 | 0 | 0 | 0 } /* ACTION_SEEK - 1008 */
};
struct DosLibrary *DOSBase;
void __saveds handler()
{
struct DosPacket *mypkt; /* a pointer to the dos packet sent */
int action;
ifuncp subr;
int flags;
struct global global;
DOSBase = (struct DosLibrary *)OpenLibrary(DOSNAME,0);
/* Initialize our global data structure */
memset((char *)&global, 0, sizeof(struct global));
global.self = (struct Process *) FindTask(0L); /* find myself */
global.run = 1;
global.port = &(global.self->pr_MsgPort);
/* install our taskid ... */
/* Initialize the intuitext structures for the requesters we might have */
/* to display */
/* Because we have no scruples we can cheat and do this with a couple of */
/* long word assignments. We leave the acual C code commented out here */
/* so that if this structure ever changed we will still be able to work */
#if 0
global.line1.FrontPen = global.line1.BackPen = -1;
global.line1.DrawMode = JAM1;
global.line1.LeftEdge = global.line1.TopEdge = 4;
global.line2 = global.line1;
global.line3 = global.line1;
global.retrytxt = global.line1;
global.canceltxt = global.line1;
#else
*(long *)&global.line1.FrontPen = 0x00010000L | (JAM1<<8);
*(long *)&global.line1.LeftEdge = 0x00040004L; /* 4,4 */
*(long *)&global.line2.FrontPen = 0x00010000L | (JAM1<<8);
*(long *)&global.line2.LeftEdge = 0x0004000EL; /* 4,14 */
*(long *)&global.line3.FrontPen = 0x00010000L | (JAM1<<8);
*(long *)&global.line3.LeftEdge = 0x00040018L; /* 4,24 */
*(long *)&global.retrytxt.FrontPen = 0x00010000L | (JAM1<<8);
*(long *)&global.retrytxt.LeftEdge = 0x00040004L;
*(long *)&global.canceltxt.FrontPen = 0x00010000L | (JAM1<<8);
*(long *)&global.canceltxt.LeftEdge = 0x00040004L;
#endif
global.retrytxt.IText = "Retry";
global.canceltxt.IText = "Cancel";
/* since we were started as a non-BCPL module we get sent the parameter */
/* packet (ie. parameter packet not in D1) */
mypkt = taskwait(&global); /* wait for parameter packet */
#ifdef DEBUG
initdebug();
#endif
global.devname = (((char *)BADDR(mypkt->dp_Arg1))+1); /* BSTR name passed to handler */
#if 0
global.extra = mypkt->dp_Arg2; /* Extra Info passed */
#endif
/* get pointer to our device node */
global.node = (struct DeviceNode *) BADDR(mypkt->dp_Arg3); /* ptr to device node */
global.node->dn_Task = global.port;
InitDevice(&global);
/* Now mount the disk */
Mount(&global);
OpenTimer(&global);
mypkt->dp_Res1 = DOS_TRUE;
retpkt(&global, mypkt);
PostTimerReq(&global);
while(global.run) /* start of the real work */
{
mypkt = taskwait(&global); /* wait for a packet */
action = mypkt->dp_Type;
BUG(("Execute: action #%ld\n", action));
switch (action)
{
case ACTION_READ:
subr = ActRead;
flags = 0;
break;
case ACTION_WRITE:
subr = ActWrite;
flags = 0;
break;
case ACTION_SET_RAW_MODE:
subr = NULL;
flags = 0;
break;
case ACTION_FIND_WRITE: /* 1004 */
case ACTION_FIND_INPUT: /* 1005 */
case ACTION_FIND_OUTPUT: /* 1006 */
case ACTION_END: /* 1007 */
case ACTION_SEEK: /* 1008 */
subr = hiwork[action-HI_FIRST].subr;
flags = hiwork[action-HI_FIRST].flags;
break;
default:
if ((action >= LO_FIRST) && (action <= LO_LAST))
{
subr = lowork[action-LO_FIRST].subr;
flags = lowork[action-LO_FIRST].flags;
}
else
subr = NULL;
}
mypkt->dp_Res1 = DOS_FALSE;
mypkt->dp_Res2 = ERROR_ACTION_NOT_KNOWN;
if (subr != NULL)
{
global.reply = 1;
if (flags & BP1)
mypkt->dp_Arg1 <<= 2;
if (flags & BP2)
mypkt->dp_Arg2 <<= 2;
if (flags & BP3)
mypkt->dp_Arg3 <<= 2;
if (flags & BP4)
mypkt->dp_Arg4 <<= 2;
if (global.changedisk)
Mount(&global);
(*subr)(&global, mypkt);
if (global.changedisk)
Mount(&global);
}
else
{
BUG(("Unknown packet type %ld\n",mypkt->dp_Type));
}
/* Now return the packet to them */
if (global.reply)
retpkt(&global, mypkt);
BUG(("-----\n"));
}
/* do our final cleanup */
global.node->dn_Task = FALSE; /* zero the taskid field of device node */
global.node->dn_SegList = 0; /* make us be gone */
DisMount(&global);
TermDevice(&global);
FreeBlkBuffs(&global);
}