FCB fixes and clean-ups, exec int21/ax=4b01, initdisk.c printf

git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@267 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
Bart Oldeman 2001-07-23 12:47:42 +00:00
parent 03865c6b69
commit 77e49f87c7
8 changed files with 402 additions and 508 deletions

View File

@ -36,6 +36,9 @@ static BYTE *charioRcsId = "$Id$";
/*
* $Log$
* Revision 1.10 2001/07/23 12:47:42 bartoldeman
* FCB fixes and clean-ups, exec int21/ax=4b01, initdisk.c printf
*
* Revision 1.9 2001/06/03 14:16:17 bartoldeman
* BUFFERS tuning and misc bug fixes/cleanups (2024c).
*
@ -185,9 +188,7 @@ VOID cso(COUNT c)
VOID sto(COUNT c)
{
static COUNT scratch; /* make this static to save stack space */
DosWrite(STDOUT, 1, (BYTE FAR *) & c, (COUNT FAR *) &scratch);
DosWrite(STDOUT, 1, (BYTE FAR *) & c, (COUNT FAR *) &UnusedRetVal);
}
VOID mod_sto(REG UCOUNT c)
@ -224,13 +225,12 @@ VOID Do_DosIdle_loop(void)
UCOUNT _sti(void)
{
static COUNT scratch;
UBYTE c;
/*
* XXX: If there's a read error, this will just keep retrying the read until
* the error disappears. Maybe it should do something else instead. -- ror4
*/
while (GenericRead(STDIN, 1, (BYTE FAR *) & c, (COUNT FAR *) & scratch, TRUE)
while (GenericRead(STDIN, 1, (BYTE FAR *) & c, (COUNT FAR *) & UnusedRetVal, TRUE)
!= 1) ;
return c;
}

View File

@ -37,6 +37,9 @@ static BYTE *dosfnsRcsId = "$Id$";
* /// Added SHARE support. 2000/09/04 Ron Cemer
*
* $Log$
* Revision 1.21 2001/07/23 12:47:42 bartoldeman
* FCB fixes and clean-ups, exec int21/ax=4b01, initdisk.c printf
*
* Revision 1.20 2001/07/22 01:58:58 bartoldeman
* Support for Brian's FORMAT, DJGPP libc compilation, cleanups, MSCDEX
*
@ -182,9 +185,8 @@ static BYTE *dosfnsRcsId = "$Id$";
#include "globals.h"
sft FAR *get_sft(UCOUNT);
WORD get_free_hndl(VOID);
sft FAR *get_free_sft(WORD FAR *);
COUNT get_free_hndl(VOID);
sft FAR *get_free_sft(COUNT *);
BOOL cmatch(COUNT, COUNT, COUNT);
f_node_ptr xlt_fd(COUNT);
@ -257,34 +259,41 @@ static VOID DosGetFile(BYTE * lpszPath, BYTE FAR * lpszDosFileName)
fbcopy((BYTE FAR *) szLclExt, &lpszDosFileName[FNAME_SIZE], FEXT_SIZE);
}
sft FAR *get_sft(UCOUNT hndl)
sft FAR *idx_to_sft(COUNT SftIndex)
{
psp FAR *p = MK_FP(cu_psp, 0);
WORD sys_idx;
sfttbl FAR *sp;
if (hndl >= p->ps_maxfiles)
if (SftIndex < 0)
return (sft FAR *) - 1;
/* Get the SFT block that contains the SFT */
if (p->ps_filetab[hndl] == 0xff)
return (sft FAR *) - 1;
sys_idx = p->ps_filetab[hndl];
for (sp = sfthead; sp != (sfttbl FAR *) - 1; sp = sp->sftt_next)
for (sp = sfthead; sp != (sfttbl FAR *) - 1;
sp = sp->sftt_next)
{
if (sys_idx < sp->sftt_count)
break;
if (SftIndex < sp->sftt_count)
/* finally, point to the right entry */
return (sft FAR *) & (sp->sftt_table[SftIndex]);
else
sys_idx -= sp->sftt_count;
SftIndex -= sp->sftt_count;
}
/* If not found, return an error */
if (sp == (sfttbl FAR *) - 1)
return (sft FAR *) - 1;
return (sft FAR *) - 1;
}
/* finally, point to the right entry */
return (sft FAR *) & (sp->sftt_table[sys_idx]);
STATIC COUNT get_sft_idx(UCOUNT hndl)
{
psp FAR *p = MK_FP(cu_psp, 0);
if (hndl >= p->ps_maxfiles)
return DE_INVLDHNDL;
return p->ps_filetab[hndl] == 0xff ? DE_INVLDHNDL : p->ps_filetab[hndl];
}
sft FAR *get_sft(UCOUNT hndl)
{
/* Get the SFT block that contains the SFT */
return idx_to_sft(get_sft_idx(hndl));
}
/*
@ -298,17 +307,8 @@ UCOUNT GenericRead(COUNT hndl, UCOUNT n, BYTE FAR * bp, COUNT FAR * err,
BOOL force_binary)
{
sft FAR *s;
/* WORD sys_idx;*/
/*sfttbl FAR *sp;*/
UCOUNT ReadCount;
/* Test that the handle is valid */
if (hndl < 0)
{
*err = DE_INVLDHNDL;
return 0;
}
/* Get the SFT block that contains the SFT */
if ((s = get_sft(hndl)) == (sft FAR *) - 1)
{
@ -436,17 +436,8 @@ UCOUNT DosRead(COUNT hndl, UCOUNT n, BYTE FAR * bp, COUNT FAR * err)
UCOUNT DosWrite(COUNT hndl, UCOUNT n, BYTE FAR * bp, COUNT FAR * err)
{
sft FAR *s;
/* WORD sys_idx;*/
/*sfttbl FAR *sp;*/
UCOUNT WriteCount;
/* Test that the handle is valid */
if (hndl < 0)
{
*err = DE_INVLDHNDL;
return 0;
}
/* Get the SFT block that contains the SFT */
if ((s = get_sft(hndl)) == (sft FAR *) - 1)
{
@ -685,10 +676,6 @@ COUNT DosSeek(COUNT hndl, LONG new_pos, COUNT mode, ULONG * set_pos)
sft FAR *s;
COUNT result;
/* Test that the handle is valid */
if (hndl < 0)
return DE_INVLDHNDL;
/* Get the SFT block that contains the SFT */
if ((s = get_sft(hndl)) == (sft FAR *) - 1)
return DE_INVLDHNDL;
@ -700,7 +687,7 @@ COUNT DosSeek(COUNT hndl, LONG new_pos, COUNT mode, ULONG * set_pos)
return result;
}
STATIC WORD get_free_hndl(void)
STATIC COUNT get_free_hndl(void)
{
psp FAR *p = MK_FP(cu_psp, 0);
WORD hndl;
@ -710,12 +697,12 @@ STATIC WORD get_free_hndl(void)
if (p->ps_filetab[hndl] == 0xff)
return hndl;
}
return 0xff;
return DE_TOOMANY;
}
sft FAR *get_free_sft(WORD FAR * sft_idx)
sft FAR *get_free_sft(COUNT *sft_idx)
{
WORD sys_idx = 0;
COUNT sys_idx = 0;
sfttbl FAR *sp;
/* Get the SFT block that contains the SFT */
@ -773,15 +760,13 @@ BOOL fnmatch(BYTE FAR * s, BYTE FAR * d, COUNT n, COUNT mode)
return TRUE;
}
COUNT DosCreat(BYTE FAR * fname, COUNT attrib)
COUNT DosCreatSft(BYTE * fname, COUNT attrib)
{
psp FAR *p = MK_FP(cu_psp, 0);
WORD hndl, sft_idx;
COUNT sft_idx;
sft FAR *sftp;
struct dhdr FAR *dhp;
/* BYTE FAR *froot;*/
/* WORD i;*/
COUNT result, drive;
WORD result;
COUNT drive;
/* NEVER EVER allow directories to be created */
if (attrib & ~(D_RDONLY|D_HIDDEN|D_SYSTEM|D_ARCHIVE))
@ -789,30 +774,28 @@ COUNT DosCreat(BYTE FAR * fname, COUNT attrib)
return DE_ACCESS;
}
/* get a free handle */
if ((hndl = get_free_hndl()) == 0xff)
/* now get a free system file table entry */
if ((sftp = get_free_sft(&sft_idx)) == (sft FAR *) - 1)
return DE_TOOMANY;
/* now get a free system file table entry */
if ((sftp = get_free_sft((WORD FAR *) & sft_idx)) == (sft FAR *) - 1)
return DE_TOOMANY;
fmemset(sftp, 0, sizeof(sft));
sftp->sft_shroff = -1; /* /// Added for SHARE - Ron Cemer */
sftp->sft_psp = cu_psp;
sftp->sft_mode = SFT_MRDWR;
sftp->sft_attrib = attrib;
sftp->sft_psp = cu_psp;
/* check for a device */
dhp = IsDevice(fname);
if ( dhp )
{
sftp->sft_count += 1;
sftp->sft_mode = SFT_MRDWR;
sftp->sft_attrib = attrib;
sftp->sft_flags =
((dhp->dh_attr & ~SFT_MASK) & ~SFT_FSHARED) | SFT_FDEVICE | SFT_FEOF;
sftp->sft_psp = cu_psp;
fbcopy((BYTE FAR *) SecPathName, sftp->sft_name, FNAME_SIZE + FEXT_SIZE);
sftp->sft_dev = dhp;
p->ps_filetab[hndl] = sft_idx;
return hndl;
return sft_idx;
}
drive = get_verify_drive(fname);
@ -820,27 +803,21 @@ COUNT DosCreat(BYTE FAR * fname, COUNT attrib)
return drive;
}
result = truename(fname, PriPathName, FALSE);
if (result != SUCCESS) {
return result;
}
if (CDSp->cds_table[drive].cdsFlags & CDSNETWDRV) {
lpCurSft = (sfttbl FAR *)sftp;
sftp->sft_mode = attrib;
result = -int2f_Remote_call(REM_CREATE, 0, 0, 0, (VOID FAR *) sftp, 0, MK_FP(0, attrib));
if (result == SUCCESS) {
sftp->sft_count += 1;
p->ps_filetab[hndl] = sft_idx;
return hndl;
}
if (result == SUCCESS) {
sftp->sft_count += 1;
return sft_idx;
}
return result;
}
/* /// Added for SHARE. - Ron Cemer */
if (IsShareInstalled()) {
if ((sftp->sft_shroff = share_open_check
((char far *)PriPathName,
((char far *)fname,
cu_psp,
0x02, /* read-write */
0)) < 0) /* compatibility mode */
@ -848,17 +825,13 @@ COUNT DosCreat(BYTE FAR * fname, COUNT attrib)
}
/* /// End of additions for SHARE. - Ron Cemer */
sftp->sft_status = dos_creat(PriPathName, attrib);
sftp->sft_status = dos_creat(fname, attrib);
if (sftp->sft_status >= 0)
{
p->ps_filetab[hndl] = sft_idx;
sftp->sft_count += 1;
sftp->sft_mode = SFT_MRDWR;
sftp->sft_attrib = attrib;
sftp->sft_flags = drive;
sftp->sft_psp = cu_psp;
DosGetFile(PriPathName, sftp->sft_name);
return hndl;
DosGetFile(fname, sftp->sft_name);
return sft_idx;
} else {
/* /// Added for SHARE *** CURLY BRACES ADDED ALSO!!! ***. - Ron Cemer */
if (IsShareInstalled()) {
@ -870,6 +843,29 @@ COUNT DosCreat(BYTE FAR * fname, COUNT attrib)
}
}
COUNT DosCreat(BYTE FAR * fname, COUNT attrib)
{
psp FAR *p = MK_FP(cu_psp, 0);
COUNT sft_idx, hndl, result;
/* get a free handle */
if ((hndl = get_free_hndl()) < 0)
return hndl;
result = truename(fname, PriPathName, FALSE);
if (result != SUCCESS) {
return result;
}
sft_idx = DosCreatSft(PriPathName, attrib);
if (sft_idx < SUCCESS)
return sft_idx;
p->ps_filetab[hndl] = sft_idx;
return hndl;
}
COUNT CloneHandle(COUNT hndl)
{
sft FAR *sftp;
@ -900,8 +896,8 @@ COUNT DosDup(COUNT Handle)
return DE_INVLDHNDL;
/* now get a free handle */
if ((NewHandle = get_free_hndl()) == 0xff)
return DE_TOOMANY;
if ((NewHandle = get_free_hndl()) < 0)
return NewHandle;
/* If everything looks ok, bump it up. */
if ((Sftp->sft_flags & (SFT_FDEVICE | SFT_FSHARED)) || (Sftp->sft_status >= 0))
@ -948,40 +944,30 @@ COUNT DosForceDup(COUNT OldHandle, COUNT NewHandle)
return DE_INVLDHNDL;
}
COUNT DosOpen(BYTE FAR * fname, COUNT mode)
COUNT DosOpenSft(BYTE * fname, COUNT mode)
{
psp FAR *p = MK_FP(cu_psp, 0);
WORD hndl;
WORD sft_idx;
COUNT sft_idx;
sft FAR *sftp;
struct dhdr FAR *dhp;
COUNT drive, result;
/* /// Added to adjust for filenames which begin with ".\"
The problem was manifesting itself in the inability
to run an program whose filename (without the extension)
was longer than six characters and the PATH variable
contained ".", unless you explicitly specified the full
path to the executable file.
Jun 11, 2000 - rbc */
if ( (fname[0] == '.') && ((fname[1] == '\\') || (fname[1] == '/'))) fname += 2;
OpenMode = (BYTE) mode;
/* test if mode is in range */
if ((mode & ~SFT_OMASK) != 0)
return DE_INVLDACC;
mode &= 3;
/* get a free handle */
if ((hndl = get_free_hndl()) == 0xff)
return DE_TOOMANY;
OpenMode = (BYTE) mode;
/* now get a free system file table entry */
if ((sftp = get_free_sft((WORD FAR *) & sft_idx)) == (sft FAR *) - 1)
if ((sftp = get_free_sft(&sft_idx)) == (sft FAR *) - 1)
return DE_TOOMANY;
fmemset(sftp, 0, sizeof(sft));
sftp->sft_psp = cu_psp;
sftp->sft_mode = mode;
/* check for a device */
dhp = IsDevice(fname);
@ -989,18 +975,15 @@ COUNT DosOpen(BYTE FAR * fname, COUNT mode)
{
sftp->sft_shroff = -1; /* /// Added for SHARE - Ron Cemer */
sftp->sft_mode = mode;
sftp->sft_count += 1;
sftp->sft_flags =
((dhp->dh_attr & ~SFT_MASK) & ~SFT_FSHARED) | SFT_FDEVICE | SFT_FEOF;
sftp->sft_psp = cu_psp;
fbcopy((BYTE FAR *) SecPathName, sftp->sft_name, FNAME_SIZE + FEXT_SIZE);
sftp->sft_dev = dhp;
sftp->sft_date = dos_getdate();
sftp->sft_time = dos_gettime();
p->ps_filetab[hndl] = sft_idx;
return hndl;
return sft_idx;
}
drive = get_verify_drive(fname);
@ -1008,29 +991,21 @@ COUNT DosOpen(BYTE FAR * fname, COUNT mode)
return drive;
}
result = truename(fname, PriPathName, FALSE);
if (result != SUCCESS) {
return result;
}
if (CDSp->cds_table[drive].cdsFlags & CDSNETWDRV) {
lpCurSft = (sfttbl FAR *)sftp;
result = -int2f_Remote_call(REM_OPEN, 0, 0, 0, (VOID FAR *) sftp, 0, MK_FP(0, mode));
if (result == SUCCESS) {
sftp->sft_count += 1;
p->ps_filetab[hndl] = sft_idx;
return hndl;
return sft_idx;
}
return result;
}
sftp->sft_shroff = -1; /* /// Added for SHARE - Ron Cemer */
sftp->sft_mode = mode;
/* /// Added for SHARE. - Ron Cemer */
/* /// Added for SHARE. - Ron Cemer */
if (IsShareInstalled()) {
if ((sftp->sft_shroff = share_open_check
((char far *)PriPathName,
((char far *)fname,
(unsigned short)cu_psp,
mode & 0x03,
(mode >> 2) & 0x07)) < 0)
@ -1038,7 +1013,7 @@ COUNT DosOpen(BYTE FAR * fname, COUNT mode)
}
/* /// End of additions for SHARE. - Ron Cemer */
sftp->sft_status = dos_open(PriPathName, mode);
sftp->sft_status = dos_open(fname, mode);
if (sftp->sft_status >= 0)
{
@ -1052,14 +1027,16 @@ COUNT DosOpen(BYTE FAR * fname, COUNT mode)
{
return DE_ACCESS;
}
p->ps_filetab[hndl] = sft_idx;
sftp->sft_size = dos_getfsize(sftp->sft_status);
dos_getftime(sftp->sft_status,
(date FAR *) & sftp->sft_date,
(time FAR *) & sftp->sft_time);
sftp->sft_count += 1;
sftp->sft_mode = mode;
sftp->sft_flags = drive;
sftp->sft_psp = cu_psp;
DosGetFile(PriPathName, sftp->sft_name);
return hndl;
DosGetFile(fname, sftp->sft_name);
return sft_idx;
} else {
/* /// Added for SHARE *** CURLY BRACES ADDED ALSO!!! ***. - Ron Cemer */
if (IsShareInstalled()) {
@ -1071,33 +1048,47 @@ COUNT DosOpen(BYTE FAR * fname, COUNT mode)
}
}
COUNT DosClose(COUNT hndl)
COUNT DosOpen(BYTE FAR * fname, COUNT mode)
{
psp FAR *p = MK_FP(cu_psp, 0);
sft FAR *s;
COUNT sft_idx, result, hndl;
/* Test that the handle is valid */
if (hndl < 0)
return DE_INVLDHNDL;
/* get a free handle */
if ((hndl = get_free_hndl()) < 0)
return hndl;
/* Get the SFT block that contains the SFT */
if ((s = get_sft(hndl)) == (sft FAR *) - 1)
result = truename(fname, PriPathName, FALSE);
if (result != SUCCESS) {
return result;
}
sft_idx = DosOpenSft(PriPathName, mode);
if (sft_idx < SUCCESS)
return sft_idx;
p->ps_filetab[hndl] = sft_idx;
return hndl;
}
COUNT DosCloseSft(WORD sft_idx)
{
sft FAR *s = idx_to_sft(sft_idx);
if (s == (sft FAR *) - 1)
return DE_INVLDHNDL;
/* If this is not opened another error */
if (s->sft_count == 0)
/* The second condition is a sanity check and necessary for FcbCloseAll */
if (s->sft_count == 0 || (s->sft_count == 1 && s->sft_psp != cu_psp))
return DE_ACCESS;
lpCurSft = (sfttbl FAR *) s;
/*
remote sub sft_count.
*/
p->ps_filetab[hndl] = 0xff;
if (s->sft_flags & SFT_FSHARED)
{
int2f_Remote_call(REM_CLOSE, 0, 0, 0, (VOID FAR *) s, 0, 0);
return SUCCESS;
}
return -int2f_Remote_call(REM_CLOSE, 0, 0, 0, (VOID FAR *) s, 0, 0);
/* now just drop the count if a device, else */
/* call file system handler */
@ -1120,6 +1111,18 @@ COUNT DosClose(COUNT hndl)
}
}
COUNT DosClose(COUNT hndl)
{
psp FAR *p = MK_FP(cu_psp, 0);
COUNT ret;
/* Get the SFT block that contains the SFT */
ret = DosCloseSft(get_sft_idx(hndl));
if (ret != DE_INVLDHNDL && ret != DE_ACCESS)
p->ps_filetab[hndl] = 0xff;
return ret;
}
VOID DosGetFree(UBYTE drive, COUNT FAR * spc, COUNT FAR * navc, COUNT FAR * bps, COUNT FAR * nc)
{
struct dpb FAR *dpbp;
@ -1332,10 +1335,6 @@ COUNT DosGetFtime(COUNT hndl, date FAR * dp, time FAR * tp)
sft FAR *s;
/*sfttbl FAR *sp;*/
/* Test that the handle is valid */
if (hndl < 0)
return DE_INVLDHNDL;
/* Get the SFT block that contains the SFT */
if ((s = get_sft(hndl)) == (sft FAR *) - 1)
return DE_INVLDHNDL;
@ -1356,17 +1355,12 @@ COUNT DosGetFtime(COUNT hndl, date FAR * dp, time FAR * tp)
return dos_getftime(s->sft_status, dp, tp);
}
COUNT DosSetFtime(COUNT hndl, date FAR * dp, time FAR * tp)
COUNT DosSetFtimeSft(WORD sft_idx, date FAR * dp, time FAR * tp)
{
sft FAR *s;
/*sfttbl FAR *sp;*/
/* Test that the handle is valid */
if (hndl < 0)
return DE_INVLDHNDL;
/* Get the SFT block that contains the SFT */
if ((s = get_sft(hndl)) == (sft FAR *) - 1)
sft FAR *s = idx_to_sft(sft_idx);
if (s == (sft FAR *) - 1)
return DE_INVLDHNDL;
/* If this is not opened another error */
@ -1544,33 +1538,42 @@ COUNT DosDelete(BYTE FAR *path)
}
}
COUNT DosRename(BYTE FAR * path1, BYTE FAR * path2)
COUNT DosRenameTrue(BYTE * path1, BYTE * path2)
{
COUNT result, drive1, drive2;
COUNT drive1, drive2;
if (IsDevice(path1) || IsDevice(path2)) {
return DE_FILENOTFND;
}
}
drive1 = get_verify_drive(path1);
drive2 = get_verify_drive(path2);
if ((drive1 != drive2) || (drive1 < 0)) {
return DE_INVLDDRV;
}
current_ldt = &CDSp->cds_table[drive1];
if (CDSp->cds_table[drive1].cdsFlags & CDSNETWDRV) {
return -int2f_Remote_call(REM_RENAME, 0, 0, 0, 0, 0, 0);
} else {
return dos_rename(PriPathName, SecPathName);
}
}
COUNT DosRename(BYTE FAR * path1, BYTE FAR * path2)
{
COUNT result;
result = truename(path1, PriPathName, FALSE);
if (result != SUCCESS) {
return result;
}
drive2 = get_verify_drive(path2);
result = truename(path2, SecPathName, FALSE);
if (result != SUCCESS) {
return result;
}
if ((drive1 != drive2) || (drive1 < 0)) {
return DE_INVLDDRV;
}
current_ldt = &CDSp->cds_table[drive1];
if (CDSp->cds_table[drive1].cdsFlags & CDSNETWDRV) {
return -int2f_Remote_call(REM_RENAME, 0, 0, 0, 0, 0, 0);
} else {
return dos_rename(PriPathName, SecPathName);
}
return DosRenameTrue(PriPathName, SecPathName);
}
COUNT DosMkdir(BYTE FAR * dir)
@ -1630,9 +1633,6 @@ COUNT DosLockUnlock(COUNT hndl, LONG pos, LONG len, COUNT unlock)
/* Invalid function unless SHARE is installed. */
if (!IsShareInstalled()) return DE_INVLDFUNC;
/* Test that the handle is valid */
if (hndl < 0) return DE_INVLDHNDL;
/* Get the SFT block that contains the SFT */
if ((s = get_sft(hndl)) == (sft FAR *) -1) return DE_INVLDHNDL;

