pty backend now supports the changed function interface, so pterm
authorsimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Fri, 25 Oct 2002 11:50:51 +0000 (11:50 +0000)
committersimon <simon@cda61777-01e9-0310-a592-d414129be87e>
Fri, 25 Oct 2002 11:50:51 +0000 (11:50 +0000)
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

unix/pterm.c
unix/pty.c

index 73cd4bc..93bb74e 100644 (file)
@@ -886,8 +886,8 @@ void done_with_pty(struct gui_data *inst)
        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);
@@ -938,7 +938,7 @@ gint timer_func(gpointer 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,
@@ -1941,7 +1941,7 @@ int main(int argc, char **argv)
     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 */
index cede076..44348a3 100644 (file)
@@ -1,3 +1,16 @@
+/*
+ * 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>
@@ -369,12 +382,14 @@ void pty_pre_init(void)
  * 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;
 
+    *backend_handle = NULL;           /* we can't sensibly use this, sadly */
+
     pty_term_width = cfg.width;
     pty_term_height = cfg.height;
 
@@ -493,7 +508,7 @@ static char *pty_init(void *frontend,
 /*
  * 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 */
@@ -522,7 +537,7 @@ void pty_close(void)
 /*
  * Called to query the current socket sendability status.
  */
-static int pty_sendbuffer(void)
+static int pty_sendbuffer(void *handle)
 {
     return 0;
 }
@@ -530,7 +545,7 @@ static int pty_sendbuffer(void)
 /*
  * 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)
 {
     struct winsize size;
 
@@ -548,33 +563,33 @@ static void pty_size(int width, int height)
 /*
  * Send special codes.
  */
-static void pty_special(Telnet_Special code)
+static void pty_special(void *handle, Telnet_Special code)
 {
     /* Do nothing! */
     return;
 }
 
-static Socket pty_socket(void)
+static Socket pty_socket(void *handle)
 {
     return NULL;                      /* shouldn't ever be needed */
 }
 
-static int pty_sendok(void)
+static int pty_sendok(void *handle)
 {
     return 1;
 }
 
-static void pty_unthrottle(int backlog)
+static void pty_unthrottle(void *handle, int backlog)
 {
     /* do nothing */
 }
 
-static int pty_ldisc(int option)
+static int pty_ldisc(void *handle, int option)
 {
     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 */