|
|
/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
psxmsg.h
Abstract:
This module contains the message format used to communicate transmit POSIX system services between PSX and its clients.
Author:
Mark Lucovsky (markl) 14-Mar-1989
Revision History:
--*/
#ifndef _PSXMSG_
#define _PSXMSG_
#include <nt.h>
#include <types.h>
#include <signal.h>
#include <utime.h>
#include <sys\times.h>
//
// Define debugging flag as false if not defined already.
//
#ifndef DBG
#define DBG 0
#endif
//
// Define IF_DEBUG macro that can be used to enable debugging code that is
// optimized out if the debugging flag is false.
//
#if DBG
#define IF_DEBUG if (TRUE)
#else
#define IF_DEBUG if (FALSE)
#endif
//
// The following describes the connection information used for
// posix api connections
//
typedef VOID (*PSIGNALDELIVERER) ( IN PCONTEXT Context, IN sigset_t PreviousBlockMask, IN int Signal, IN _handler Handler );
typedef VOID (*PNULLAPICALLER) ( IN PCONTEXT Context );
//
// SubSystemData field in PEB points to the following data structure for
// POSIX applications. Initial contents are passed back via the connection
// information structure when the client process connects to the POSIX
// Emulation Subsystem server
//
typedef struct _PEB_PSX_DATA { ULONG Length; PVOID ClientStartAddress; HANDLE SessionPortHandle; PVOID SessionDataBaseAddress; } PEB_PSX_DATA, *PPEB_PSX_DATA;
typedef struct _PSX_DIRECTORY_PREFIX { STRING NtCurrentWorkingDirectory; STRING PsxCurrentWorkingDirectory; STRING PsxRoot; } PSX_DIRECTORY_PREFIX, *PPSX_DIRECTORY_PREFIX;
typedef struct _PSX_API_CONNECTINFO { PSIGNALDELIVERER SignalDeliverer; PNULLAPICALLER NullApiCaller; PPSX_DIRECTORY_PREFIX DirectoryPrefix; PEB_PSX_DATA InitialPebPsxData; ULONG SessionUniqueId; } PSX_API_CONNECTINFO, *PPSX_API_CONNECTINFO;
#define PSXSRV_VERSION 0x100390
//
// This is only defined here instead of the obvious place because the
// server needs to copy it from one process to another during exec.
//
typedef struct _CLIENT_OPEN_FILE { BOOLEAN Open; BOOLEAN FdIsConsole; ULONG Flags; // descriptor flags
} CLIENT_OPEN_FILE, *PCLIENT_OPEN_FILE;
//
// These Constants define the Posix Api Numbers
// NOTE that the initialization of the ApiDispatch table in server\apiloop.c
// matches this exactly.
//
typedef enum _PSXAPINUMBER { PsxForkApi, PsxExecApi, PsxWaitPidApi, PsxExitApi, PsxKillApi, PsxSigActionApi, PsxSigProcMaskApi, PsxSigPendingApi, PsxSigSuspendApi, PsxAlarmApi, PsxGetIdsApi, PsxSetUidApi, PsxSetGidApi, PsxGetGroupsApi, PsxGetLoginApi, PsxCUserIdApi, PsxSetSidApi, PsxSetPGroupIdApi, PsxUnameApi, PsxTimeApi, PsxGetProcessTimesApi, PsxTtyNameApi, PsxIsattyApi, PsxSysconfApi, PsxOpenApi, PsxUmaskApi, PsxLinkApi, PsxMkDirApi, PsxMkFifoApi, PsxRmDirApi, PsxRenameApi, PsxStatApi, PsxFStatApi, PsxAccessApi, PsxChmodApi, PsxChownApi, PsxUtimeApi, PsxPathConfApi, PsxFPathConfApi, PsxPipeApi, PsxDupApi, PsxDup2Api, PsxCloseApi, PsxReadApi, PsxWriteApi, PsxFcntlApi, PsxLseekApi, PsxTcGetAttrApi, PsxTcSetAttrApi, PsxTcSendBreakApi, PsxTcDrainApi, PsxTcFlushApi, PsxTcFlowApi, PsxTcGetPGrpApi, PsxTcSetPGrpApi, PsxGetPwUidApi, PsxGetPwNamApi, PsxGetGrGidApi, PsxGetGrNamApi, PsxUnlinkApi, PsxReadDirApi, PsxFtruncateApi, PsxNullApi,
#ifdef PSX_SOCKET
PsxSocketApi, PsxAcceptApi, PsxBindApi, PsxConnectApi, PsxGetPeerNameApi, PsxGetSockNameApi, PsxGetSockOptApi, PsxListenApi, PsxRecvApi, PsxRecvFromApi, PsxSendApi, PsxSendToApi, PsxSetSockOptApi, PsxShutdownApi,
#endif // PSX_SOCKET
PsxMaxApiNumber } PSXAPINUMBER;
//
// Each of the following structures define the layout of the Arguments portion
// of the PSX_API_MSG that the Api expects.
//
//
// PsxForkApi
//
//
typedef struct _PSX_FORK_MSG { IN PVOID StackBase; IN PVOID StackLimit; IN PVOID StackAllocationBase; #if defined(_IA64_)
IN PVOID BStoreLimit; #endif
} PSX_FORK_MSG, *PPSX_FORK_MSG;
//
// PsxExecApi
//
typedef struct _PSX_EXEC_MSG { IN UNICODE_STRING Path; IN PCHAR Args; // args + environ, in view mem
} PSX_EXEC_MSG, *PPSX_EXEC_MSG;
//
// PsxWaitPidApi
//
typedef struct _PSX_WAITPID_MSG { IN pid_t Pid; OUT ULONG StatLocValue; IN ULONG Options; } PSX_WAITPID_MSG, *PPSX_WAITPID_MSG;
//
// PsxExitApi
//
typedef struct _PSX_EXIT_MSG { IN ULONG ExitStatus; } PSX_EXIT_MSG, *PPSX_EXIT_MSG;
//
// PsxKillApi
//
typedef struct _PSX_KILL_MSG { IN pid_t Pid; IN ULONG Sig; } PSX_KILL_MSG, *PPSX_KILL_MSG;
//
// PsxSigActionApi
//
typedef struct _PSX_SIGACTION_MSG { IN ULONG Sig; IN struct sigaction *ActSpecified; IN struct sigaction Act; IN struct sigaction *OactSpecified; OUT struct sigaction Oact; } PSX_SIGACTION_MSG, *PPSX_SIGACTION_MSG;
//
// PsxSigProcMaskApi
//
typedef struct _PSX_SIGPROCMASK_MSG { IN ULONG How; IN sigset_t *SetSpecified; IN sigset_t Set; OUT sigset_t Oset; } PSX_SIGPROCMASK_MSG, *PPSX_SIGPROCMASK_MSG;
//
// PsxSigPendingApi
//
typedef struct _PSX_SIGPENDING_MSG { OUT sigset_t Set; } PSX_SIGPENDING_MSG, *PPSX_SIGPENDING_MSG;
//
// PsxSigSuspendApi
//
typedef struct _PSX_SIGSUSPEND_MSG { IN PVOID SigMaskSpecified; IN sigset_t SigMask; } PSX_SIGSUSPEND_MSG, *PPSX_SIGSUSPEND_MSG;
//
// PsxAlarmApi
//
typedef struct _PSX_ALARM_MSG { IN BOOLEAN CancelAlarm; IN LARGE_INTEGER Seconds; OUT LARGE_INTEGER PreviousSeconds; } PSX_ALARM_MSG, *PPSX_ALARM_MSG;
//
// PsxSleepApi
//
typedef struct _PSX_SLEEP_MSG { IN ULONG Seconds; OUT LARGE_INTEGER PreviousSeconds; } PSX_SLEEP_MSG, *PPSX_SLEEP_MSG;
//
// PsxGetIdsApi
//
typedef struct _PSX_GETIDS_MSG { OUT pid_t Pid; OUT pid_t ParentPid; OUT pid_t GroupId; OUT uid_t RealUid; OUT uid_t EffectiveUid; OUT gid_t RealGid; OUT gid_t EffectiveGid; } PSX_GETIDS_MSG, *PPSX_GETIDS_MSG;
//
// PsxSetUidApi
//
typedef struct _PSX_SETUID_MSG { IN uid_t Uid; } PSX_SETUID_MSG, *PPSX_SETUID_MSG;
//
// PsxSetGidApi
//
typedef struct _PSX_SETGID_MSG { IN gid_t Gid; } PSX_SETGID_MSG, *PPSX_SETGID_MSG;
//
// PsxGetLoginApi (USES VIEW MEMORY)
//
typedef struct _PSX_GETLOGIN_MSG { IN OUT STRING LoginName; } PSX_GETLOGIN_MSG, *PPSX_GETLOGIN_MSG;
//
// PsxCUserIdApi (USES VIEW MEMORY)
//
typedef struct _PSX_CUSERID_MSG { IN OUT STRING UserName; } PSX_CUSERID_MSG, *PPSX_CUSERID_MSG;
//
// PsxSetSidApi
//
// No Arguments
//
//
// PsxSetPGroupIdApi
//
typedef struct _PSX_SETPGROUPID_MSG { IN pid_t Pid; IN pid_t Pgid; } PSX_SETPGROUPID_MSG, *PPSX_SETPGROUPID_MSG;
//
// PsxUnameApi (USES VIEW MEMORY)
//
typedef struct _PSX_UNAME_MSG { OUT struct utsname *Name; } PSX_UNAME_MSG, *PPSX_UNAME_MSG;
//
// PsxTimeApi
//
typedef struct _PSX_TIME_MSG { OUT LARGE_INTEGER Time; } PSX_TIME_MSG, *PPSX_TIME_MSG;
//
// PsxGetProcessTimesApi
//
typedef struct _PSX_GETPROCESSTIMES_MSG { OUT struct tms ProcessTimes; } PSX_GETPROCESSTIMES_MSG, *PPSX_GETPROCESSTIMES_MSG;
//
// PsxTtyNameApi (USES VIEW MEMORY)
//
typedef struct _PSX_TTYNAME_MSG { IN LONG FileDes; IN OUT STRING TtyName; } PSX_TTYNAME_MSG, *PPSX_TTYNAME_MSG;
//
// PsxIsattyApi
//
typedef struct _PSX_ISATTY_MSG { IN LONG FileDes; OUT ULONG Command; } PSX_ISATTY_MSG, *PPSX_ISATTY_MSG;
//
// PsxSysconfApi
//
typedef struct _PSX_SYSCONF_MSG { IN ULONG Name; } PSX_SYSCONF_MSG, *PPSX_SYSCONF_MSG;
//
// PsxOpenApi (USES VIEW MEMORY)
//
typedef struct _PSX_OPEN_MSG { IN UNICODE_STRING Path_U; IN OUT ULONG Flags; // used as flags on input and output
IN OUT mode_t Mode; // used as handle value on output
} PSX_OPEN_MSG, *PPSX_OPEN_MSG;
//
// PsxUmaskApi
//
typedef struct _PSX_UMASK_MSG { IN mode_t Cmask; } PSX_UMASK_MSG, *PPSX_UMASK_MSG;
//
// PsxLinkApi (USES VIEW MEMORY)
//
typedef struct _PSX_LINK_MSG { IN UNICODE_STRING OldName; IN UNICODE_STRING NewName; } PSX_LINK_MSG, *PPSX_LINK_MSG;
//
// PsxMkDirApi (USES VIEW MEMORY)
//
typedef struct _PSX_MKDIR_MSG { IN UNICODE_STRING Path_U; IN mode_t Mode; } PSX_MKDIR_MSG, *PPSX_MKDIR_MSG;
//
// PsxMkFifoApi (USES VIEW MEMORY)
//
typedef struct _PSX_MKFIFO_MSG { IN UNICODE_STRING Path_U; IN mode_t Mode; } PSX_MKFIFO_MSG, *PPSX_MKFIFO_MSG;
//
// PsxRmDirApi (USES VIEW MEMORY)
//
typedef struct _PSX_RMDIR_MSG { IN UNICODE_STRING Path_U; } PSX_RMDIR_MSG, *PPSX_RMDIR_MSG;
//
// PsxRenameApi (USES VIEW MEMORY)
//
typedef struct _PSX_RENAME_MSG { IN UNICODE_STRING OldName; IN UNICODE_STRING NewName; } PSX_RENAME_MSG, *PPSX_RENAME_MSG;
//
// PsxStatApi (USES VIEW MEMORY)
//
typedef struct _PSX_STAT_MSG { IN UNICODE_STRING Path_U; OUT struct stat *StatBuf; } PSX_STAT_MSG, *PPSX_STAT_MSG;
//
// PsxFStatApi
//
typedef struct _PSX_FSTAT_MSG { IN LONG FileDes; OUT struct stat *StatBuf; } PSX_FSTAT_MSG, *PPSX_FSTAT_MSG;
//
// PsxAccessApi (USES VIEW MEMORY)
//
typedef struct _PSX_ACCESS_MSG { IN UNICODE_STRING Path_U; IN LONG Amode; } PSX_ACCESS_MSG, *PPSX_ACCESS_MSG;
//
// PsxChmodApi (USES VIEW MEMORY)
//
typedef struct _PSX_CHMOD_MSG { IN UNICODE_STRING Path_U; IN mode_t Mode; } PSX_CHMOD_MSG, *PPSX_CHMOD_MSG;
//
// PsxChownApi (USES VIEW MEMORY)
//
typedef struct _PSX_CHOWN_MSG { IN UNICODE_STRING Path_U; IN uid_t Owner; IN gid_t Group; } PSX_CHOWN_MSG, *PPSX_CHOWN_MSG;
//
// PsxUtimeApi (USES VIEW MEMORY)
//
typedef struct _PSX_UTIME_MSG { IN UNICODE_STRING Path_U; IN struct utimbuf *TimesSpecified; IN struct utimbuf Times; } PSX_UTIME_MSG, *PPSX_UTIME_MSG;
//
// PsxPathConfApi (USES VIEW MEMORY)
//
typedef struct _PSX_PATHCONF_MSG { IN UNICODE_STRING Path; IN ULONG Name; } PSX_PATHCONF_MSG, *PPSX_PATHCONF_MSG;
//
// PsxFPathConfApi
//
typedef struct _PSX_FPATHCONF_MSG { IN LONG FileDes; IN ULONG Name; } PSX_FPATHCONF_MSG, *PPSX_FPATHCONF_MSG;
//
// PsxPipeApi
//
typedef struct _PSX_PIPE_MSG { IN LONG FileDes0; IN LONG FileDes1; } PSX_PIPE_MSG, *PPSX_PIPE_MSG;
//
// PsxDupApi
//
typedef struct _PSX_DUP_MSG { IN LONG FileDes; } PSX_DUP_MSG, *PPSX_DUP_MSG;
//
// PsxDup2Api
//
typedef struct _PSX_DUP2_MSG { OUT LONG FileDes; OUT LONG FileDes2; } PSX_DUP2_MSG, *PPSX_DUP2_MSG;
//
// PsxCloseApi
//
typedef struct _PSX_CLOSE_MSG { IN LONG FileDes; } PSX_CLOSE_MSG, *PPSX_CLOSE_MSG;
//
// PsxReadApi (USES VIEW MEMORY)
//
typedef struct _PSX_READ_MSG { IN LONG FileDes; OUT PUCHAR Buf; IN LONG Nbytes; ULONG Scratch1; ULONG Scratch2; OUT ULONG Command; } PSX_READ_MSG, *PPSX_READ_MSG;
//
// PsxReadDirApi (USES VIEW MEMORY)
//
typedef struct _PSX_READDIR_MSG { IN LONG FileDes; OUT PUCHAR Buf; IN LONG Nbytes; IN BOOLEAN RestartScan; } PSX_READDIR_MSG, *PPSX_READDIR_MSG;
//
// PsxWriteApi (USES VIEW MEMORY)
//
typedef struct _PSX_WRITE_MSG { IN LONG FileDes; IN PUCHAR Buf; IN LONG Nbytes; ULONG Scratch1; ULONG Scratch2; OUT ULONG Command; } PSX_WRITE_MSG, *PPSX_WRITE_MSG;
//
// Values for READ_MSG.Command and WRITE_MSG.Command
//
#define IO_COMMAND_DONE 0
#define IO_COMMAND_DO_CONSIO 1
//
// PsxFcntlApi
//
typedef struct _PSX_FCNTL_MSG { IN LONG FileDes; IN int Command; IN union { struct flock *pf; int i; } u; } PSX_FCNTL_MSG, *PPSX_FCNTL_MSG;
//
// PsxLseekApi
//
typedef struct _PSX_LSEEK_MSG { IN LONG FileDes; IN LONG Whence; IN off_t Offset; } PSX_LSEEK_MSG, *PPSX_LSEEK_MSG;
//
// PsxTcGetAttr
//
typedef struct _PSX_TCGETATTR_MSG { IN LONG FileDes; OUT struct termios *Termios; } PSX_TCGETATTR_MSG, *PPSX_TCGETATTR_MSG;
//
// PsxTcSetAttr
//
typedef struct _PSX_TCSETATTR_MSG { IN LONG FileDes; IN LONG OptionalActions; IN struct termios *Termios; } PSX_TCSETATTR_MSG, *PPSX_TCSETATTR_MSG;
//
// PsxTcSendBreak
//
typedef struct _PSX_TCSENDBREAK_MSG { IN LONG FileDes; IN LONG Duration; } PSX_TCSENDBREAK_MSG, *PPSX_TCSENDBREAK_MSG;
//
// PsxTcDrain
//
typedef struct _PSX_TCDRAIN_MSG { IN LONG FileDes; } PSX_TCDRAIN_MSG, *PPSX_TCDRAIN_MSG;
//
// PsxTcFlush
//
typedef struct _PSX_TCFLUSH_MSG { IN LONG FileDes; IN LONG QueueSelector; } PSX_TCFLUSH_MSG, *PPSX_TCFLUSH_MSG;
//
// PsxTcFlow
//
typedef struct _PSX_TCFLOW_MSG { IN LONG FileDes; IN LONG Action; } PSX_TCFLOW_MSG, *PPSX_TCFLOW_MSG;
//
// PsxTcGetPGrp
//
typedef struct _PSX_TCGETPGRP_MSG { IN LONG FileDes; } PSX_TCGETPGRP_MSG, *PPSX_TCGETPGRP_MSG;
//
// PsxTcSetPGrp
//
typedef struct _PSX_TCSETPGRP_MSG { IN LONG FileDes; IN pid_t PGrpId; } PSX_TCSETPGRP_MSG, *PPSX_TCSETPGRP_MSG;
//
// PsxGetPwUid
//
typedef struct _PSX_GETPWUID_MSG { IN uid_t Uid; IN struct passwd *PwBuf; OUT int Length; } PSX_GETPWUID_MSG, *PPSX_GETPWUID_MSG;
//
// PsxGetPwNam
//
typedef struct _PSX_GETPWNAM_MSG { IN char *Name; IN struct passwd *PwBuf; OUT int Length; } PSX_GETPWNAM_MSG, *PPSX_GETPWNAM_MSG;
//
// PsxGetGrGid
//
typedef struct _PSX_GETGRGID_MSG { IN gid_t Gid; IN struct group *GrBuf; OUT int Length; } PSX_GETGRGID_MSG, *PPSX_GETGRGID_MSG;
//
// PsxGetGrNam
//
typedef struct _PSX_GETGRNAM_MSG { IN char *Name; IN struct group *GrBuf; OUT int Length; } PSX_GETGRNAM_MSG, *PPSX_GETGRNAM_MSG;
//
// PsxGetGroups
//
typedef struct _PSX_GETGROUPS_MSG { IN int NGroups; IN gid_t *GroupList; } PSX_GETGROUPS_MSG, *PPSX_GETGROUPS_MSG;
//
// PsxUnlink
//
typedef struct _PSX_UNLINK_MSG { IN UNICODE_STRING Path_U; } PSX_UNLINK_MSG, *PPSX_UNLINK_MSG;
//
// PsxFtruncate
//
typedef struct _PSX_FTRUNCATE_MSG { IN LONG FileDes; IN off_t Length; } PSX_FTRUNCATE_MSG, *PPSX_FTRUNCATE_MSG;
#ifdef PSX_SOCKET
//
// -------- Messages for sockets.
//
//
// PsxSocket
//
typedef struct _PSX_SOCKET_MSG { IN INT AddressFamily; IN INT Type; IN INT Protocol; } PSX_SOCKET_MSG, *PPSX_SOCKET_MSG;
//
// PsxAccept
//
typedef struct _PSX_ACCEPT_MSG { IN INT Socket; IN struct sockaddr *Address; IN OUT INT AddressLength; } PSX_ACCEPT_MSG, *PPSX_ACCEPT_MSG;
typedef struct _PSX_BIND_MSG { IN INT Socket; IN struct sockaddr *Name; IN INT NameLength; } PSX_BIND_MSG, *PPSX_BIND_MSG;
typedef struct _PSX_CONNECT_MSG { IN INT Socket; IN struct sockaddr *Name; IN INT NameLength; } PSX_CONNECT_MSG, *PPSX_CONNECT_MSG;
typedef struct _PSX_GETPEERNAME_MSG { IN INT Socket; IN struct sockaddr *Name; IN OUT INT NameLength; } PSX_GETPEERNAME_MSG, *PPSX_GETPEERNAME_MSG;
typedef struct _PSX_GETSOCKNAME_MSG { IN INT Socket; IN struct sockaddr *Name; IN OUT INT NameLength; } PSX_GETSOCKNAME_MSG, *PPSX_GETSOCKNAME_MSG;
typedef struct _PSX_GETSOCKOPT_MSG { IN INT Socket; IN INT Level; IN INT OptName; IN PCHAR OptVal; IN OUT INT OptVal; } PSX_GETSOCKOPT_MSG, *PPSX_GETSOCKOPT_MSG;
typedef struct _PSX_LISTEN_MSG { IN INT Socket; IN INT BackLog; } PSX_LISTEN_MSG, *PPSX_LISTEN_MSG;
typedef struct _PSX_RECV_MSG { IN INT Socket; IN PCHAR Buffer; IN INT Length; IN INT Flags; } PSX_RECV_MSG, *PPSX_RECV_MSG;
typedef struct _PSX_RECVFROM_MSG { IN INT Socket; IN PCHAR Buffer; IN INT Length; IN INT Flags; IN struct sockaddr *From; IN INT FromLength; } PSX_RECVFROM_MSG, *PPSX_RECVFROM_MSG;
typdef struct _PSX_SEND_MSG { IN INT Socket; IN PCHAR Buffer; IN INT Length; IN INT Flags; } PSX_SEND_MSG, *PPSX_SEND_MSG;
typedef struct _PSX_SENDTO_MSG { IN INT Socket; IN PCHAR Buffer; IN INT Length; IN INT Flags; IN struct sockaddr *To; IN INT ToLength; } PSX_SENDTO_MSG, *PPSX_SENDTO_MSG;
typdef struct _PSX_SETSOCKOPT_MSG { IN INT Socket; IN INT Level; IN INT OptName; IN PCHAR OptVal; IN INT OptLen; } PSX_SETSOCKOPT_MSG, *PPSX_SETSOCKOPT_MSG;
typdef struct _PSX_SHUTDOWN_MSG { IN INT Socket; IN INT How; } PSX_SHUTDOWN_MSG, *PPSX_SHUTDOWN_MSG;
#endif // SOCKET
//
// Each API message is overlayed on top of a PORT_MESSAGE. In addition to
// the common PORT_MESSAGE header (SenderId..MsgInfo), the PSX API message
// format standardizes the first few words of MsgValue. The following data
// structure defines the standard PSX API message header. Each API overlays
// an API specific structure on top of the ArgumentArray.
//
#define MAXPSXAPIARGS (16 - 5)
#define MAXPSXAPIARGS_BYTES ( 4 * MAXPSXAPIARGS )
//
// Each PSX Api Message contains:
//
// Lpc Port Message - Fixed size and not counted in the data length
// Psx Overhead (PSXMSGOVERHEAD)
// *ApiPort
// ApiNumber
// Error
// ReturnValue
// DataBlock
// Signal
// Union Data - Per API Structure
//
//
// For Lpc purposes, the TotalLength of a message is sizeof(PSX_API_MSG)
// and the DataLength is PSXMSGOVERHEAD + the sizeof the per API structure
//
//
#define PSXMSGOVERHEAD 24
typedef struct _PSX_API_MSG { PORT_MESSAGE h; union { PSX_API_CONNECTINFO ConnectionRequest; struct { struct _APIPORT *ApiPort; // Supplied by ApiDispatch
ULONG ApiNumber; // Supplied by client range valid by ApiDispatch
ULONG Error; // 0'd by ApiDispatch service sets to errno value if appropriate
ULONG ReturnValue; // Api Function Return Code
PVOID DataBlock; // Null or Pointer into message buffer
ULONG Signal; // Signal, if Error == EINTR
union { PSX_FORK_MSG Fork; PSX_EXEC_MSG Exec; PSX_WAITPID_MSG WaitPid; PSX_EXIT_MSG Exit; PSX_KILL_MSG Kill; PSX_SIGACTION_MSG SigAction; PSX_SIGPROCMASK_MSG SigProcMask; PSX_SIGPENDING_MSG SigPending; PSX_SIGSUSPEND_MSG SigSuspend; PSX_ALARM_MSG Alarm; PSX_GETIDS_MSG GetIds; PSX_SETUID_MSG SetUid; PSX_SETGID_MSG SetGid; PSX_GETGROUPS_MSG GetGroups; PSX_GETLOGIN_MSG GetLogin; PSX_CUSERID_MSG CUserId; PSX_SETPGROUPID_MSG SetPGroupId; PSX_UNAME_MSG Uname; PSX_TIME_MSG Time; PSX_GETPROCESSTIMES_MSG GetProcessTimes; PSX_TTYNAME_MSG TtyName; PSX_ISATTY_MSG Isatty; PSX_SYSCONF_MSG Sysconf; PSX_OPEN_MSG Open; PSX_UMASK_MSG Umask; PSX_LINK_MSG Link; PSX_MKDIR_MSG MkDir; PSX_MKFIFO_MSG MkFifo; PSX_RMDIR_MSG RmDir; PSX_RENAME_MSG Rename; PSX_STAT_MSG Stat; PSX_FSTAT_MSG FStat; PSX_ACCESS_MSG Access; PSX_CHMOD_MSG Chmod; PSX_CHOWN_MSG Chown; PSX_UTIME_MSG Utime; PSX_PATHCONF_MSG PathConf; PSX_FPATHCONF_MSG FPathConf; PSX_PIPE_MSG Pipe; PSX_DUP_MSG Dup; PSX_DUP2_MSG Dup2; PSX_CLOSE_MSG Close; PSX_READ_MSG Read; PSX_READDIR_MSG ReadDir; PSX_WRITE_MSG Write; PSX_FCNTL_MSG Fcntl; PSX_LSEEK_MSG Lseek; PSX_TCGETATTR_MSG TcGetAttr; PSX_TCSETATTR_MSG TcSetAttr; PSX_TCSENDBREAK_MSG TcSendBreak; PSX_TCDRAIN_MSG TcDrain; PSX_TCFLUSH_MSG TcFlush; PSX_TCFLOW_MSG TcFlow; PSX_TCGETPGRP_MSG TcGetPGrp; PSX_TCSETPGRP_MSG TcSetPGrp; PSX_GETPWUID_MSG GetPwUid; PSX_GETPWNAM_MSG GetPwNam; PSX_GETGRGID_MSG GetGrGid; PSX_GETGRNAM_MSG GetGrNam; PSX_UNLINK_MSG Unlink; PSX_FTRUNCATE_MSG Ftruncate;
#ifdef PSX_SOCKET
PSX_SOCKET_MSG Socket; PSX_ACCEPT_MSG Accept; PSX_BIND_MSG Bind; PSX_CONNECT_MSG Connect; PSX_GETPEERNAME_MSG GetPeerName; PSX_GETSOCKNAME_MSG GetSockName; PSX_GETSOCKOPT_MSG GetSockOpt; PSX_LISTEN_MSG Listen; PSX_RECV_MSG Recv; PSX_RECVFROM_MSG RecvFrom; PSX_SEND_MSG Send; PSX_SENDTO_MSG SendTo; PSX_SETSOCKOPT_MSG SetSockOpt; PSX_SHUTDOWN_MSG Shutdown;
#endif // PSX_SOCKET
} u; }; }; } PSX_API_MSG; typedef PSX_API_MSG *PPSX_API_MSG;
#define PSX_API_MSG_LENGTH(TypeSize) \
sizeof(PSX_API_MSG)<<16 | (PSXMSGOVERHEAD + (TypeSize))
#define PSX_FORMAT_API_MSG(m,Number,TypeSize) \
(m).h.u1.Length = PSX_API_MSG_LENGTH((TypeSize)); \ (m).h.u2.ZeroInit = 0L; \ (m).ApiNumber = (Number)
//
// PSX_CLIENT_PORT_MEMORY_SIZE defines how much address space should be
// reserved for passing data to the POSIX Server. The memory is visible
// to both the client and server processes.
//
#define PSX_CLIENT_PORT_MEMORY_SIZE 0x8000
#define PSX_SS_API_PORT_NAME L"\\PSXSS\\ApiPort"
#endif // _PSXMSG_
|