home *** CD-ROM | disk | FTP | other *** search
- /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
- /* |_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;
- }
-
-