Changed CreateDirectory LastError returns to match Win32 (found out by

experiment). Adapted int21 CreateDirectory call to still return the
correct DOS error codes according to Ralph Brown.
This commit is contained in:
Marcus Meissner 1999-02-28 19:50:39 +00:00 committed by Alexandre Julliard
parent 4d4b5a9a2f
commit 412d025243
2 changed files with 34 additions and 5 deletions

View File

@ -295,6 +295,13 @@ BOOL16 WINAPI CreateDirectory16( LPCSTR path, LPVOID dummy )
/*********************************************************************** /***********************************************************************
* CreateDirectory32A (KERNEL32.39) * CreateDirectory32A (KERNEL32.39)
* RETURNS:
* TRUE : success
* FALSE : failure
* ERROR_DISK_FULL: on full disk
* ERROR_ALREADY_EXISTS: if directory name exists (even as file)
* ERROR_ACCESS_DENIED: on permission problems
* ERROR_FILENAME_EXCED_RANGE: too long filename(s)
*/ */
BOOL WINAPI CreateDirectoryA( LPCSTR path, BOOL WINAPI CreateDirectoryA( LPCSTR path,
LPSECURITY_ATTRIBUTES lpsecattribs ) LPSECURITY_ATTRIBUTES lpsecattribs )
@ -309,10 +316,15 @@ BOOL WINAPI CreateDirectoryA( LPCSTR path,
return FALSE; return FALSE;
} }
if (!DOSFS_GetFullName( path, FALSE, &full_name )) return 0; if (!DOSFS_GetFullName( path, FALSE, &full_name )) return 0;
if ((mkdir( full_name.long_name, 0777 ) == -1) && (errno != EEXIST)) if (mkdir( full_name.long_name, 0777 ) == -1) {
{
WARN (file, "Errno %i trying to create directory %s.\n", errno, full_name.long_name); WARN (file, "Errno %i trying to create directory %s.\n", errno, full_name.long_name);
FILE_SetDosError(); /* the FILE_SetDosError() generated error codes don't match the
* CreateDirectory ones for some errnos */
switch (errno) {
case EEXIST: SetLastError(ERROR_ALREADY_EXISTS); break;
case ENOSPC: SetLastError(ERROR_DISK_FULL); break;
default: FILE_SetDosError();break;
}
return FALSE; return FALSE;
} }
return TRUE; return TRUE;

View File

@ -1010,12 +1010,14 @@ static void INT21_GetExtendedError( CONTEXT *context )
action = SA_Abort; action = SA_Abort;
locus = EL_Unknown; locus = EL_Unknown;
break; break;
case ERROR_DISK_FULL:
case ERROR_HANDLE_DISK_FULL: case ERROR_HANDLE_DISK_FULL:
class = EC_MediaError; class = EC_MediaError;
action = SA_Abort; action = SA_Abort;
locus = EL_Disk; locus = EL_Disk;
break; break;
case ERROR_FILE_EXISTS: case ERROR_FILE_EXISTS:
case ERROR_ALREADY_EXISTS:
class = EC_Exists; class = EC_Exists;
action = SA_Abort; action = SA_Abort;
locus = EL_Disk; locus = EL_Disk;
@ -1469,6 +1471,21 @@ void WINAPI DOS3Call( CONTEXT *context )
(LPCSTR)CTX_SEG_OFF_TO_LIN(context, DS_reg(context), EDX_reg(context))); (LPCSTR)CTX_SEG_OFF_TO_LIN(context, DS_reg(context), EDX_reg(context)));
bSetDOSExtendedError = (!CreateDirectory16( CTX_SEG_OFF_TO_LIN(context, DS_reg(context), bSetDOSExtendedError = (!CreateDirectory16( CTX_SEG_OFF_TO_LIN(context, DS_reg(context),
EDX_reg(context) ), NULL)); EDX_reg(context) ), NULL));
/* FIXME: CreateDirectory's LastErrors will clash with the ones
* used by dos. AH=39 only returns 3 (path not found) and 5 (access
* denied), while CreateDirectory return several ones. remap some of
* them. -Marcus
*/
if (bSetDOSExtendedError) {
switch (GetLastError()) {
case ERROR_ALREADY_EXISTS:
case ERROR_FILENAME_EXCED_RANGE:
case ERROR_DISK_FULL:
SetLastError(ERROR_ACCESS_DENIED);
break;
default: break;
}
}
break; break;
case 0x3a: /* "RMDIR" - REMOVE SUBDIRECTORY */ case 0x3a: /* "RMDIR" - REMOVE SUBDIRECTORY */