correct FCB fix from Bart, during open only certain fields of FCB should be initialized, programs may expect others to remain as set prior to open/create call

git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@1380 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
Kenneth J Davis 2009-05-17 01:06:07 +00:00
parent 01cc83bc82
commit 9e2421746b

View File

@ -253,7 +253,7 @@ UBYTE FcbReadWrite(xfcb FAR * lpXfcb, UCOUNT recno, int mode)
lpFcb = ExtFcbToFcb(lpXfcb); lpFcb = ExtFcbToFcb(lpXfcb);
recsiz = lpFcb->fcb_recsiz; recsiz = lpFcb->fcb_recsiz;
bigsize = (ULONG)recsiz * (recno+1); bigsize = (ULONG)recsiz * recno;
if (bigsize > 0xffff) if (bigsize > 0xffff)
return FCB_ERR_SEGMENT_WRAP; return FCB_ERR_SEGMENT_WRAP;
size = (unsigned)bigsize; size = (unsigned)bigsize;
@ -393,7 +393,20 @@ UBYTE FcbRandomIO(xfcb FAR * lpXfcb, int mode)
return nErrorCode; return nErrorCode;
} }
/* merged fcbOpen and FcbCreate - saves ~200 byte */ /* FcbOpen and FcbCreate
Expects lpXfcb to point to a valid, unopened FCB, containing file name to open (create)
Create will attempt to find the file name in the current directory, if found truncates
setting file size to 0, otherwise if does not exist will create the new file; the
FCB is filled in same as the open call.
On any error returns FCB_ERROR
On success returns FCB_SUCCESS, and sets the following fields (other non-system reserved ones left unchanged)
drive identifier (fcb_drive) set to actual drive (1=A, 2=B, ...; always >0 if not device)
current block number (fcb_cublock) to 0
file size (fcb_fsize) value from directory entry (0 if create)
record size (fcb_recsiz) to 128; set to 0 for devices
time & date (fcb_time & fcb_date) values from directory entry
fcb_sftno, fcb_attrib_hi/_lo, fcb_strtclst, fcb_dirclst/off_unused are for internal use (system reserved)
*/
UBYTE FcbOpen(xfcb FAR * lpXfcb, unsigned flags) UBYTE FcbOpen(xfcb FAR * lpXfcb, unsigned flags)
{ {
sft FAR *sftp; sft FAR *sftp;
@ -417,8 +430,11 @@ UBYTE FcbOpen(xfcb FAR * lpXfcb, unsigned flags)
sftp->sft_mode |= O_FCB; sftp->sft_mode |= O_FCB;
lpFcb->fcb_sftno = sft_idx; lpFcb->fcb_sftno = sft_idx;
lpFcb->fcb_cublock = 0;
/* should not be cleared, programs e.g. GEM depend on these values remaining unchanged
lpFcb->fcb_curec = 0; lpFcb->fcb_curec = 0;
lpFcb->fcb_rndm = 0; lpFcb->fcb_rndm = 0;
*/
lpFcb->fcb_recsiz = 0; /* true for devices */ lpFcb->fcb_recsiz = 0; /* true for devices */
if (!(sftp->sft_flags & SFT_FDEVICE)) /* check for a device */ if (!(sftp->sft_flags & SFT_FDEVICE)) /* check for a device */