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
/
buff.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-08-09
|
5KB
|
143 lines
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* |_o_o|\\ Copyright (c) 1987 The Software Distillery. All Rights Reserved */
/* |. o.| || This program may not be distributed without the permission of */
/* | . | || the authors: BBS: */
/* | o | || John Toebes Dave Baker */
/* | . |// */
/* ====== */
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* File buffer manipulation */
#include "handler.h"
/*---------------------------------------------------------------------------*/
/* */
/* initbuf( global, mode, flags ) */
/* */
/*---------------------------------------------------------------------------*/
int initbuf(global, mode, flags)
struct global *global;
int mode;
int flags;
{
long key;
struct EFileHandle *efh;
struct FileHandle *fh;
struct FileLock *lock;
fh = (struct FileHandle *)global->pkt->dp_Arg1;
lock = (struct FileLock *)global->pkt->dp_Arg2;
BUG(("initbuf:enter flags = %ld\n", flags));
BUG(("Initbuf: fh = %08lx lock = %08lx mode = %ld\n", fh, lock, mode));
BUGBSTR("Name to open is :", global->pkt->dp_Arg3);
/* allocate a buffer */
efh = fh->fh_Arg1 = (struct EFileHandle *)
DosAllocMem(global, sizeof(struct EFileHandle));
BUG(("initbuf: EFileHandle is at %08lx\n", efh));
if (efh == NULL) return( DOS_FALSE );
/* Put it on the chain */
efh->efh_Next = global->AllHandles;
global->AllHandles = efh;
fh->fh_Type = global->port;
fh->fh_Port = DOS_FALSE; /* not an interactive file */
if (flags & NEWFILE)
{
/* Make sure we have the rights to write to this disk */
if (unsafe(global, efh, 1)) goto error;
BUG(("Calling CreateEntry\n"));
key = CreateEntry(global, GetKey(global,lock),
(char *)global->pkt->dp_Arg3,
OLDFILE, ST_FILE);
}
else
{
/* Make sure the disk is in a safe state to be doing this stuff */
if (unsafe(global, efh, 0)) goto error;
BUG(("Calling LocateEntry\n"));
key = LocateEntry(global, GetKey(global,lock),
(char *)global->pkt->dp_Arg3);
}
efh->efh_Lock = CreateLock(global, key, mode);
BUG(("initbuf: Key = %ld lock = %08lx\n", key, efh->efh_Lock));
if (efh->efh_Lock == NULL)
goto error;
if (GetType(global,key) != ST_FILE)
{
BUG(("Gee, It's not the right type %ld\n", GetType(global, key)));
global->pkt->dp_Res2 = ERROR_OBJECT_WRONG_TYPE;
goto error;
}
/* We maintain these fields so we don't have to go seeking for them. */
efh->efh_CurPos = 0;
efh->efh_CurKey = 0;
efh->efh_CurBlock = 1;
efh->efh_CurExtBlock = 0;
efh->efh_ExtBlockKey = key;
efh->efh_Protect = GetProtect(global, key);
BUG(("initbuf: done\n"));
return(DOS_TRUE);
error:
termbuf( global, efh );
return(DOS_FALSE);
}
/*---------------------------------------------------------------------------*/
/* */
/* termbuf( global, efh ) */
/* */
/*---------------------------------------------------------------------------*/
void termbuf(global, efh)
GLOBAL global;
EFH efh;
{
struct EFileHandle *prev;
/* Unlink this efh from our global chain */
if (global->AllHandles == efh)
global->AllHandles = efh->efh_Next;
else
{
for (prev = global->AllHandles;
prev && (prev->efh_Next != efh);
prev = prev->efh_Next);
/* Just in case.... but this should never happen!!! */
if (!prev)
{
BUG(("termbuf: oh shit, cant find efh %08lx in chain!!!!!\n",efh));
/* dont free it because its probably garbage */
return;
}
/* remove efh from chain */
prev->efh_Next = efh->efh_Next;
}
if (efh->efh_Lock)
freelock(global, efh->efh_Lock);
/* free up the memory for the buffer */
DosFreeMem( (char *)efh );
global->pkt->dp_Arg1 = NULL;
}