View File

@ -36,6 +36,9 @@ static BYTE *fatdirRcsId = "$Id$";
/*
* $Log$
* Revision 1.19 2001/07/23 12:47:42 bartoldeman
* FCB fixes and clean-ups, exec int21/ax=4b01, initdisk.c printf
*
* Revision 1.18 2001/07/22 01:58:58 bartoldeman
* Support for Brian's FORMAT, DJGPP libc compilation, cleanups, MSCDEX
*
@ -358,6 +361,7 @@ COUNT dir_read(REG f_node_ptr fnp)
/* REG j; */
struct buffer FAR *bp;
REG UWORD secsize = fnp->f_dpb->dpb_secsize;
/* Directories need to point to their current offset, not for */
/* next op. Therefore, if it is anything other than the first */
@ -382,7 +386,7 @@ COUNT dir_read(REG f_node_ptr fnp)
{
if (fnp->f_flags.f_droot)
{
if ((fnp->f_diroff / fnp->f_dpb->dpb_secsize
if ((fnp->f_diroff / secsize
+ fnp->f_dpb->dpb_dirstrt)
>= fnp->f_dpb->dpb_data)
{
@ -390,18 +394,15 @@ COUNT dir_read(REG f_node_ptr fnp)
return 0;
}
bp = getblock((ULONG) (fnp->f_diroff / fnp->f_dpb->dpb_secsize
bp = getblock((ULONG) (fnp->f_diroff / secsize
+ fnp->f_dpb->dpb_dirstrt),
fnp->f_dpb->dpb_unit);
bp->b_flag &= ~(BFR_DATA | BFR_FAT);
bp->b_flag |= BFR_DIR | BFR_VALID;
#ifdef DISPLAY_GETBLOCK
printf("DIR (dir_read)\n");
#endif
}
else
{
REG UWORD secsize = fnp->f_dpb->dpb_secsize;
/* Do a "seek" to the directory position */
fnp->f_offset = fnp->f_diroff;
@ -444,8 +445,6 @@ COUNT dir_read(REG f_node_ptr fnp)
fnp->f_dpb->dpb_data)
+ fnp->f_sector,
fnp->f_dpb->dpb_unit);
bp->b_flag &= ~(BFR_DATA | BFR_FAT);
bp->b_flag |= BFR_DIR | BFR_VALID;
#ifdef DISPLAY_GETBLOCK
printf("DIR (dir_read)\n");
#endif
@ -453,15 +452,18 @@ COUNT dir_read(REG f_node_ptr fnp)
/* Now that we have the block for our entry, get the */
/* directory entry. */
if (bp != NULL)
getdirent((BYTE FAR *) & bp->b_buffer[((UWORD)fnp->f_diroff) % fnp->f_dpb->dpb_secsize],
(struct dirent FAR *)&fnp->f_dir);
else
if (bp == NULL)
{
fnp->f_flags.f_dfull = TRUE;
return 0;
}
bp->b_flag &= ~(BFR_DATA | BFR_FAT);
bp->b_flag |= BFR_DIR | BFR_VALID;
getdirent((BYTE FAR *) & bp->b_buffer[((UWORD)fnp->f_diroff) % fnp->f_dpb->dpb_secsize],
(struct dirent FAR *)&fnp->f_dir);
/* Update the fnode's directory info */
fnp->f_flags.f_dfull = FALSE;
fnp->f_flags.f_dmod = FALSE;
@ -479,6 +481,7 @@ COUNT dir_read(REG f_node_ptr fnp)
COUNT dir_write(REG f_node_ptr fnp)
{
struct buffer FAR *bp;
REG UWORD secsize = fnp->f_dpb->dpb_secsize;
/* Update the entry if it was modified by a write or create... */
if (fnp->f_flags.f_dmod)
@ -488,11 +491,9 @@ COUNT dir_write(REG f_node_ptr fnp)
if (fnp->f_flags.f_droot)
{
bp = getblock(
(ULONG) ((UWORD)fnp->f_diroff / fnp->f_dpb->dpb_secsize
(ULONG) ((UWORD)fnp->f_diroff / secsize
+ fnp->f_dpb->dpb_dirstrt),
fnp->f_dpb->dpb_unit);
bp->b_flag &= ~(BFR_DATA | BFR_FAT);
bp->b_flag |= BFR_DIR | BFR_VALID;
#ifdef DISPLAY_GETBLOCK
printf("DIR (dir_write)\n");
#endif
@ -503,7 +504,6 @@ COUNT dir_write(REG f_node_ptr fnp)
/* can continually update the same directory entry. */
else
{
REG UWORD secsize = fnp->f_dpb->dpb_secsize;
/* Do a "seek" to the directory position */
/* and convert the fnode to a directory fnode. */
@ -558,8 +558,10 @@ COUNT dir_write(REG f_node_ptr fnp)
return 0;
}
putdirent((struct dirent FAR *)&fnp->f_dir,
(VOID FAR *) & bp->b_buffer[(UWORD)fnp->f_diroff % fnp->f_dpb->dpb_secsize]);
bp->b_flag |= BFR_DIRTY | BFR_VALID;
(VOID FAR *) & bp->b_buffer[(UWORD)fnp->f_diroff % fnp->f_dpb->dpb_secsize]);
bp->b_flag &= ~(BFR_DATA | BFR_FAT);
bp->b_flag |= BFR_DIR | BFR_DIRTY | BFR_VALID;
}
return DIRENT_SIZE;
}
@ -801,16 +803,19 @@ COUNT dos_findnext(void)
/* If found, transfer it to the dmatch structure */
if (found)
{
#if 0
extern VOID FAR *FcbFindFirstDirPtr;
if (FcbFindFirstDirPtr)
{
/* this works MUCH better, then converting
83 -> ASCIIZ ->83;
specifically ".", ".."
But completely bypasses the network case!
*/
fmemcpy(FcbFindFirstDirPtr, &fnp->f_dir, 32);
}
#endif
pop_dmp(dmp, fnp);
}

View File

@ -35,6 +35,9 @@ static BYTE *RcsId = "$Id$";
/*
* $Log$
* Revision 1.14 2001/07/23 12:47:42 bartoldeman
* FCB fixes and clean-ups, exec int21/ax=4b01, initdisk.c printf
*
* Revision 1.13 2001/07/22 01:58:58 bartoldeman
* Support for Brian's FORMAT, DJGPP libc compilation, cleanups, MSCDEX
*
@ -144,18 +147,14 @@ static BYTE *RcsId = "$Id$";
fcb FAR *ExtFcbToFcb(xfcb FAR * lpExtFcb);
fcb FAR *CommonFcbInit(xfcb FAR * lpExtFcb, BYTE * pszBuffer, COUNT * pCurDrive);
void FcbNameInit(fcb FAR * lpFcb, BYTE * pszBuffer, COUNT * pCurDrive);
sft FAR *FcbGetSft(COUNT SftIndex);
VOID FcbNextRecord(fcb FAR * lpFcb);
/* sft FAR *FcbGetFreeSft(WORD FAR * sft_idx); */
BOOL FcbCalcRec(xfcb FAR * lpXfcb);
VOID MoveDirInfo(dmatch FAR * lpDmatch, struct dirent FAR * lpDir);
VOID MoveDirInfo(dmatch * lpDmatch, fcb FAR * lpDir);
#else
fcb FAR *ExtFcbToFcb();
fcb FAR *CommonFcbInit();
void FcbNameInit();
sft FAR *FcbGetSft();
VOID FcbNextRecord();
/* sft FAR *FcbGetFreeSft(); */
BOOL FcbCalcRec();
VOID MoveDirInfo();
#endif
@ -166,7 +165,7 @@ VOID MoveDirInfo();
static dmatch Dmatch;
VOID FAR *FcbFindFirstDirPtr = NULL;
/* VOID FAR *FcbFindFirstDirPtr = NULL; */
VOID FatGetDrvData(UCOUNT drive, COUNT FAR * spc, COUNT FAR * bps,
@ -274,6 +273,19 @@ WORD FcbParseFname(int wTestMode, BYTE FAR ** lpFileName, fcb FAR * lpFcb)
*lpFileName += 2;
}
/* special cases: '.' and '..' */
if (**lpFileName == '.')
{
lpFcb->fcb_fname[0]='.';
++*lpFileName;
if (**lpFileName == '.')
{
lpFcb->fcb_fname[1]='.';
++*lpFileName;
}
return PARSE_RET_NOWILD;
}
/* Now to format the file name into the string */
*lpFileName = GetNameField(*lpFileName, (BYTE FAR *) lpFcb->fcb_fname, FNAME_SIZE, (BOOL *) & wRetCodeName);
@ -352,26 +364,6 @@ BYTE FAR *GetNameField(BYTE FAR * lpFileName, BYTE FAR * lpDestField,
return lpFileName;
}
static sft FAR *FcbGetSft(COUNT SftIndex)
{
/* Get the SFT block that contains the SFT */
for (lpCurSft = sfthead; lpCurSft != (sfttbl FAR *) - 1;
lpCurSft = lpCurSft->sftt_next)
{
if (SftIndex < lpCurSft->sftt_count)
break;
else
SftIndex -= lpCurSft->sftt_count;
}
/* If not found, return an error */
if (lpCurSft == (sfttbl FAR *) - 1)
return (sft FAR *) - 1;
/* finally, point to the right entry */
return (sft FAR *) & (lpCurSft->sftt_table[SftIndex]);
}
static VOID FcbNextRecord(fcb FAR * lpFcb)
{
if (++lpFcb->fcb_curec > 128)
@ -399,7 +391,7 @@ BOOL FcbRead(xfcb FAR * lpXfcb, COUNT * nErrorCode)
lpFcb = ExtFcbToFcb(lpXfcb);
/* Get the SFT block that contains the SFT */
if ((s = FcbGetSft(lpFcb->fcb_sftno)) == (sft FAR *) - 1)
if ((s = idx_to_sft(lpFcb->fcb_sftno)) == (sft FAR *) - 1)
return FALSE;
/* If this is not opened another error */
@ -470,7 +462,7 @@ BOOL FcbWrite(xfcb FAR * lpXfcb, COUNT * nErrorCode)
lpFcb = ExtFcbToFcb(lpXfcb);
/* Get the SFT block that contains the SFT */
if ((s = FcbGetSft(lpFcb->fcb_sftno)) == (sft FAR *) - 1)
if ((s = idx_to_sft(lpFcb->fcb_sftno)) == (sft FAR *) - 1)
return FALSE;
/* If this is not opened another error */
@ -517,24 +509,23 @@ BOOL FcbWrite(xfcb FAR * lpXfcb, COUNT * nErrorCode)
BOOL FcbGetFileSize(xfcb FAR * lpXfcb)
{
COUNT FcbDrive,
FileNum;
COUNT FcbDrive, hndl;
/* Build a traditional DOS file name */
lpFcb = CommonFcbInit(lpXfcb, PriPathName, &FcbDrive);
lpFcb = CommonFcbInit(lpXfcb, SecPathName, &FcbDrive);
/* check for a device */
if (IsDevice(PriPathName) || (lpFcb->fcb_recsiz == 0))
if (IsDevice(SecPathName) || (lpFcb->fcb_recsiz == 0))
{
return FALSE;
}
FileNum = dos_open(PriPathName, O_RDONLY);
if (FileNum >= 0)
hndl = DosOpen(SecPathName, O_RDONLY);
if (hndl >= 0)
{
LONG fsize;
/* Get the size */
fsize = dos_getfsize(FileNum);
fsize = DosGetFsize(hndl);
/* compute the size and update the fcb */
lpFcb->fcb_rndm = fsize / lpFcb->fcb_recsiz;
@ -542,7 +533,7 @@ BOOL FcbGetFileSize(xfcb FAR * lpXfcb)
++lpFcb->fcb_rndm;
/* close the file and leave */
return dos_close(FileNum) == SUCCESS;
return DosClose(hndl) == SUCCESS;
}
else
return FALSE;
@ -631,47 +622,33 @@ BOOL FcbRandomIO(xfcb FAR * lpXfcb, COUNT * nErrorCode,
}
/*
static sft FAR *FcbGetFreeSft(WORD FAR * sft_idx)
static sft FAR *FcbGetFreeSft(COUNT * sft_idx)
see get_free_sft in dosfns.c
*/
BOOL FcbCreate(xfcb FAR * lpXfcb)
{
WORD sft_idx;
sft FAR *sftp;
COUNT sft_idx, FcbDrive;
struct dhdr FAR *dhp;
COUNT FcbDrive;
/* get a free system file table entry */
if ((sftp = get_free_sft((WORD FAR *) & sft_idx)) == (sft FAR *) - 1)
return DE_TOOMANY;
/* Build a traditional DOS file name */
lpFcb = CommonFcbInit(lpXfcb, PriPathName, &FcbDrive);
sft_idx = DosCreatSft(PriPathName, 0);
if (sft_idx < 0)
return FALSE;
/* check for a device */
dhp = IsDevice(PriPathName);
if (dhp || ((sftp->sft_status = dos_creat(PriPathName, 0)) >= 0))
{
sftp->sft_count += 1;
sftp->sft_mode = O_RDWR;
sftp->sft_attrib = 0;
sftp->sft_flags = dhp ?
((dhp->dh_attr & ~SFT_MASK) & ~SFT_FSHARED) | SFT_FDEVICE | SFT_FEOF : 0;
sftp->sft_psp = cu_psp;
fbcopy(lpFcb->fcb_fname, sftp->sft_name, FNAME_SIZE + FEXT_SIZE);
sftp->sft_dev = dhp;
lpFcb->fcb_sftno = sft_idx;
lpFcb->fcb_curec = 0;
lpFcb->fcb_recsiz = (dhp ? 0 : 128);
if (!dhp) lpFcb->fcb_drive = FcbDrive;
lpFcb->fcb_fsize = 0;
lpFcb->fcb_date = dos_getdate();
lpFcb->fcb_time = dos_gettime();
lpFcb->fcb_rndm = 0;
return TRUE;
}
return FALSE;
lpFcb->fcb_sftno = sft_idx;
lpFcb->fcb_curec = 0;
lpFcb->fcb_recsiz = (dhp ? 0 : 128);
if (!dhp) lpFcb->fcb_drive = FcbDrive;
lpFcb->fcb_fsize = 0;
lpFcb->fcb_date = dos_getdate();
lpFcb->fcb_time = dos_gettime();
lpFcb->fcb_rndm = 0;
return TRUE;
}
STATIC fcb FAR *ExtFcbToFcb(xfcb FAR * lpExtFcb)
@ -697,8 +674,11 @@ STATIC fcb FAR *CommonFcbInit(xfcb FAR * lpExtFcb, BYTE * pszBuffer,
return lpFcb;
}
void FcbNameInit(fcb FAR * lpFcb, BYTE * pszBuffer, COUNT * pCurDrive)
void FcbNameInit(fcb FAR * lpFcb, BYTE * szBuffer, COUNT * pCurDrive)
{
BYTE loc_szBuffer[FNAME_SIZE+1+FEXT_SIZE+1];
BYTE *pszBuffer = loc_szBuffer;
/* Build a traditional DOS file name */
if (lpFcb->fcb_drive != 0)
{
@ -711,107 +691,46 @@ void FcbNameInit(fcb FAR * lpFcb, BYTE * pszBuffer, COUNT * pCurDrive)
{
*pCurDrive = default_drive + 1;
}
ConvertName83ToNameSZ((BYTE FAR *)pszBuffer, (BYTE FAR *) lpFcb->fcb_fname);
/*
lpszFcbFname = (BYTE FAR *) lpFcb->fcb_fname;
for (loop = FNAME_SIZE; --loop >= 0; )
{
if (*lpszFcbFname != ' ')
*pszBuffer++ = *lpszFcbFname++;
else
break;
}
lpszFcbFext = (BYTE FAR *) lpFcb->fcb_fext;
if (*lpszFcbFext != ' ')
{
*pszBuffer++ = '.';
for (loop = FEXT_SIZE; --loop >= 0; )
{
if (*lpszFcbFext != ' ')
*pszBuffer++ = *lpszFcbFext++;
else
break;
}
}
*pszBuffer = '\0';
*/
truename(loc_szBuffer, szBuffer, FALSE);
/* XXX fix truename error handling */
}
BOOL FcbOpen(xfcb FAR * lpXfcb)
{
WORD sft_idx;
sft FAR *sftp;
struct dhdr FAR *dhp;
COUNT FcbDrive;
/* get a free system file table entry */
if ((sftp = get_free_sft((WORD FAR *) & sft_idx)) == (sft FAR *) - 1)
return DE_TOOMANY;
COUNT FcbDrive, sft_idx;
/* Build a traditional DOS file name */
lpFcb = CommonFcbInit(lpXfcb, PriPathName, &FcbDrive);
sft_idx = DosOpenSft(PriPathName, O_RDWR);
if (sft_idx < 0)
return FALSE;
/* check for a device */
lpFcb->fcb_curec = 0;
lpFcb->fcb_rndm = 0;
lpFcb->fcb_sftno = sft_idx;
dhp = IsDevice(PriPathName);
if (dhp )
{
sftp->sft_count += 1;
sftp->sft_mode = O_RDWR;
sftp->sft_attrib = 0;
sftp->sft_flags =
((dhp->dh_attr & ~SFT_MASK) & ~SFT_FSHARED) | SFT_FDEVICE | SFT_FEOF;
sftp->sft_psp = cu_psp;
fbcopy(lpFcb->fcb_fname, sftp->sft_name, FNAME_SIZE + FEXT_SIZE);
sftp->sft_dev = dhp;
lpFcb->fcb_sftno = sft_idx;
lpFcb->fcb_curec = 0;
lpFcb->fcb_recsiz = 0;
lpFcb->fcb_fsize = 0;
lpFcb->fcb_date = dos_getdate();
lpFcb->fcb_time = dos_gettime();
lpFcb->fcb_rndm = 0;
return TRUE;
}
fbcopy((BYTE FAR *) & lpFcb->fcb_fname, (BYTE FAR *) & sftp->sft_name, FNAME_SIZE + FEXT_SIZE);
if ((UCOUNT)FcbDrive >= lastdrive) {
return DE_INVLDDRV;
}
if (CDSp->cds_table[FcbDrive].cdsFlags & CDSNETWDRV) {
COUNT result;
lpCurSft = (sfttbl FAR *)sftp;
result = -int2f_Remote_call(REM_OPEN, 0, 0, 0, (VOID FAR *) sftp, 0, MK_FP(0, O_RDWR));
sftp->sft_status = result;
}
else {
sftp->sft_status = dos_open(PriPathName, O_RDWR);
sftp->sft_size = dos_getfsize(sftp->sft_status);
dos_getftime(sftp->sft_status,
(date FAR *) & sftp->sft_date,
(time FAR *) & sftp->sft_time);
}
if (sftp->sft_status >= 0)
{
lpFcb->fcb_drive = FcbDrive;
lpFcb->fcb_sftno = sft_idx;
lpFcb->fcb_curec = 0;
lpFcb->fcb_recsiz = 128;
lpFcb->fcb_fsize = sftp->sft_size;
lpFcb->fcb_date = sftp->sft_date;
lpFcb->fcb_time = sftp->sft_time;
lpFcb->fcb_rndm = 0;
sftp->sft_count += 1;
sftp->sft_mode = O_RDWR;
sftp->sft_attrib = 0;
sftp->sft_flags = 0;
sftp->sft_psp = cu_psp;
return TRUE;
lpFcb->fcb_recsiz = 0;
lpFcb->fcb_fsize = 0;
lpFcb->fcb_date = dos_getdate();
lpFcb->fcb_time = dos_gettime();
}
else
return FALSE;
{
sftp = idx_to_sft(sft_idx);
lpFcb->fcb_drive = FcbDrive;
lpFcb->fcb_recsiz = 128;
lpFcb->fcb_fsize = sftp->sft_size;
lpFcb->fcb_date = sftp->sft_date;
lpFcb->fcb_time = sftp->sft_time;
}
return TRUE;
}
BOOL FcbDelete(xfcb FAR * lpXfcb)
@ -819,18 +738,14 @@ BOOL FcbDelete(xfcb FAR * lpXfcb)
COUNT FcbDrive;
/* Build a traditional DOS file name */
CommonFcbInit(lpXfcb, PriPathName, &FcbDrive);
CommonFcbInit(lpXfcb, SecPathName, &FcbDrive);
if ((UCOUNT)FcbDrive >= lastdrive) {
return DE_INVLDDRV;
}
current_ldt = &CDSp->cds_table[FcbDrive];
if (CDSp->cds_table[FcbDrive].cdsFlags & CDSNETWDRV) {
return -int2f_Remote_call(REM_DELETE, 0, 0, 0, 0, 0, 0);
}
/* check for a device */
if (IsDevice(PriPathName))
if (IsDevice(SecPathName))
{
return FALSE;
}
@ -840,20 +755,21 @@ BOOL FcbDelete(xfcb FAR * lpXfcb)
dmatch Dmatch;
dta = (BYTE FAR *) & Dmatch;
if (dos_findfirst(D_ALL, PriPathName[1] == ':' ? &PriPathName[2] : PriPathName) != SUCCESS)
if (DosFindFirst(D_ALL, SecPathName[1] == ':' ? &SecPathName[2] : SecPathName) != SUCCESS)
{
dta = lpOldDta;
return FALSE;
}
do
{
if (dos_delete(Dmatch.dm_name) != SUCCESS)
truename(Dmatch.dm_name, SecPathName, FALSE);
if (DosDelete(SecPathName) != SUCCESS)
{
dta = lpOldDta;
return FALSE;
}
}
while (dos_findnext() == SUCCESS);
while (DosFindNext() == SUCCESS);
dta = lpOldDta;
return TRUE;
}
@ -865,10 +781,10 @@ BOOL FcbRename(xfcb FAR * lpXfcb)
COUNT FcbDrive;
/* Build a traditional DOS file name */
lpRenameFcb = (rfcb FAR *) CommonFcbInit(lpXfcb, PriPathName, &FcbDrive);
lpRenameFcb = (rfcb FAR *) CommonFcbInit(lpXfcb, SecPathName, &FcbDrive);
/* check for a device */
if (IsDevice(PriPathName))
if (IsDevice(SecPathName))
{
return FALSE;
}
@ -878,7 +794,7 @@ BOOL FcbRename(xfcb FAR * lpXfcb)
dmatch Dmatch;
dta = (BYTE FAR *) & Dmatch;
if (dos_findfirst(D_ALL, PriPathName[1] == ':' ? &PriPathName[2] : PriPathName) != SUCCESS)
if (DosFindFirst(D_ALL, SecPathName[1] == ':' ? &SecPathName[2] : SecPathName) != SUCCESS)
{
dta = lpOldDta;
return FALSE;
@ -942,74 +858,38 @@ BOOL FcbRename(xfcb FAR * lpXfcb)
/* now to build a dos name again */
LocalFcb.fcb_drive = 0;
FcbNameInit((fcb FAR *) & LocalFcb, PriPathName, &FcbDrive);
FcbNameInit((fcb FAR *) & LocalFcb, SecPathName, &FcbDrive);
if (dos_rename(Dmatch.dm_name,
PriPathName[1] == ':' ? &PriPathName[2] : PriPathName) != SUCCESS)
truename(Dmatch.dm_name, PriPathName, FALSE);
if (DosRenameTrue(PriPathName, SecPathName) != SUCCESS)
{
dta = lpOldDta;
return FALSE;
}
}
while (dos_findnext() == SUCCESS);
while (DosFindNext() == SUCCESS);
dta = lpOldDta;
return TRUE;
}
}
#if 0
/* TE:the MoveDirInfo() is now done by simply copying the dirEntry into the FCB
this prevents problems with ".", ".." and saves code
BO:use FcbParseFname: avoid redirector problems and is there anyway
*/
void MoveDirInfo(dmatch FAR * lpDmatch, struct dirent FAR * lpDir)
VOID MoveDirInfo(dmatch * lpDmatch, fcb FAR * lpDir)
{
BYTE FAR *lpToName,
FAR * lpszFrom;
COUNT nIndex;
BYTE FAR *lpszFrom = lpDmatch->dm_name;
/* First, expand the find match into dir style */
/* file name entry */
/* Fill with blanks first */
fmemset(lpDir->dir_name, ' ', FNAME_SIZE);
fmemset(lpDir->dir_ext , ' ', FEXT_SIZE );
/* next move in the file name while overwriting */
/* the filler blanks */
lpszFrom = lpDmatch->dm_name;
lpToName = (BYTE FAR *)lpDir->dir_name;
for (nIndex = 0; nIndex < FNAME_SIZE; nIndex++)
{
if (*lpszFrom != 0 && *lpszFrom != '.')
*lpToName++ = *lpszFrom++;
else
break;
}
if (*lpszFrom != '\0')
{
if (*lpszFrom == '.')
++lpszFrom;
lpToName = (BYTE FAR *)lpDir->dir_ext;
for (nIndex = 0; nIndex < FEXT_SIZE; nIndex++)
{
if (*lpszFrom != '\0')
*lpToName++ = *lpszFrom++;
else
break;
}
}
for (nIndex = 0; nIndex < 10; nIndex++)
lpDir->dir_reserved[nIndex] = 0;
lpDir->dir_attrib = lpDmatch->dm_attr_fnd;
lpDir->dir_time = lpDmatch->dm_time;
lpDir->dir_date = lpDmatch->dm_date;
lpDir->dir_start = lpDmatch->dm_cluster;
lpDir->dir_size = lpDmatch->dm_size;
FcbParseFname(PARSE_DFLT_DRIVE | PARSE_SEP_STOP, &lpszFrom, lpDir);
/* lpDir->dir_attrib = lpDmatch->dm_attr_fnd; XXX for extended fcb! */
lpDir->fcb_time = lpDmatch->dm_time;
lpDir->fcb_date = lpDmatch->dm_date;
lpDir->fcb_dirclst = lpDmatch->dm_cluster;
lpDir->fcb_fsize = lpDmatch->dm_size;
}
#endif
BOOL FcbClose(xfcb FAR * lpXfcb)
{
@ -1019,52 +899,37 @@ BOOL FcbClose(xfcb FAR * lpXfcb)
lpFcb = ExtFcbToFcb(lpXfcb);
/* Get the SFT block that contains the SFT */
if ((s = FcbGetSft(lpFcb->fcb_sftno)) == (sft FAR *) - 1)
if ((s = idx_to_sft(lpFcb->fcb_sftno)) == (sft FAR *) - 1)
return FALSE;
/* If this is not opened another error */
if (s->sft_count == 0)
return FALSE;
/* change time and set file size */
s->sft_size = lpFcb->fcb_fsize;
if (!(s->sft_flags & SFT_FSHARED))
dos_setfsize(s->sft_status, lpFcb->fcb_fsize);
DosSetFtimeSft(lpFcb->fcb_sftno, (date FAR *) &lpFcb->fcb_date, (time FAR *) &lpFcb->fcb_time);
return DosCloseSft(lpFcb->fcb_sftno) == SUCCESS;
}
if (s->sft_flags & SFT_FSHARED)
{
int2f_Remote_call(REM_CLOSE, 0, 0, 0, (VOID FAR *) s, 0, 0);
}
/* close all files opened by FCBs
DosCloseSft checks the open count (has to be 1) and current psp
*/
VOID FcbCloseAll()
{
COUNT idx = 0;
/* now just drop the count if a device, else */
/* call file system handler */
if (s->sft_flags & SFT_FDEVICE)
{
s->sft_count -= 1;
return TRUE;
}
else
{
s->sft_count -= 1;
if (s->sft_count > 0)
return SUCCESS;
else
{
/* change time and set file size */
dos_setftime(s->sft_status,
(date FAR *) & lpFcb->fcb_date,
(time FAR *) & lpFcb->fcb_time);
dos_setfsize(s->sft_status,
lpFcb->fcb_fsize);
return dos_close(s->sft_status) == SUCCESS;
}
}
for (idx = 0; DosCloseSft(idx) != DE_INVLDHNDL; idx++)
;
}
BOOL FcbFindFirst(xfcb FAR * lpXfcb)
{
BYTE FAR *lpDir;
fcb FAR *lpDir;
COUNT FcbDrive;
psp FAR *lpPsp = MK_FP(cu_psp, 0);
/* First, move the dta to a local and change it around to match */
/* our functions. */
lpDir = (BYTE FAR *) dta;
lpDir = (fcb FAR *) dta;
dta = (BYTE FAR *) & Dmatch;
/* Next initialze local variables by moving them from the fcb */
@ -1072,28 +937,28 @@ BOOL FcbFindFirst(xfcb FAR * lpXfcb)
if (lpXfcb->xfcb_flag == 0xff)
{
wAttr = lpXfcb->xfcb_attrib;
fbcopy(lpXfcb, lpDir, 7);
/* fbcopy(lpXfcb, lpDir, 7);
lpDir += 7;
BO:WHY???
*/
}
else
wAttr = D_ALL;
*lpDir++ = FcbDrive;
/* *lpDir++ = FcbDrive; */
FcbFindFirstDirPtr = lpDir;
/* FcbFindFirstDirPtr = lpDir; */
if (dos_findfirst(wAttr, SecPathName) != SUCCESS)
if (DosFindFirst(wAttr, SecPathName) != SUCCESS)
{
FcbFindFirstDirPtr = NULL;
/* FcbFindFirstDirPtr = NULL;*/
dta = lpPsp->ps_dta;
return FALSE;
}
FcbFindFirstDirPtr = NULL;
/* FcbFindFirstDirPtr = NULL; */
/*
MoveDirInfo((dmatch FAR *) & Dmatch, (struct dirent FAR *)lpDir);
*/
MoveDirInfo(&Dmatch, lpDir);
lpFcb->fcb_dirclst = Dmatch.dm_dirstart;
lpFcb->fcb_strtclst = Dmatch.dm_entry;
@ -1115,13 +980,13 @@ BOOL FcbFindFirst(xfcb FAR * lpXfcb)
BOOL FcbFindNext(xfcb FAR * lpXfcb)
{
BYTE FAR *lpDir;
fcb FAR *lpDir;
COUNT FcbDrive;
psp FAR *lpPsp = MK_FP(cu_psp, 0);
/* First, move the dta to a local and change it around to match */
/* our functions. */
lpDir = (BYTE FAR *) dta;
lpDir = (fcb FAR *) dta;
dta = (BYTE FAR *) & Dmatch;
/* Next initialze local variables by moving them from the fcb */
@ -1129,14 +994,17 @@ BOOL FcbFindNext(xfcb FAR * lpXfcb)
if ((xfcb FAR *) lpFcb != lpXfcb)
{
wAttr = lpXfcb->xfcb_attrib;
/*
fbcopy(lpXfcb, lpDir, 7);
lpDir += 7;
BO:WHY???
*/
}
else
wAttr = D_ALL;
/* Reconstrct the dirmatch structure from the fcb */
*lpDir++ = FcbDrive;
/* *lpDir++ = FcbDrive; */
Dmatch.dm_drive = lpFcb->fcb_sftno;
fbcopy(lpFcb->fcb_fname, (BYTE FAR *) Dmatch.dm_name_pat, FNAME_SIZE + FEXT_SIZE);
@ -1147,20 +1015,18 @@ BOOL FcbFindNext(xfcb FAR * lpXfcb)
Dmatch.dm_cluster = lpFcb->fcb_dirclst;
Dmatch.dm_dirstart= lpFcb->fcb_dirclst;
FcbFindFirstDirPtr = lpDir;
/* FcbFindFirstDirPtr = lpDir; */
if (dos_findnext() != SUCCESS)
if (DosFindNext() != SUCCESS)
{
FcbFindFirstDirPtr = NULL;
/* FcbFindFirstDirPtr = NULL; */
dta = lpPsp->ps_dta;
CritErrCode = 0x12;
return FALSE;
}
FcbFindFirstDirPtr = NULL;
/*FcbFindFirstDirPtr = NULL;*/
/*
MoveDirInfo((dmatch FAR *) & Dmatch, (struct dirent FAR *)lpDir);
*/
MoveDirInfo(&Dmatch, lpDir);
lpFcb->fcb_dirclst = Dmatch.dm_dirstart;
lpFcb->fcb_strtclst = Dmatch.dm_entry;

View File

@ -567,9 +567,10 @@ StandardBios: /* old way to get parameters */
driveParam->driveno = drive;
DebugPrintf(("drive parameters %02x - %04lu-%u-%u",
drive,driveParam->chs.Cylinder,
drive,driveParam->chs.Head,
drive,driveParam->chs.Sector));
drive,
driveParam->chs.Cylinder,
driveParam->chs.Head,
driveParam->chs.Sector));
DebugPrintf((" total size %luMB\n\n",driveParam->total_sectors/2048));

View File

@ -37,6 +37,9 @@ BYTE *RcsId = "$Id$";
/*
* $Log$
* Revision 1.27 2001/07/23 12:47:42 bartoldeman
* FCB fixes and clean-ups, exec int21/ax=4b01, initdisk.c printf
*
* Revision 1.26 2001/07/22 01:58:58 bartoldeman
* Support for Brian's FORMAT, DJGPP libc compilation, cleanups, MSCDEX
*
@ -1174,8 +1177,6 @@ dispatch:
|| ((psp FAR *) (MK_FP(cu_psp, 0)))->ps_parent == cu_psp)
break;
tsr = FALSE;
int2f_Remote_call(REM_PROCESS_END, 0, 0, 0, 0, 0, 0);
int2f_Remote_call(REM_CLOSEALL, 0, 0, 0, 0, 0, 0);
if (ErrorMode)
{
ErrorMode = FALSE;

View File

@ -34,6 +34,9 @@ static BYTE *Proto_hRcsId = "$Id$";
/*
* $Log$
* Revision 1.19 2001/07/23 12:47:42 bartoldeman
* FCB fixes and clean-ups, exec int21/ax=4b01, initdisk.c printf
*
* Revision 1.18 2001/07/22 01:58:58 bartoldeman
* Support for Brian's FORMAT, DJGPP libc compilation, cleanups, MSCDEX
*
@ -219,29 +222,35 @@ COUNT SftSeek(sft FAR *sftp, LONG new_pos, COUNT mode);
UCOUNT DosWrite(COUNT hndl, UCOUNT n, BYTE FAR * bp, COUNT FAR * err);
COUNT DosSeek(COUNT hndl, LONG new_pos, COUNT mode, ULONG * set_pos);
COUNT DosCreat(BYTE FAR * fname, COUNT attrib);
COUNT DosCreatSft(BYTE * fname, COUNT attrib);
COUNT CloneHandle(COUNT hndl);
COUNT DosDup(COUNT Handle);
COUNT DosForceDup(COUNT OldHandle, COUNT NewHandle);
COUNT DosOpen(BYTE FAR * fname, COUNT mode);
COUNT DosOpenSft(BYTE * fname, COUNT mode);
COUNT DosClose(COUNT hndl);
COUNT DosCloseSft(WORD sft_idx);
VOID DosGetFree(UBYTE drive, COUNT FAR * spc, COUNT FAR * navc, COUNT FAR * bps, COUNT FAR * nc);
COUNT DosGetCuDir(UBYTE drive, BYTE FAR * s);
COUNT DosChangeDir(BYTE FAR * s);
COUNT DosFindFirst(UCOUNT attr, BYTE FAR * name);
COUNT DosFindNext(void);
COUNT DosGetFtime(COUNT hndl, date FAR * dp, time FAR * tp);
COUNT DosSetFtime(COUNT hndl, date FAR * dp, time FAR * tp);
COUNT DosSetFtimeSft(WORD sft_idx, date FAR * dp, time FAR * tp);
#define DosSetFtime(hndl, dp, tp) DosSetFtimeSft(get_sft_idx(hndl), (dp), (tp))
COUNT DosGetFattr(BYTE FAR * name);
COUNT DosSetFattr(BYTE FAR * name, UWORD attrp);
UBYTE DosSelectDrv(UBYTE drv);
COUNT DosDelete(BYTE FAR *path);
COUNT DosRename(BYTE FAR * path1, BYTE FAR * path2);
COUNT DosRenameTrue(BYTE * path1, BYTE * path2);
COUNT DosMkdir(BYTE FAR * dir);
COUNT DosRmdir(BYTE FAR * dir);
struct dhdr FAR * IsDevice(BYTE FAR * FileName);
BOOL IsShareInstalled(void);
COUNT DosLockUnlock(COUNT hndl, LONG pos, LONG len, COUNT unlock);
sft FAR *get_free_sft(WORD FAR * sft_idx);
sft FAR *idx_to_sft(COUNT SftIndex);
COUNT get_sft_idx(UCOUNT hndl);
/*dosidle.asm */
VOID DosIdle_int(void);
@ -348,8 +357,9 @@ void FcbNameInit(fcb FAR * lpFcb, BYTE * pszBuffer, COUNT * pCurDrive);
BOOL FcbOpen(xfcb FAR * lpXfcb);
BOOL FcbDelete(xfcb FAR * lpXfcb);
BOOL FcbRename(xfcb FAR * lpXfcb);
void MoveDirInfo(dmatch FAR * lpDmatch, struct dirent FAR * lpDir);
VOID MoveDirInfo(dmatch * lpDmatch, fcb FAR * lpDir);
BOOL FcbClose(xfcb FAR * lpXfcb);
VOID FcbCloseAll(VOID);
BOOL FcbFindFirst(xfcb FAR * lpXfcb);
BOOL FcbFindNext(xfcb FAR * lpXfcb);
@ -476,6 +486,7 @@ COUNT ChildEnv(exec_blk FAR * exp, UWORD * pChildEnvSeg, char far * pathname);
VOID new_psp(psp FAR * p, int psize);
VOID return_user(void);
COUNT DosExec(COUNT mode, exec_blk FAR * ep, BYTE FAR * lp);
LONG DosGetFsize(COUNT hndl);
VOID InitPSP(VOID);
/* newstuff.c */

View File

@ -35,6 +35,9 @@ static BYTE *RcsId = "$Id$";
/*
* $Log$
* Revision 1.16 2001/07/23 12:47:42 bartoldeman
* FCB fixes and clean-ups, exec int21/ax=4b01, initdisk.c printf
*
* Revision 1.15 2001/07/22 01:58:58 bartoldeman
* Support for Brian's FORMAT, DJGPP libc compilation, cleanups, MSCDEX
*
@ -207,10 +210,6 @@ LONG DosGetFsize(COUNT hndl)
sft FAR *s;
/* sfttbl FAR *sp;*/
/* Test that the handle is valid */
if (hndl < 0)
return DE_INVLDHNDL;
/* Get the SFT block that contains the SFT */
if ((s = get_sft(hndl)) == (sft FAR *) - 1)
return DE_INVLDHNDL;
@ -389,8 +388,8 @@ VOID new_psp(psp FAR * p, int psize)
RootPsp = FP_SEG(p);
}
static VOID patchPSP(UWORD pspseg, UWORD envseg, CommandTail FAR * cmdline
,BYTE FAR * fnam)
static UWORD patchPSP(UWORD pspseg, UWORD envseg, exec_blk FAR *exb,
BYTE FAR * fnam)
{
psp FAR *psp;
mcb FAR *pspmcb;
@ -401,9 +400,11 @@ static VOID patchPSP(UWORD pspseg, UWORD envseg, CommandTail FAR * cmdline
++pspseg;
psp = MK_FP(pspseg, 0);
/* complete the psp by adding the command line */
fbcopy(cmdline->ctBuffer, psp->ps_cmd, 127);
psp->ps_cmd_count = cmdline->ctCount;
/* complete the psp by adding the command line and FCBs */
fbcopy(exb->exec.cmd_line->ctBuffer, psp->ps_cmd, 127);
fbcopy(exb->exec.fcb_1, &psp->ps_fcb1, 16);
fbcopy(exb->exec.fcb_2, &psp->ps_fcb2, 16);
psp->ps_cmd_count = exb->exec.cmd_line->ctCount;
/* identify the mcb as this functions' */
pspmcb->m_psp = pspseg;
@ -438,6 +439,11 @@ set_name:
if (i < 8)
pspmcb->m_name[i] = '\0';
/* return value: AX value to be passed based on FCB values */
return ((psp->ps_fcb1.fcb_drive<lastdrive &&
CDSp->cds_table[psp->ps_fcb1.fcb_drive].cdsFlags & CDSVALID) ? 0 : 0xff) +
((psp->ps_fcb2.fcb_drive<lastdrive &&
CDSp->cds_table[psp->ps_fcb2.fcb_drive].cdsFlags & CDSVALID) ? 0 : 0xff) * 0x100;
}
COUNT DosComLoader(BYTE FAR * namep, exec_blk FAR * exp, COUNT mode)
@ -559,37 +565,37 @@ COUNT DosComLoader(BYTE FAR * namep, exec_blk FAR * exp, COUNT mode)
setvec(0x22, (VOID(INRPT FAR *) (VOID)) MK_FP(user_r->CS, user_r->IP));
new_psp(p, mem + asize);
patchPSP(mem - 1, env, exp->exec.cmd_line, namep);
/* build the user area on the stack */
*((UWORD FAR *) MK_FP(mem, 0xfffe)) = (UWORD) 0;
irp = MK_FP(mem, (0xfffe - sizeof(iregs)));
/* start allocating REGs */
irp->ES = irp->DS = mem;
irp->CS = mem;
irp->IP = 0x100;
irp->AX = 0xffff; /* for now, until fcb code is in */
irp->BX =
irp->CX =
irp->DX =
irp->SI =
irp->DI =
irp->BP = 0;
irp->FLAGS = 0x200;
asize = patchPSP(mem - 1, env, exp, namep); /* asize=fcbcode for ax */
/* Transfer control to the executable */
p->ps_parent = cu_psp;
p->ps_prevpsp = (BYTE FAR *) MK_FP(cu_psp, 0);
q->ps_stack = (BYTE FAR *) user_r;
user_r->FLAGS &= ~FLG_CARRY;
cu_psp = mem;
dta = p->ps_dta;
switch (mode)
{
case LOADNGO:
{
cu_psp = mem;
dta = p->ps_dta;
*((UWORD FAR *) MK_FP(mem, 0xfffe)) = (UWORD) 0;
/* build the user area on the stack */
irp = MK_FP(mem, (0xfffe - sizeof(iregs)));
/* start allocating REGs */
irp->ES = irp->DS = mem;
irp->CS = mem;
irp->IP = 0x100;
irp->AX = asize; /* fcbcode */
irp->BX =
irp->CX =
irp->DX =
irp->SI =
irp->DI =
irp->BP = 0;
irp->FLAGS = 0x200;
if (InDOS)
--InDOS;
@ -600,9 +606,9 @@ COUNT DosComLoader(BYTE FAR * namep, exec_blk FAR * exp, COUNT mode)
break;
}
case LOAD:
cu_psp = mem;
exp->exec.stack = (BYTE FAR *) irp;
exp->exec.start_addr = MK_FP(irp->CS, irp->IP);
exp->exec.stack = MK_FP(mem, 0xfffe);
*((UWORD FAR *)exp->exec.stack) = asize;
exp->exec.start_addr = MK_FP(mem, 0x100);
return SUCCESS;
}
@ -626,12 +632,15 @@ VOID return_user(void)
setvec(0x24, p->ps_isv24);
/* And free all process memory if not a TSR return */
int2f_Remote_call(REM_PROCESS_END, 0, 0, 0, 0, 0, 0);
if (!tsr)
{
int2f_Remote_call(REM_CLOSEALL, 0, 0, 0, 0, 0, 0);
for (i = 0; i < p->ps_maxfiles; i++)
{
DosClose(i);
}
FcbCloseAll();
FreeProcessMem(cu_psp);
}
@ -917,25 +926,7 @@ COUNT DosExeLoader(BYTE FAR * namep, exec_blk FAR * exp, COUNT mode)
setvec(0x22, (VOID(INRPT FAR *) (VOID)) MK_FP(user_r->CS, user_r->IP));
new_psp(p, mem + asize);
patchPSP(mem - 1, env, exp->exec.cmd_line, namep);
/* build the user area on the stack */
irp = MK_FP(header.exInitSS + start_seg,
((header.exInitSP - sizeof(iregs)) & 0xffff));
/* start allocating REGs */
/* Note: must match es & ds memory segment */
irp->ES = irp->DS = mem;
irp->CS = header.exInitCS + start_seg;
irp->IP = header.exInitIP;
irp->AX = 0xffff; /* for now, until fcb code is in */
irp->BX =
irp->CX =
irp->DX =
irp->SI =
irp->DI =
irp->BP = 0;
irp->FLAGS = 0x200;
asize = patchPSP(mem - 1, env, exp, namep); /* asize = fcbcode */
/* Transfer control to the executable */
p->ps_parent = cu_psp;
@ -946,6 +937,24 @@ COUNT DosExeLoader(BYTE FAR * namep, exec_blk FAR * exp, COUNT mode)
switch (mode)
{
case LOADNGO:
/* build the user area on the stack */
irp = MK_FP(header.exInitSS + start_seg,
((header.exInitSP - sizeof(iregs)) & 0xffff));
/* start allocating REGs */
/* Note: must match es & ds memory segment */
irp->ES = irp->DS = mem;
irp->CS = header.exInitCS + start_seg;
irp->IP = header.exInitIP;
irp->AX = asize; /* asize = fcbcode */
irp->BX =
irp->CX =
irp->DX =
irp->SI =
irp->DI =
irp->BP = 0;
irp->FLAGS = 0x200;
cu_psp = mem;
dta = p->ps_dta;
@ -958,8 +967,9 @@ COUNT DosExeLoader(BYTE FAR * namep, exec_blk FAR * exp, COUNT mode)
case LOAD:
cu_psp = mem;
exp->exec.stack = (BYTE FAR *) irp;
exp->exec.start_addr = MK_FP(irp->CS, irp->IP);
exp->exec.stack = MK_FP(header.exInitSS + start_seg, header.exInitSP);
*((UWORD FAR *) exp->exec.stack) = asize; /* fcbcode */
exp->exec.start_addr = MK_FP(header.exInitCS + start_seg, header.exInitIP);
return SUCCESS;
}
return DE_INVLDFMT;