doscalls: Implemented DosCreateDir and Dos16MkDir

Not sure what Dos16MkDir2 is--probably a large extended attributes struct?--
but the real OS/2 toolkit defines DosMkDir and DosMkDir2 to be DosCreateDir,
so hopefully this is fine in general.
This commit is contained in:
Ryan C. Gordon committed 2022-01-29 16:31:06 -05:00
1 parent e301ebf8d9
commit e993edf411
3 files changed
+76

No files matched your search

+19
View File
@@ -133,6 +133,12 @@ static APIRET16 bridge16to32_Dos16FindNext(uint8 *args) {
return Dos16FindNext(hDir, pfindbuf, cbfindbuf, pcFilenames);
}
static APIRET16 bridge16to32_Dos16MkDir(uint8 *args) {
LX_NATIVE_MODULE_16BIT_BRIDGE_PTRARG(PEAOP2, peaop2);
LX_NATIVE_MODULE_16BIT_BRIDGE_PTRARG(PSZ, pszDirName);
return Dos16MkDir(pszDirName, peaop2);
}
static APIRET16 bridge16to32_Dos16Open(uint8 *args) {
LX_NATIVE_MODULE_16BIT_BRIDGE_PTRARG(PEAOP2, peaop2);
LX_NATIVE_MODULE_16BIT_BRIDGE_ARG(USHORT, fsOpenMode);
@@ -259,6 +265,12 @@ static APIRET16 bridge16to32_Dos16ExecPgm(uint8 *args) {
return Dos16ExecPgm(pObjname, cbObjname, execFlag, pArg, pEnv, pRes, pName);
}
static APIRET16 bridge16to32_Dos16MkDir2(uint8 *args) {
LX_NATIVE_MODULE_16BIT_BRIDGE_PTRARG(PEAOP2, peaop2);
LX_NATIVE_MODULE_16BIT_BRIDGE_PTRARG(PSZ, pszDirName);
return Dos16MkDir2(pszDirName, peaop2);
}
LX_NATIVE_MODULE_16BIT_SUPPORT()
LX_NATIVE_MODULE_16BIT_API(Dos16CWait)
LX_NATIVE_MODULE_16BIT_API(Dos16Exit)
@@ -279,6 +291,7 @@ LX_NATIVE_MODULE_16BIT_SUPPORT()
LX_NATIVE_MODULE_16BIT_API(Dos16FindClose)
LX_NATIVE_MODULE_16BIT_API(Dos16FindFirst)
LX_NATIVE_MODULE_16BIT_API(Dos16FindNext)
LX_NATIVE_MODULE_16BIT_API(Dos16MkDir)
LX_NATIVE_MODULE_16BIT_API(Dos16Open)
LX_NATIVE_MODULE_16BIT_API(Dos16QCurDir)
LX_NATIVE_MODULE_16BIT_API(Dos16QCurDisk)
@@ -297,6 +310,7 @@ LX_NATIVE_MODULE_16BIT_SUPPORT()
LX_NATIVE_MODULE_16BIT_API(DosSemWait)
LX_NATIVE_MODULE_16BIT_API(DosSemSet)
LX_NATIVE_MODULE_16BIT_API(Dos16ExecPgm)
LX_NATIVE_MODULE_16BIT_API(Dos16MkDir2)
LX_NATIVE_MODULE_16BIT_SUPPORT_END()
LX_NATIVE_MODULE_DEINIT({
@@ -324,6 +338,7 @@ static int init16_doscalls(void) {
LX_NATIVE_INIT_16BIT_BRIDGE(Dos16FindClose, 2)
LX_NATIVE_INIT_16BIT_BRIDGE(Dos16FindFirst, 24)
LX_NATIVE_INIT_16BIT_BRIDGE(Dos16FindNext, 12)
LX_NATIVE_INIT_16BIT_BRIDGE(Dos16MkDir, 8)
LX_NATIVE_INIT_16BIT_BRIDGE(Dos16Open, 26)
LX_NATIVE_INIT_16BIT_BRIDGE(Dos16QCurDir, 10)
LX_NATIVE_INIT_16BIT_BRIDGE(Dos16QCurDisk, 8)
@@ -342,6 +357,7 @@ static int init16_doscalls(void) {
LX_NATIVE_INIT_16BIT_BRIDGE(DosSemWait, 8)
LX_NATIVE_INIT_16BIT_BRIDGE(DosSemSet, 4)
LX_NATIVE_INIT_16BIT_BRIDGE(Dos16ExecPgm, 24)
LX_NATIVE_INIT_16BIT_BRIDGE(Dos16MkDir2, 8)
LX_NATIVE_MODULE_INIT_16BIT_SUPPORT_END()
return 1;
}
@@ -366,6 +382,7 @@ LX_NATIVE_MODULE_INIT({ if (!init16_doscalls()) return 0; })
LX_NATIVE_EXPORT16(Dos16FindClose, 63),
LX_NATIVE_EXPORT16(Dos16FindFirst, 64),
LX_NATIVE_EXPORT16(Dos16FindNext, 65),
LX_NATIVE_EXPORT16(Dos16MkDir, 66),
LX_NATIVE_EXPORT16(Dos16Open, 70),
LX_NATIVE_EXPORT16(Dos16QCurDir, 71),
LX_NATIVE_EXPORT16(Dos16QCurDisk, 72),
@@ -384,6 +401,7 @@ LX_NATIVE_MODULE_INIT({ if (!init16_doscalls()) return 0; })
LX_NATIVE_EXPORT16(DosSemWait, 142),
LX_NATIVE_EXPORT16(DosSemSet, 143),
LX_NATIVE_EXPORT16(Dos16ExecPgm, 144),
LX_NATIVE_EXPORT16(Dos16MkDir2, 185),
LX_NATIVE_EXPORT(DosSetMaxFH, 209),
LX_NATIVE_EXPORT(DosSetPathInfo, 219),
LX_NATIVE_EXPORT(DosQueryPathInfo, 223),
@@ -402,6 +420,7 @@ LX_NATIVE_MODULE_INIT({ if (!init16_doscalls()) return 0; })
LX_NATIVE_EXPORT(DosFindClose, 263),
LX_NATIVE_EXPORT(DosFindFirst, 264),
LX_NATIVE_EXPORT(DosFindNext, 265),
LX_NATIVE_EXPORT(DosCreateDir, 270),
LX_NATIVE_EXPORT(DosSetFileSize, 272),
LX_NATIVE_EXPORT(DosOpen, 273),
LX_NATIVE_EXPORT(DosQueryCurrentDir, 274),
+54
View File
@@ -2947,6 +2947,47 @@ APIRET DosSetCurrentDir(PSZ pszName)
} // DosSetCurrentDir
static APIRET DosCreateDir_implementation(PSZ pszDirName, PEAOP2 peaop2)
{
if (peaop2 != NULL) {
FIXME("EAs not yet implemented");
return ERROR_EA_LIST_INCONSISTENT;
}
uint32 err = 0;
char *path = makeUnixPath(pszDirName, &err);
if (!path) return (APIRET) err;
const int rc = mkdir(path, 0755);
free(path);
if (rc == -1) {
switch (errno) {
case EACCES: return ERROR_ACCESS_DENIED;
case EBUSY: return ERROR_ACCESS_DENIED;
case EISDIR: return ERROR_ACCESS_DENIED;
case ENAMETOOLONG: return ERROR_FILENAME_EXCED_RANGE;
case ENOENT: return ERROR_FILE_NOT_FOUND; // !!! FIXME: could be PATH_NOT_FOUND too, depending on circumstances.
case ENOTDIR: return ERROR_PATH_NOT_FOUND;
case EPERM: return ERROR_ACCESS_DENIED;
case EROFS: return ERROR_ACCESS_DENIED;
case ETXTBSY: return ERROR_ACCESS_DENIED;
default: return ERROR_INVALID_PARAMETER; // !!! FIXME: debug logging about missin errno case.
}
__builtin_unreachable();
}
return NO_ERROR;
} // DosCreateDir_implementation
APIRET DosCreateDir(PSZ pszDirName, PEAOP2 peaop2)
{
TRACE_NATIVE("DosCreateDir('%s', %p)", pszDirName, peaop2);
return DosCreateDir_implementation(pszDirName, peaop2);
} // DosCreateDir
#if !LX_LEGACY
ULONG DosSelToFlat(VOID) { return 0; }
#else
@@ -3620,6 +3661,19 @@ APIRET16 Dos16Beep(USHORT freq, USHORT duration)
} // Dos16Beep
APIRET16 Dos16MkDir(PSZ pszDirName, PEAOP2 peaop2)
{
TRACE_NATIVE("Dos16MkDir('%s', %p)", pszDirName, peaop2);
return DosCreateDir_implementation(pszDirName, peaop2);
}
APIRET16 Dos16MkDir2(PSZ pszDirName, PEAOP2 peaop2) // !!! FIXME: check this.
{
TRACE_NATIVE("Dos16MkDir('%s', %p)", pszDirName, peaop2);
return DosCreateDir_implementation(pszDirName, peaop2);
}
LX_NATIVE_CONSTRUCTOR(doscalls)
{
GLoaderState.dosExit = DosExit;
+3
View File
@@ -545,6 +545,8 @@ OS2EXPORT APIRET16 OS2API16 Dos16ExecPgm(PCHAR pObjname, SHORT cbObjname, USHORT
OS2EXPORT APIRET16 OS2API16 Dos16CWait(USHORT action, USHORT option, PRESULTCODES16 pres, PUSHORT ppid, USHORT pid) OS2APIINFO(2);
OS2EXPORT APIRET16 OS2API16 Dos16ChgFilePtr(USHORT handle, LONG distance, USHORT whence, PULONG newoffset) OS2APIINFO(58);
OS2EXPORT APIRET16 OS2API16 Dos16Beep(USHORT freq, USHORT dur) OS2APIINFO(50);
OS2EXPORT APIRET16 OS2API16 Dos16MkDir(PSZ pszDirName, PEAOP2 peaop2) OS2APIINFO(66); // !!! FIXME: check this one
OS2EXPORT APIRET16 OS2API16 Dos16MkDir2(PSZ pszDirName, PEAOP2 peaop2) OS2APIINFO(185); // !!! FIXME: check this one
// !!! FIXME: these should probably get sorted alphabetically and/or grouped
// !!! FIXME: into areas of functionality, but for now, I'm just listing them
@@ -621,6 +623,7 @@ OS2EXPORT APIRET OS2API DosQueryFSAttach(PSZ pszDeviceName, ULONG ulOrdinal, ULO
OS2EXPORT APIRET OS2API DosSetFileSize(HFILE hFile, ULONG cbSize) OS2APIINFO(272);
OS2EXPORT APIRET OS2API DosSetCurrentDir(PSZ pszName) OS2APIINFO(255);
OS2EXPORT APIRET OS2API DosBeep(ULONG freq, ULONG dur) OS2APIINFO(286);
OS2EXPORT APIRET OS2API DosCreateDir(PSZ pszDirName, PEAOP2 peaop2) OS2APIINFO(270);
#ifdef __cplusplus
}