now compiles and runs again after the major destabilisation.
Unfortunately it wasn't feasible to actually encapsulate all of the
pty backend's data, since the utmp helper and the need to fork and
drop privileges before doing anything else at all rather confuses
matters. So the data handle passed around to the pty backend is a
null pointer, and the pty backend is just as global-ridden as it
always has been. Shame, but such is life.
git-svn-id: svn://svn.tartarus.org/sgt/putty@2128
cda61777-01e9-0310-a592-
d414129be87e
gtk_input_remove(inst->master_func_id);
}
gtk_input_remove(inst->master_func_id);
}
- if (!inst->exited && back->exitcode() >= 0) {
- int exitcode = back->exitcode();
+ if (!inst->exited && back->exitcode(backhandle) >= 0) {
+ int exitcode = back->exitcode(backhandle);
int clean;
clean = WIFEXITED(exitcode) && (WEXITSTATUS(exitcode) == 0);
int clean;
clean = WIFEXITED(exitcode) && (WEXITSTATUS(exitcode) == 0);
{
struct gui_data *inst = (struct gui_data *)data;
{
struct gui_data *inst = (struct gui_data *)data;
- if (back->exitcode() >= 0) {
+ if (back->exitcode(backhandle) >= 0) {
/*
* The primary child process died. We could keep the
* terminal open for remaining subprocesses to output to,
/*
* The primary child process died. We could keep the
* terminal open for remaining subprocesses to output to,
term = term_init();
back = &pty_backend;
term = term_init();
back = &pty_backend;
- back->init((void *)term, NULL, 0, NULL, 0);
+ back->init((void *)term, &backhandle, NULL, 0, NULL, 0);
term_size(term, cfg.height, cfg.width, cfg.savelines);
ldisc_send(NULL, 0, 0); /* cause ldisc to notice changes */
term_size(term, cfg.height, cfg.width, cfg.savelines);
ldisc_send(NULL, 0, 0); /* cause ldisc to notice changes */
+/*
+ * Pseudo-tty backend for pterm.
+ *
+ * Unlike the other backends, data for this one is not neatly
+ * encapsulated into a data structure, because it wouldn't make
+ * sense to do so - the utmp stuff has to be done before a backend
+ * is initialised, and starting a second pterm from the same
+ * process would therefore be infeasible because privileges would
+ * already have been dropped. Hence, I haven't bothered to keep the
+ * data dynamically allocated: instead, the backend handle is just
+ * a null pointer and ignored everywhere.
+ */
+
#define _XOPEN_SOURCE
#define _XOPEN_SOURCE_EXTENDED
#include <features.h>
#define _XOPEN_SOURCE
#define _XOPEN_SOURCE_EXTENDED
#include <features.h>
* Also places the canonical host name into `realhost'. It must be
* freed by the caller.
*/
* Also places the canonical host name into `realhost'. It must be
* freed by the caller.
*/
-static char *pty_init(void *frontend,
+static char *pty_init(void *frontend, void **backend_handle,
char *host, int port, char **realhost, int nodelay)
{
int slavefd;
pid_t pid, pgrp;
char *host, int port, char **realhost, int nodelay)
{
int slavefd;
pid_t pid, pgrp;
+ *backend_handle = NULL; /* we can't sensibly use this, sadly */
+
pty_term_width = cfg.width;
pty_term_height = cfg.height;
pty_term_width = cfg.width;
pty_term_height = cfg.height;
/*
* Called to send data down the pty.
*/
/*
* Called to send data down the pty.
*/
-static int pty_send(char *buf, int len)
+static int pty_send(void *handle, char *buf, int len)
{
if (pty_master_fd < 0)
return 0; /* ignore all writes if fd closed */
{
if (pty_master_fd < 0)
return 0; /* ignore all writes if fd closed */
/*
* Called to query the current socket sendability status.
*/
/*
* Called to query the current socket sendability status.
*/
-static int pty_sendbuffer(void)
+static int pty_sendbuffer(void *handle)
/*
* Called to set the size of the window
*/
/*
* Called to set the size of the window
*/
-static void pty_size(int width, int height)
+static void pty_size(void *handle, int width, int height)
/*
* Send special codes.
*/
/*
* Send special codes.
*/
-static void pty_special(Telnet_Special code)
+static void pty_special(void *handle, Telnet_Special code)
{
/* Do nothing! */
return;
}
{
/* Do nothing! */
return;
}
-static Socket pty_socket(void)
+static Socket pty_socket(void *handle)
{
return NULL; /* shouldn't ever be needed */
}
{
return NULL; /* shouldn't ever be needed */
}
-static int pty_sendok(void)
+static int pty_sendok(void *handle)
-static void pty_unthrottle(int backlog)
+static void pty_unthrottle(void *handle, int backlog)
-static int pty_ldisc(int option)
+static int pty_ldisc(void *handle, int option)
{
return 0; /* neither editing nor echoing */
}
{
return 0; /* neither editing nor echoing */
}
-static int pty_exitcode(void)
+static int pty_exitcode(void *handle)
{
if (!pty_child_dead)
return -1; /* not dead yet */
{
if (!pty_child_dead)
return -1; /* not dead yet */