Hacks to support server-side console. Should be redone properly

some day.
This commit is contained in:
Alexandre Julliard 1998-12-30 12:10:49 +00:00
parent fbe63adcc7
commit b2340eaa91
1 changed files with 35 additions and 6 deletions

View File

@ -44,6 +44,9 @@
#include "heap.h"
#include "debug.h"
#include "server/request.h"
#include "server.h"
/* The CONSOLE kernel32 Object */
typedef struct _CONSOLE {
K32OBJ header;
@ -52,6 +55,7 @@ typedef struct _CONSOLE {
int master; /* xterm side of pty */
int infd,outfd;
int hread, hwrite; /* server handles (hack) */
int pid; /* xterm's pid, -1 if no xterm */
LPSTR title; /* title of console */
INPUT_RECORD *irs; /* buffered input records */
@ -652,6 +656,7 @@ static int CONSOLE_openpty(CONSOLE *console, char *name,
int fdm, fds;
char *ptr1, *ptr2;
char pts_name[512];
struct set_console_fd_request req;
strcpy (pts_name, "/dev/ptyXY");
@ -673,7 +678,13 @@ static int CONSOLE_openpty(CONSOLE *console, char *name,
}
console->master = fdm;
console->infd = console->outfd = fds;
req.handle = console->hread;
CLIENT_SendRequest( REQ_SET_CONSOLE_FD, dup(fds), 1, &req, sizeof(req) );
CLIENT_WaitReply( NULL, NULL, 0 );
req.handle = console->hwrite;
CLIENT_SendRequest( REQ_SET_CONSOLE_FD, dup(fds), 1, &req, sizeof(req) );
CLIENT_WaitReply( NULL, NULL, 0 );
if (term != NULL)
tcsetattr(console->infd, TCSANOW, term);
if (winsize != NULL)
@ -777,7 +788,9 @@ HFILE32 CONSOLE_GetConsoleHandle(VOID)
*/
BOOL32 WINAPI AllocConsole(VOID)
{
struct create_console_request req;
struct create_console_reply reply;
int len;
PDB32 *pdb = PROCESS_Current();
CONSOLE *console;
HANDLE32 hIn, hOut, hErr;
@ -815,15 +828,30 @@ BOOL32 WINAPI AllocConsole(VOID)
/* FIXME: we shouldn't probably use hardcoded UNIX values here. */
console->infd = 0;
console->outfd = 1;
console->hread = console->hwrite = -1;
if ((hIn = HANDLE_Alloc(pdb,&console->header, 0, TRUE,-1)) == INVALID_HANDLE_VALUE32)
CLIENT_SendRequest( REQ_CREATE_CONSOLE, -1, 1, &req, sizeof(req) );
if (CLIENT_WaitReply( &len, NULL, 1, &reply, sizeof(reply) ) != ERROR_SUCCESS)
{
K32OBJ_DecCount(&console->header);
SYSTEM_UNLOCK();
return FALSE;
}
CHECK_LEN( len, sizeof(reply) );
console->hread = reply.handle_read;
console->hwrite = reply.handle_write;
if ((hIn = HANDLE_Alloc(pdb,&console->header, 0, TRUE,
reply.handle_read)) == INVALID_HANDLE_VALUE32)
{
CLIENT_CloseHandle( reply.handle_write );
K32OBJ_DecCount(&console->header);
SYSTEM_UNLOCK();
return FALSE;
}
if ((hOut = HANDLE_Alloc(pdb,&console->header, 0, TRUE,-1)) == INVALID_HANDLE_VALUE32)
if ((hOut = HANDLE_Alloc(pdb,&console->header, 0, TRUE,
reply.handle_write)) == INVALID_HANDLE_VALUE32)
{
CloseHandle(hIn);
K32OBJ_DecCount(&console->header);
@ -831,8 +859,9 @@ BOOL32 WINAPI AllocConsole(VOID)
return FALSE;
}
if ((hErr = HANDLE_Alloc(pdb,&console->header, 0, TRUE,-1)) == INVALID_HANDLE_VALUE32)
if (!DuplicateHandle( GetCurrentProcess(), hOut,
GetCurrentProcess(), &hErr,
0, TRUE, DUPLICATE_SAME_ACCESS ))
{
CloseHandle(hIn);
CloseHandle(hOut);