/*++

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_