diff --git a/native/doscalls.c b/native/doscalls.c index 21d5b13..d4ff6f2 100644 --- a/native/doscalls.c +++ b/native/doscalls.c @@ -129,164 +129,6 @@ typedef struct static DirFinder GHDir1; -LX_NATIVE_MODULE_16BIT_SUPPORT() - LX_NATIVE_MODULE_16BIT_API(DosSemRequest) - LX_NATIVE_MODULE_16BIT_API(DosSemClear) - LX_NATIVE_MODULE_16BIT_API(DosSemWait) - LX_NATIVE_MODULE_16BIT_API(DosSemSet) -LX_NATIVE_MODULE_16BIT_SUPPORT_END() - -LX_NATIVE_MODULE_DEINIT({ - GLoaderState->dosExit = NULL; - - ExitListItem *next = GExitList; - GExitList = NULL; - - for (ExitListItem *item = next; item; item = next) { - next = item->next; - free(item); - } // for - - for (uint32 i = 0; i < MaxHFiles; i++) { - if (HFiles[i].fd != -1) - close(HFiles[i].fd); - } // for - free(HFiles); - HFiles = NULL; - MaxHFiles = 0; - - pthread_mutex_destroy(&GMutexDosCalls); - - LX_NATIVE_MODULE_DEINIT_16BIT_SUPPORT(); -}) - -static int initDoscalls(void) -{ - LX_NATIVE_MODULE_INIT_16BIT_SUPPORT() - LX_NATIVE_INIT_16BIT_BRIDGE(DosSemRequest, 8) - LX_NATIVE_INIT_16BIT_BRIDGE(DosSemClear, 4) - LX_NATIVE_INIT_16BIT_BRIDGE(DosSemWait, 8) - LX_NATIVE_INIT_16BIT_BRIDGE(DosSemSet, 4) - LX_NATIVE_MODULE_INIT_16BIT_SUPPORT_END() - - GLoaderState->dosExit = DosExit; - - if (pthread_mutex_init(&GMutexDosCalls, NULL) == -1) { - fprintf(stderr, "pthread_mutex_init failed!\n"); - return 0; - } // if - - MaxHFiles = 20; // seems to be OS/2's default. - HFiles = (HFileInfo *) malloc(sizeof (HFileInfo) * MaxHFiles); - if (!HFiles) { - fprintf(stderr, "Out of memory!\n"); - return 0; - } // if - - HFileInfo *info = HFiles; - for (uint32 i = 0; i < MaxHFiles; i++, info++) { - info->fd = -1; - info->type = 0; - info->attr = 0; - info->flags = 0; - } // for - - // launching a Hello World program from CMD.EXE seems to inherit several - // file handles. 0, 1, 2 seem to map to stdin, stdout, stderr (and will - // be character devices (maybe CON?) by default, unless you redirect - // to a file in which case they're physical files, and using '|' in - // CMD.EXE will make handle 1 into a Pipe, of course. - // Handles, 4, 6 and 9 were also in use (all character devices, attributes - // 51585, 51392, 51392), but I don't know what these are, if they are - // inherited from CMD.EXE or supplied by OS/2 for whatever purpose. - // For now, we just wire up stdio. - - for (int i = 0; i <= 2; i++) { - HFiles[i].fd = i; - HFiles[i].type = 1; // !!! FIXME: could be a pipe or file. - HFiles[i].attr = DAW_STDIN | DAW_STDOUT | DAW_LEVEL1 | DAW_CHARACTER; - } // for - - return 1; -} // initDoscalls - -LX_NATIVE_MODULE_INIT({ if (!initDoscalls()) return NULL; }) - LX_NATIVE_EXPORT16(DosSemRequest, 140), - LX_NATIVE_EXPORT16(DosSemClear, 141), - LX_NATIVE_EXPORT16(DosSemWait, 142), - LX_NATIVE_EXPORT16(DosSemSet, 143), - LX_NATIVE_EXPORT(DosSetMaxFH, 209), - LX_NATIVE_EXPORT(DosSetPathInfo, 219), - LX_NATIVE_EXPORT(DosQueryPathInfo, 223), - LX_NATIVE_EXPORT(DosQueryHType, 224), - LX_NATIVE_EXPORT(DosScanEnv, 227), - LX_NATIVE_EXPORT(DosSleep, 229), - LX_NATIVE_EXPORT(DosGetDateTime, 230), - LX_NATIVE_EXPORT(DosDevConfig, 231), - LX_NATIVE_EXPORT(DosExit, 234), - LX_NATIVE_EXPORT(DosResetBuffer, 254), - LX_NATIVE_EXPORT(DosSetFilePtr, 256), - LX_NATIVE_EXPORT(DosClose, 257), - LX_NATIVE_EXPORT(DosDelete, 259), - LX_NATIVE_EXPORT(DosFindClose, 263), - LX_NATIVE_EXPORT(DosFindFirst, 264), - LX_NATIVE_EXPORT(DosFindNext, 265), - LX_NATIVE_EXPORT(DosOpen, 273), - LX_NATIVE_EXPORT(DosQueryCurrentDir, 274), - LX_NATIVE_EXPORT(DosQueryCurrentDisk, 275), - LX_NATIVE_EXPORT(DosQueryFHState, 276), - LX_NATIVE_EXPORT(DosQueryFSAttach, 277), - LX_NATIVE_EXPORT(DosQueryFileInfo, 279), - LX_NATIVE_EXPORT(DosWaitChild, 280), - LX_NATIVE_EXPORT(DosRead, 281), - LX_NATIVE_EXPORT(DosWrite, 282), - LX_NATIVE_EXPORT(DosExecPgm, 283), - LX_NATIVE_EXPORT(DosSetProcessCp, 289), - LX_NATIVE_EXPORT(DosQueryCp, 291), - LX_NATIVE_EXPORT(DosExitList, 296), - LX_NATIVE_EXPORT(DosAllocMem, 299), - LX_NATIVE_EXPORT(DosFreeMem, 304), - LX_NATIVE_EXPORT(DosSetMem, 305), - LX_NATIVE_EXPORT(DosCreateThread, 311), - LX_NATIVE_EXPORT(DosGetInfoBlocks, 312), - LX_NATIVE_EXPORT(DosLoadModule, 318), - LX_NATIVE_EXPORT(DosQueryModuleHandle, 319), - LX_NATIVE_EXPORT(DosQueryModuleName, 320), - LX_NATIVE_EXPORT(DosQueryProcAddr, 321), - LX_NATIVE_EXPORT(DosQueryAppType, 323), - LX_NATIVE_EXPORT(DosCreateEventSem, 324), - LX_NATIVE_EXPORT(DosCloseEventSem, 326), - LX_NATIVE_EXPORT(DosResetEventSem, 327), - LX_NATIVE_EXPORT(DosPostEventSem, 328), - LX_NATIVE_EXPORT(DosWaitEventSem, 329), - LX_NATIVE_EXPORT(DosQueryEventSem, 330), - LX_NATIVE_EXPORT(DosCreateMutexSem, 331), - LX_NATIVE_EXPORT(DosCloseMutexSem, 333), - LX_NATIVE_EXPORT(DosRequestMutexSem, 334), - LX_NATIVE_EXPORT(DosReleaseMutexSem, 335), - LX_NATIVE_EXPORT(DosSubSetMem, 344), - LX_NATIVE_EXPORT(DosSubAllocMem, 345), - LX_NATIVE_EXPORT(DosSubFreeMem, 346), - LX_NATIVE_EXPORT(DosQuerySysInfo, 348), - LX_NATIVE_EXPORT(DosSetExceptionHandler, 354), - LX_NATIVE_EXPORT(DosUnsetExceptionHandler, 355), - LX_NATIVE_EXPORT(DosQuerySysState, 368), - LX_NATIVE_EXPORT(DosSetSignalExceptionFocus, 378), - LX_NATIVE_EXPORT(DosEnterMustComplete, 380), - LX_NATIVE_EXPORT(DosExitMustComplete, 381), - LX_NATIVE_EXPORT(DosSetRelMaxFH, 382), - LX_NATIVE_EXPORT(DosFlatToSel, 425), - LX_NATIVE_EXPORT(DosSelToFlat, 426), - LX_NATIVE_EXPORT(DosAllocThreadLocalMemory, 454), - LX_NATIVE_EXPORT(DosFreeThreadLocalMemory, 455), - LX_NATIVE_EXPORT(DosR3ExitAddr, 553), - LX_NATIVE_EXPORT(DosQueryHeaderInfo, 582), - LX_NATIVE_EXPORT(DosQueryExtLIBPATH, 874), - LX_NATIVE_EXPORT(DosQueryThreadContext, 877), - LX_NATIVE_EXPORT(DosOpenL, 981) -LX_NATIVE_MODULE_INIT_END() - - static int grabLock(pthread_mutex_t *lock) { return (pthread_mutex_lock(lock) == 0); @@ -3056,5 +2898,165 @@ APIRET DosQueryFSAttach(PSZ pszDeviceName, ULONG ulOrdinal, ULONG ulFSAInfoLevel return ERROR_INVALID_FUNCTION; } // DosQueryFSAttach + + +LX_NATIVE_MODULE_16BIT_SUPPORT() + LX_NATIVE_MODULE_16BIT_API(DosSemRequest) + LX_NATIVE_MODULE_16BIT_API(DosSemClear) + LX_NATIVE_MODULE_16BIT_API(DosSemWait) + LX_NATIVE_MODULE_16BIT_API(DosSemSet) +LX_NATIVE_MODULE_16BIT_SUPPORT_END() + +LX_NATIVE_MODULE_DEINIT({ + GLoaderState->dosExit = NULL; + + ExitListItem *next = GExitList; + GExitList = NULL; + + for (ExitListItem *item = next; item; item = next) { + next = item->next; + free(item); + } // for + + for (uint32 i = 0; i < MaxHFiles; i++) { + if (HFiles[i].fd != -1) + close(HFiles[i].fd); + } // for + free(HFiles); + HFiles = NULL; + MaxHFiles = 0; + + pthread_mutex_destroy(&GMutexDosCalls); + + LX_NATIVE_MODULE_DEINIT_16BIT_SUPPORT(); +}) + +static int initDoscalls(void) +{ + LX_NATIVE_MODULE_INIT_16BIT_SUPPORT() + LX_NATIVE_INIT_16BIT_BRIDGE(DosSemRequest, 8) + LX_NATIVE_INIT_16BIT_BRIDGE(DosSemClear, 4) + LX_NATIVE_INIT_16BIT_BRIDGE(DosSemWait, 8) + LX_NATIVE_INIT_16BIT_BRIDGE(DosSemSet, 4) + LX_NATIVE_MODULE_INIT_16BIT_SUPPORT_END() + + GLoaderState->dosExit = DosExit; + + if (pthread_mutex_init(&GMutexDosCalls, NULL) == -1) { + fprintf(stderr, "pthread_mutex_init failed!\n"); + return 0; + } // if + + MaxHFiles = 20; // seems to be OS/2's default. + HFiles = (HFileInfo *) malloc(sizeof (HFileInfo) * MaxHFiles); + if (!HFiles) { + fprintf(stderr, "Out of memory!\n"); + return 0; + } // if + + HFileInfo *info = HFiles; + for (uint32 i = 0; i < MaxHFiles; i++, info++) { + info->fd = -1; + info->type = 0; + info->attr = 0; + info->flags = 0; + } // for + + // launching a Hello World program from CMD.EXE seems to inherit several + // file handles. 0, 1, 2 seem to map to stdin, stdout, stderr (and will + // be character devices (maybe CON?) by default, unless you redirect + // to a file in which case they're physical files, and using '|' in + // CMD.EXE will make handle 1 into a Pipe, of course. + // Handles, 4, 6 and 9 were also in use (all character devices, attributes + // 51585, 51392, 51392), but I don't know what these are, if they are + // inherited from CMD.EXE or supplied by OS/2 for whatever purpose. + // For now, we just wire up stdio. + + for (int i = 0; i <= 2; i++) { + HFiles[i].fd = i; + HFiles[i].type = 1; // !!! FIXME: could be a pipe or file. + HFiles[i].attr = DAW_STDIN | DAW_STDOUT | DAW_LEVEL1 | DAW_CHARACTER; + } // for + + return 1; +} // initDoscalls + +LX_NATIVE_MODULE_INIT({ if (!initDoscalls()) return NULL; }) + LX_NATIVE_EXPORT16(DosSemRequest, 140), + LX_NATIVE_EXPORT16(DosSemClear, 141), + LX_NATIVE_EXPORT16(DosSemWait, 142), + LX_NATIVE_EXPORT16(DosSemSet, 143), + LX_NATIVE_EXPORT(DosSetMaxFH, 209), + LX_NATIVE_EXPORT(DosSetPathInfo, 219), + LX_NATIVE_EXPORT(DosQueryPathInfo, 223), + LX_NATIVE_EXPORT(DosQueryHType, 224), + LX_NATIVE_EXPORT(DosScanEnv, 227), + LX_NATIVE_EXPORT(DosSleep, 229), + LX_NATIVE_EXPORT(DosGetDateTime, 230), + LX_NATIVE_EXPORT(DosDevConfig, 231), + LX_NATIVE_EXPORT(DosExit, 234), + LX_NATIVE_EXPORT(DosResetBuffer, 254), + LX_NATIVE_EXPORT(DosSetFilePtr, 256), + LX_NATIVE_EXPORT(DosClose, 257), + LX_NATIVE_EXPORT(DosDelete, 259), + LX_NATIVE_EXPORT(DosFindClose, 263), + LX_NATIVE_EXPORT(DosFindFirst, 264), + LX_NATIVE_EXPORT(DosFindNext, 265), + LX_NATIVE_EXPORT(DosOpen, 273), + LX_NATIVE_EXPORT(DosQueryCurrentDir, 274), + LX_NATIVE_EXPORT(DosQueryCurrentDisk, 275), + LX_NATIVE_EXPORT(DosQueryFHState, 276), + LX_NATIVE_EXPORT(DosQueryFSAttach, 277), + LX_NATIVE_EXPORT(DosQueryFileInfo, 279), + LX_NATIVE_EXPORT(DosWaitChild, 280), + LX_NATIVE_EXPORT(DosRead, 281), + LX_NATIVE_EXPORT(DosWrite, 282), + LX_NATIVE_EXPORT(DosExecPgm, 283), + LX_NATIVE_EXPORT(DosSetProcessCp, 289), + LX_NATIVE_EXPORT(DosQueryCp, 291), + LX_NATIVE_EXPORT(DosExitList, 296), + LX_NATIVE_EXPORT(DosAllocMem, 299), + LX_NATIVE_EXPORT(DosFreeMem, 304), + LX_NATIVE_EXPORT(DosSetMem, 305), + LX_NATIVE_EXPORT(DosCreateThread, 311), + LX_NATIVE_EXPORT(DosGetInfoBlocks, 312), + LX_NATIVE_EXPORT(DosLoadModule, 318), + LX_NATIVE_EXPORT(DosQueryModuleHandle, 319), + LX_NATIVE_EXPORT(DosQueryModuleName, 320), + LX_NATIVE_EXPORT(DosQueryProcAddr, 321), + LX_NATIVE_EXPORT(DosQueryAppType, 323), + LX_NATIVE_EXPORT(DosCreateEventSem, 324), + LX_NATIVE_EXPORT(DosCloseEventSem, 326), + LX_NATIVE_EXPORT(DosResetEventSem, 327), + LX_NATIVE_EXPORT(DosPostEventSem, 328), + LX_NATIVE_EXPORT(DosWaitEventSem, 329), + LX_NATIVE_EXPORT(DosQueryEventSem, 330), + LX_NATIVE_EXPORT(DosCreateMutexSem, 331), + LX_NATIVE_EXPORT(DosCloseMutexSem, 333), + LX_NATIVE_EXPORT(DosRequestMutexSem, 334), + LX_NATIVE_EXPORT(DosReleaseMutexSem, 335), + LX_NATIVE_EXPORT(DosSubSetMem, 344), + LX_NATIVE_EXPORT(DosSubAllocMem, 345), + LX_NATIVE_EXPORT(DosSubFreeMem, 346), + LX_NATIVE_EXPORT(DosQuerySysInfo, 348), + LX_NATIVE_EXPORT(DosSetExceptionHandler, 354), + LX_NATIVE_EXPORT(DosUnsetExceptionHandler, 355), + LX_NATIVE_EXPORT(DosQuerySysState, 368), + LX_NATIVE_EXPORT(DosSetSignalExceptionFocus, 378), + LX_NATIVE_EXPORT(DosEnterMustComplete, 380), + LX_NATIVE_EXPORT(DosExitMustComplete, 381), + LX_NATIVE_EXPORT(DosSetRelMaxFH, 382), + LX_NATIVE_EXPORT(DosFlatToSel, 425), + LX_NATIVE_EXPORT(DosSelToFlat, 426), + LX_NATIVE_EXPORT(DosAllocThreadLocalMemory, 454), + LX_NATIVE_EXPORT(DosFreeThreadLocalMemory, 455), + LX_NATIVE_EXPORT(DosR3ExitAddr, 553), + LX_NATIVE_EXPORT(DosQueryHeaderInfo, 582), + LX_NATIVE_EXPORT(DosQueryExtLIBPATH, 874), + LX_NATIVE_EXPORT(DosQueryThreadContext, 877), + LX_NATIVE_EXPORT(DosOpenL, 981) +LX_NATIVE_MODULE_INIT_END() + + // end of doscalls.c ...