/*++ Copyright (c) 1991 Microsoft Corporation Module Name: dlltc.c Abstract: Client implementation of Terminal Control functions for POSIX Author: Ellen Aycock-Wright 05-Aug-1991 Revision History: --*/ #include #include "psxdll.h" int __cdecl tcgetattr (int fildes, struct termios *termios_p) { PSX_API_MSG m; NTSTATUS st; SCREQUESTMSG Request; PPSX_TCGETATTR_MSG args; args = &m.u.TcGetAttr; PSX_FORMAT_API_MSG(m,PsxTcGetAttrApi,sizeof(*args)); args->FileDes = fildes; args->Termios = termios_p; st = NtRequestWaitReplyPort( PsxPortHandle, (PPORT_MESSAGE) &m, (PPORT_MESSAGE) &m ); if ( m.Error ) { errno = (int) m.Error; return (int) -1; } // // fildes is a valid file descriptor; now call to posix.exe to get // the real terminal settings. // Request.Request = TcRequest; Request.d.Con.Request = TcGetAttr; st = SendConsoleRequest(&Request); memcpy(termios_p, &Request.d.Tc.Termios, sizeof(*termios_p)); if (!NT_SUCCESS(st)) { errno = PdxStatusToErrno(st); return -1; } return 0; } int __cdecl tcsetattr(int fildes, int optional_actions, const struct termios *termios_p) { PSX_API_MSG m; NTSTATUS st; SCREQUESTMSG Request; PPSX_TCSETATTR_MSG args; args = &m.u.TcSetAttr; PSX_FORMAT_API_MSG(m,PsxTcSetAttrApi,sizeof(*args)); args->FileDes = fildes; args->OptionalActions = optional_actions; args->Termios = (struct termios *)termios_p; st = NtRequestWaitReplyPort( PsxPortHandle, (PPORT_MESSAGE) &m, (PPORT_MESSAGE) &m ); if ( m.Error ) { errno = (int) m.Error; return (int) -1; } // // The file descriptor is valid; make the request to posix.exe to // set the attributes. // Request.Request = TcRequest; Request.d.Con.Request = TcSetAttr; memcpy(&Request.d.Tc.Termios, termios_p, sizeof(*termios_p)); st = SendConsoleRequest(&Request); if (!NT_SUCCESS(st)) { errno = PdxStatusToErrno(st); return -1; } return 0; } int __cdecl tcsendbreak (int fildes, int duration) { PSX_API_MSG m; NTSTATUS st; PPSX_TCSENDBREAK_MSG args; args = &m.u.TcSendBreak; PSX_FORMAT_API_MSG(m,PsxTcSendBreakApi,sizeof(*args)); args->FileDes = fildes; args->Duration = duration; st = NtRequestWaitReplyPort( PsxPortHandle, (PPORT_MESSAGE) &m, (PPORT_MESSAGE) &m ); if ( m.Error ) { errno = (int) m.Error; return (int) -1; } else { return (int) m.ReturnValue; } } int __cdecl tcdrain (int fildes) { PSX_API_MSG m; NTSTATUS st; PPSX_TCDRAIN_MSG args; args = &m.u.TcDrain; PSX_FORMAT_API_MSG(m,PsxTcDrainApi,sizeof(*args)); args->FileDes = fildes; st = NtRequestWaitReplyPort( PsxPortHandle, (PPORT_MESSAGE) &m, (PPORT_MESSAGE) &m ); if ( m.Error ) { errno = (int) m.Error; return (int) -1; } else { return (int) m.ReturnValue; } } int __cdecl tcflush (int fildes, int queue_selector) { PSX_API_MSG m; NTSTATUS st; PPSX_TCFLUSH_MSG args; args = &m.u.TcFlush; PSX_FORMAT_API_MSG(m,PsxTcFlushApi,sizeof(*args)); args->FileDes = fildes; args->QueueSelector = queue_selector; st = NtRequestWaitReplyPort( PsxPortHandle, (PPORT_MESSAGE) &m, (PPORT_MESSAGE) &m ); if ( m.Error ) { errno = (int) m.Error; return (int) -1; } else { return (int) m.ReturnValue; } } int __cdecl tcflow (int fildes, int action) { PSX_API_MSG m; NTSTATUS st; PPSX_TCFLOW_MSG args; args = &m.u.TcFlow; PSX_FORMAT_API_MSG(m,PsxTcFlowApi,sizeof(*args)); args->FileDes = fildes; args->Action = action; st = NtRequestWaitReplyPort( PsxPortHandle, (PPORT_MESSAGE) &m, (PPORT_MESSAGE) &m ); if ( m.Error ) { errno = (int) m.Error; return (int) -1; } else { return (int) m.ReturnValue; } } pid_t __cdecl tcgetpgrp (int fildes) { PSX_API_MSG m; NTSTATUS st; PPSX_TCGETPGRP_MSG args; args = &m.u.TcGetPGrp; PSX_FORMAT_API_MSG(m,PsxTcGetPGrpApi,sizeof(*args)); args->FileDes = fildes; st = NtRequestWaitReplyPort( PsxPortHandle, (PPORT_MESSAGE) &m, (PPORT_MESSAGE) &m ); if ( m.Error ) { errno = (int) m.Error; return (pid_t) -1; } else { return (pid_t) m.ReturnValue; } } int __cdecl tcsetpgrp(int fildes, pid_t pgrp_id) { PSX_API_MSG m; NTSTATUS st; PPSX_TCSETPGRP_MSG args; args = &m.u.TcSetPGrp; PSX_FORMAT_API_MSG(m,PsxTcSetPGrpApi,sizeof(*args)); args->FileDes = fildes; args->PGrpId = pgrp_id; st = NtRequestWaitReplyPort( PsxPortHandle, (PPORT_MESSAGE) &m, (PPORT_MESSAGE) &m ); if ( m.Error ) { errno = (int) m.Error; return (pid_t) -1; } else { return (pid_t) m.ReturnValue; } }