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:
3 files changed
+76
No files matched your search
@@ -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),
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user