Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
/*++
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(); }
|