windows-nt/Source/XPSP1/NT/base/subsys/posix/client/crtsup.c
2020-09-26 16:20:57 +08:00

236 lines
3.9 KiB
C

/*++
Copyright (c) 1991 Microsoft Corporation
Module Name:
crtsup.c
Abstract:
This module contains support routines used by the Posix C runtimes.
Author:
Ellen Aycock-Wright (ellena) 07-Aug-1991
Environment:
User Mode only
Revision History:
--*/
#include "psxmsg.h"
#include "psxdll.h"
char *
__cdecl
__PdxGetCmdLine(
VOID
)
/*++
Routine Description:
The command line of the current process is available using this
API.
Arguments:
None.
Return Value:
The address of the current processes command line is returned. The
return value is a pointer to null terminate string.
--*/
{
return PsxAnsiCommandLine.Buffer;
}
int
PdxStatusToErrno(
IN NTSTATUS Status
)
/*++
Routine Description:
This procedure converts an NT status code to an
equivalent errno value. BUG BUG it is duplicated in the
server as PsxStatusToErrno to avoid calling the server.
The conversion is a function of the status code class.
Arguments:
Class - Supplies the status code class to use.
Status - Supplies the status code to convert.
Return Value:
Returns an equivalent error code to the supplied status code.
--*/
{
ULONG Error;
switch (Status) {
case STATUS_INVALID_PARAMETER:
Error = EINVAL;
break;
case STATUS_DIRECTORY_NOT_EMPTY:
// Error = ENOTEMPTY;
Error = EEXIST;
break;
case STATUS_OBJECT_PATH_INVALID:
case STATUS_NOT_A_DIRECTORY:
Error = ENOTDIR;
break;
case STATUS_OBJECT_PATH_SYNTAX_BAD:
// this for the rename test; 'old' has component too long.
Error = ENAMETOOLONG;
break;
case STATUS_OBJECT_NAME_COLLISION:
Error = EEXIST;
break;
case STATUS_OBJECT_PATH_NOT_FOUND:
case STATUS_OBJECT_NAME_NOT_FOUND:
case STATUS_DELETE_PENDING:
Error = ENOENT;
break;
case STATUS_NO_MEMORY:
case STATUS_INSUFFICIENT_RESOURCES:
Error = ENOMEM;
break;
case STATUS_CANNOT_DELETE:
Error = ETXTBUSY;
break;
case STATUS_DISK_FULL:
Error = ENOSPC;
break;
case STATUS_MEDIA_WRITE_PROTECTED:
Error = EROFS;
break;
case STATUS_OBJECT_NAME_INVALID:
Error = ENAMETOOLONG;
break;
case STATUS_FILE_IS_A_DIRECTORY:
Error = EISDIR;
break;
case STATUS_NOT_SAME_DEVICE:
Error = EXDEV;
break;
default :
Error = EACCES;
}
return Error;
}
//
// Copied from the server side.
//
int
PdxStatusToErrnoPath(
PUNICODE_STRING Path
)
{
NTSTATUS Status;
OBJECT_ATTRIBUTES Obj;
HANDLE FileHandle;
ULONG DesiredAccess;
IO_STATUS_BLOCK Iosb;
ULONG Options;
PWCHAR pwc, pwcSav;
ULONG MinLen;
PSX_GET_SIZEOF(DOSDEVICE_X_W,MinLen);
DesiredAccess = SYNCHRONIZE;
Options = FILE_SYNCHRONOUS_IO_NONALERT | FILE_DIRECTORY_FILE;
pwcSav = NULL;
for (;;) {
//
// Remove trailing component.
//
pwc = wcsrchr(Path->Buffer, L'\\');
if (pwcSav)
*pwcSav = L'\\';
if (NULL == pwc) {
break;
}
*pwc = UNICODE_NULL;
pwcSav = pwc;
Path->Length = wcslen(Path->Buffer) * sizeof(WCHAR);
if (Path->Length <= MinLen) {
*pwcSav = L'\\';
break;
}
InitializeObjectAttributes(&Obj, Path, 0, NULL, NULL);
Status = NtOpenFile(&FileHandle, DesiredAccess, &Obj,
&Iosb,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
Options);
if (NT_SUCCESS(Status)) {
NtClose(FileHandle);\
}
if (STATUS_NOT_A_DIRECTORY == Status) {
*pwcSav = L'\\';
Path->Length = wcslen(Path->Buffer) * sizeof(WCHAR);
return ENOTDIR;
}
}
Path->Length = wcslen(Path->Buffer) * sizeof(WCHAR);
return ENOENT;
}
int __cdecl
raise(int sig)
{
return kill(getpid(), sig);
}
/*
* This routine is called by heapinit(), in crt32psx/winheap. We
* would have a reference forwarder in psxdll.def, except RtlProcessHeap
* is a macro and can't be forwarded.
*/
void *
GetProcessHeap(void)
{
return (void *)RtlProcessHeap();
}