--- rxvt-unicode/src/ptytty.C 2006/01/22 00:48:13 1.54 +++ rxvt-unicode/src/ptytty.C 2006/09/11 08:48:37 1.62 @@ -1,10 +1,14 @@ -/*--------------------------------*-C-*---------------------------------* +// This file is part of libptytty. Do not make local modifications. +// http://software.schmorp.de/pkg/libptytty + +/*----------------------------------------------------------------------* * File: ptytty.C *----------------------------------------------------------------------* * * All portions of code are copyright by their respective author/s. * Copyright (c) 1999-2001 Geoff Wing * Copyright (c) 2004-2006 Marc Lehmann + * Copyright (c) 2006 Emanuele Giaquinta * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -21,16 +25,15 @@ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. *---------------------------------------------------------------------*/ -#include "../config.h" /* NECESSARY */ +#include "../config.h" -#include "fdpass.h" #include "ptytty.h" #include #include +#include #include -#include #include #include @@ -180,6 +183,8 @@ close (pfd); } + + return -1; } #endif @@ -234,7 +239,7 @@ int fd = open ("/dev/tty", O_WRONLY); if (fd < 0) - return -1; /* fatal */ + return -1; /* fatal */ close (fd); @@ -370,190 +375,3 @@ return true; } -#if PTYTTY_HELPER - -static int sock_fd; -static int pid; - -struct command -{ - enum { get, login, destroy } type; - - ptytty *id; - - bool login_shell; - int cmd_pid; - char hostname[512]; // arbitrary, but should be plenty -}; - -struct ptytty_proxy : ptytty -{ - ptytty *id; - - ptytty_proxy () - : id(0) - { - } - - ~ptytty_proxy (); - - bool get (); - void login (int cmd_pid, bool login_shell, const char *hostname); -}; - -bool -ptytty_proxy::get () -{ - command cmd; - - cmd.type = command::get; - - write (sock_fd, &cmd, sizeof (cmd)); - - if (read (sock_fd, &id, sizeof (id)) != sizeof (id)) - fatal ("protocol error while creating pty using helper process, aborting.\n"); - - if (!id) - return false; - - if ((pty = ptytty_recv_fd (sock_fd)) < 0 - || (tty = ptytty_recv_fd (sock_fd)) < 0) - fatal ("protocol error while reading pty/tty fds from helper process, aborting.\n"); - - return true; -} - -void -ptytty_proxy::login (int cmd_pid, bool login_shell, const char *hostname) -{ - command cmd; - - cmd.type = command::login; - cmd.id = id; - cmd.cmd_pid = cmd_pid; - cmd.login_shell = login_shell; - strncpy (cmd.hostname, hostname, sizeof (cmd.hostname)); - - write (sock_fd, &cmd, sizeof (cmd)); -} - -ptytty_proxy::~ptytty_proxy () -{ - if (id) - { - command cmd; - - cmd.type = command::destroy; - cmd.id = id; - - write (sock_fd, &cmd, sizeof (cmd)); - } -} - -static -void serve () -{ - command cmd; - vector ptys; - - while (read (sock_fd, &cmd, sizeof (command)) == sizeof (command)) - { - if (cmd.type == command::get) - { - // -> id ptyfd ttyfd - cmd.id = new ptytty_unix; - - if (cmd.id->get ()) - { - write (sock_fd, &cmd.id, sizeof (cmd.id)); - ptys.push_back (cmd.id); - - ptytty_send_fd (sock_fd, cmd.id->pty); - ptytty_send_fd (sock_fd, cmd.id->tty); - } - else - { - delete cmd.id; - cmd.id = 0; - write (sock_fd, &cmd.id, sizeof (cmd.id)); - } - } - else if (cmd.type == command::login) - { -#if UTMP_SUPPORT - if (find (ptys.begin (), ptys.end (), cmd.id)) - { - cmd.hostname[sizeof (cmd.hostname) - 1] = 0; - cmd.id->login (cmd.cmd_pid, cmd.login_shell, cmd.hostname); - } -#endif - } - else if (cmd.type == command::destroy) - { - ptytty **pty = find (ptys.begin (), ptys.end (), cmd.id); - - if (pty) - { - delete *pty; - ptys.erase (pty); - } - } - else - break; - } - - // destroy all ptys - for (ptytty **i = ptys.end (); i-- > ptys.begin (); ) - delete *i; -} - -void ptytty_server () -{ - int sv[2]; - - if (socketpair (AF_UNIX, SOCK_STREAM, 0, sv)) - fatal ("could not create socket to communicate with pty/sessiondb helper, aborting.\n"); - - pid = fork (); - - if (pid < 0) - fatal ("could not create pty/sessiondb helper process, aborting.\n"); - - if (pid) - { - // client, process - sock_fd = sv[0]; - close (sv[1]); - fcntl (sock_fd, F_SETFD, FD_CLOEXEC); - } - else - { - // server, pty-helper - sock_fd = sv[1]; - - for (int fd = 0; fd < 1023; fd++) - if (fd != sock_fd) - close (fd); - - serve (); - _exit (EXIT_SUCCESS); - } -} - -#endif - -// a "factory" *g* -ptytty * -new_ptytty () -{ -#if PTYTTY_HELPER - if (pid > 0) - // use helper process - return new ptytty_proxy; - else -#endif - return new ptytty_unix; -} - -/*----------------------- end-of-file (C source) -----------------------*/ -