diff --git a/native/doscalls-lx.h b/native/doscalls-lx.h index 201ac56..13934ad 100644 --- a/native/doscalls-lx.h +++ b/native/doscalls-lx.h @@ -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), diff --git a/native/doscalls.c b/native/doscalls.c index 4115b6f..a109124 100644 --- a/native/doscalls.c +++ b/native/doscalls.c @@ -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; diff --git a/native/doscalls.h b/native/doscalls.h index 730a8d8..583c643 100644 --- a/native/doscalls.h +++ b/native/doscalls.h @@ -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 }