Don't call truename from FcbNameInit(). It was only necessary for "FcbRename",

which can call it itself. This avoids yesterday's hack.


git-svn-id: https://svn.code.sf.net/p/freedos/svn/kernel/trunk@778 6ac86273-5f31-0410-b378-82cca8765d1b
This commit is contained in:
Bart Oldeman 2004-02-09 19:32:22 +00:00
parent b34b68a265
commit 0081bfe408
2 changed files with 10 additions and 28 deletions

View File

@ -43,7 +43,7 @@ static BYTE *RcsId =
STATIC fcb FAR *ExtFcbToFcb(xfcb FAR * lpExtFcb); STATIC fcb FAR *ExtFcbToFcb(xfcb FAR * lpExtFcb);
STATIC fcb FAR *CommonFcbInit(xfcb FAR * lpExtFcb, BYTE * pszBuffer, STATIC fcb FAR *CommonFcbInit(xfcb FAR * lpExtFcb, BYTE * pszBuffer,
COUNT * pCurDrive); COUNT * pCurDrive);
STATIC int FcbNameInit(fcb FAR * lpFcb, BYTE * pszBuffer, COUNT * pCurDrive); STATIC void FcbNameInit(fcb FAR * lpFcb, BYTE * pszBuffer, COUNT * pCurDrive);
STATIC void FcbNextRecord(fcb FAR * lpFcb); STATIC void FcbNextRecord(fcb FAR * lpFcb);
STATIC void FcbCalcRec(xfcb FAR * lpXfcb); STATIC void FcbCalcRec(xfcb FAR * lpXfcb);
@ -400,20 +400,10 @@ UBYTE FcbOpen(xfcb FAR * lpXfcb, unsigned flags)
/* Build a traditional DOS file name */ /* Build a traditional DOS file name */
fcb FAR *lpFcb = CommonFcbInit(lpXfcb, SecPathName, &FcbDrive); fcb FAR *lpFcb = CommonFcbInit(lpXfcb, SecPathName, &FcbDrive);
if (lpFcb == NULL)
return FCB_ERROR;
if ((flags & O_CREAT) && lpXfcb->xfcb_flag == 0xff) if ((flags & O_CREAT) && lpXfcb->xfcb_flag == 0xff)
/* pass attribute without constraints (dangerous for directories) */ /* pass attribute without constraints (dangerous for directories) */
attr = lpXfcb->xfcb_attrib; attr = lpXfcb->xfcb_attrib;
/* for c:/nul c:nul must be opened instead!
* this is a consequence of truename's funny behaviour:
* truename(c:nul) = c:/nul and truename(c:/nul) = c:\nul
* and for FCBs it's easiest to call truename twice
*/
if (SecPathName[2] == '/')
strcpy(&SecPathName[2], &SecPathName[3]);
sft_idx = (short)DosOpenSft(SecPathName, flags, attr); sft_idx = (short)DosOpenSft(SecPathName, flags, attr);
if (sft_idx < 0) if (sft_idx < 0)
{ {
@ -459,17 +449,14 @@ STATIC fcb FAR *CommonFcbInit(xfcb FAR * lpExtFcb, BYTE * pszBuffer,
sda_lpFcb = lpFcb = ExtFcbToFcb(lpExtFcb); sda_lpFcb = lpFcb = ExtFcbToFcb(lpExtFcb);
/* Build a traditional DOS file name */ /* Build a traditional DOS file name */
if (FcbNameInit(lpFcb, pszBuffer, pCurDrive) < SUCCESS) FcbNameInit(lpFcb, pszBuffer, pCurDrive);
return NULL;
/* and return the fcb pointer */ /* and return the fcb pointer */
return lpFcb; return lpFcb;
} }
int FcbNameInit(fcb FAR * lpFcb, BYTE * szBuffer, COUNT * pCurDrive) STATIC void FcbNameInit(fcb FAR * lpFcb, BYTE * szBuffer, COUNT * pCurDrive)
{ {
BYTE loc_szBuffer[2 + FNAME_SIZE + 1 + FEXT_SIZE + 1]; /* 'A:' + '.' + '\0' */ BYTE *pszBuffer = szBuffer;
BYTE *pszBuffer = loc_szBuffer;
/* Build a traditional DOS file name */ /* Build a traditional DOS file name */
*pCurDrive = default_drive + 1; *pCurDrive = default_drive + 1;
@ -481,7 +468,6 @@ int FcbNameInit(fcb FAR * lpFcb, BYTE * szBuffer, COUNT * pCurDrive)
pszBuffer += 2; pszBuffer += 2;
} }
ConvertName83ToNameSZ(pszBuffer, lpFcb->fcb_fname); ConvertName83ToNameSZ(pszBuffer, lpFcb->fcb_fname);
return truename(loc_szBuffer, szBuffer, CDS_MODE_CHECK_DEV_PATH|CDS_MODE_ALLOW_WILDCARDS);
} }
UBYTE FcbDelete(xfcb FAR * lpXfcb) UBYTE FcbDelete(xfcb FAR * lpXfcb)
@ -493,7 +479,7 @@ UBYTE FcbDelete(xfcb FAR * lpXfcb)
/* Build a traditional DOS file name */ /* Build a traditional DOS file name */
fcb FAR *lpFcb = CommonFcbInit(lpXfcb, SecPathName, &FcbDrive); fcb FAR *lpFcb = CommonFcbInit(lpXfcb, SecPathName, &FcbDrive);
/* check for a device */ /* check for a device */
if (lpFcb == NULL || IsDevice(SecPathName)) if (IsDevice(SecPathName))
{ {
result = FCB_ERROR; result = FCB_ERROR;
} }
@ -535,7 +521,7 @@ UBYTE FcbRename(xfcb FAR * lpXfcb)
lpRenameFcb = (rfcb FAR *) CommonFcbInit(lpXfcb, SecPathName, &FcbDrive); lpRenameFcb = (rfcb FAR *) CommonFcbInit(lpXfcb, SecPathName, &FcbDrive);
/* check for a device */ /* check for a device */
if (lpRenameFcb == NULL || IsDevice(SecPathName)) if (IsDevice(SecPathName))
{ {
result = FCB_ERROR; result = FCB_ERROR;
} }
@ -552,6 +538,8 @@ UBYTE FcbRename(xfcb FAR * lpXfcb)
} }
else do else do
{ {
/* 'A:' + '.' + '\0' */
BYTE loc_szBuffer[2 + FNAME_SIZE + 1 + FEXT_SIZE + 1];
fcb LocalFcb; fcb LocalFcb;
BYTE *pToName; BYTE *pToName;
const BYTE FAR *pFromPattern = Dmatch.dm_name; const BYTE FAR *pFromPattern = Dmatch.dm_name;
@ -583,7 +571,8 @@ UBYTE FcbRename(xfcb FAR * lpXfcb)
} }
/* now to build a dos name again */ /* now to build a dos name again */
LocalFcb.fcb_drive = FcbDrive; LocalFcb.fcb_drive = FcbDrive;
result = FcbNameInit((fcb FAR *) & LocalFcb, SecPathName, &FcbDrive); FcbNameInit(&LocalFcb, loc_szBuffer, &FcbDrive);
result = truename(loc_szBuffer, SecPathName, 0);
if (result < SUCCESS || (!(result & IS_NETWORK) && (result & IS_DEVICE))) if (result < SUCCESS || (!(result & IS_NETWORK) && (result & IS_DEVICE)))
{ {
result = FCB_ERROR; result = FCB_ERROR;
@ -660,9 +649,6 @@ UBYTE FcbFindFirstNext(xfcb FAR * lpXfcb, BOOL First)
/* Next initialze local variables by moving them from the fcb */ /* Next initialze local variables by moving them from the fcb */
lpFcb = CommonFcbInit(lpXfcb, SecPathName, &FcbDrive); lpFcb = CommonFcbInit(lpXfcb, SecPathName, &FcbDrive);
if (lpFcb == NULL)
return FCB_ERROR;
/* Reconstrct the dirmatch structure from the fcb - doesn't hurt for first */ /* Reconstrct the dirmatch structure from the fcb - doesn't hurt for first */
Dmatch.dm_drive = lpFcb->fcb_sftno; Dmatch.dm_drive = lpFcb->fcb_sftno;
@ -682,9 +668,6 @@ UBYTE FcbFindFirstNext(xfcb FAR * lpXfcb, BOOL First)
lpDir += 7; lpDir += 7;
} }
/* for c:/nul c:nul must be opened instead! (see above) */
if (SecPathName[2] == '/')
strcpy(&SecPathName[2], &SecPathName[3]);
CritErrCode = -(First ? DosFindFirst(wAttr, SecPathName) : DosFindNext()); CritErrCode = -(First ? DosFindFirst(wAttr, SecPathName) : DosFindNext());
if (CritErrCode != SUCCESS) if (CritErrCode != SUCCESS)
{ {

View File

@ -214,7 +214,6 @@ void FcbSetRandom(xfcb FAR * lpXfcb);
UBYTE FcbRandomBlockIO(xfcb FAR * lpXfcb, UWORD *nRecords, int mode); UBYTE FcbRandomBlockIO(xfcb FAR * lpXfcb, UWORD *nRecords, int mode);
UBYTE FcbRandomIO(xfcb FAR * lpXfcb, int mode); UBYTE FcbRandomIO(xfcb FAR * lpXfcb, int mode);
UBYTE FcbOpen(xfcb FAR * lpXfcb, unsigned flags); UBYTE FcbOpen(xfcb FAR * lpXfcb, unsigned flags);
int FcbNameInit(fcb FAR * lpFcb, BYTE * pszBuffer, COUNT * pCurDrive);
UBYTE FcbDelete(xfcb FAR * lpXfcb); UBYTE FcbDelete(xfcb FAR * lpXfcb);
UBYTE FcbRename(xfcb FAR * lpXfcb); UBYTE FcbRename(xfcb FAR * lpXfcb);
UBYTE FcbClose(xfcb FAR * lpXfcb); UBYTE FcbClose(xfcb FAR * lpXfcb);