]> asedeno.scripts.mit.edu Git - PuTTY.git/blobdiff - unix/uxpty.c
Key rollover: rewrite the PGP keys manual appendix.
[PuTTY.git] / unix / uxpty.c
index 4a606efda87e4f40df787777303c918c5d974fda..e504b7050a8d28f9adc1aedba0421c18b62fb05a 100644 (file)
@@ -373,15 +373,7 @@ static void pty_open_master(Pty pty)
     strncpy(pty->name, ptsname(pty->master_fd), FILENAME_MAX-1);
 #endif
 
-    {
-        /*
-         * Set the pty master into non-blocking mode.
-         */
-        int fl;
-       fl = fcntl(pty->master_fd, F_GETFL);
-       if (fl != -1 && !(fl & O_NONBLOCK))
-           fcntl(pty->master_fd, F_SETFL, fl | O_NONBLOCK);
-    }
+    nonblock(pty->master_fd);
 
     if (!ptys_by_fd)
        ptys_by_fd = newtree234(pty_compare_by_fd);
@@ -746,14 +738,29 @@ static const char *pty_init(void *frontend, void **backend_handle, Conf *conf,
        pty_open_master(pty);
 
     /*
-     * Set the backspace character to be whichever of ^H and ^? is
-     * specified by bksp_is_delete.
+     * Set up configuration-dependent termios settings on the new pty.
      */
     {
        struct termios attrs;
        tcgetattr(pty->master_fd, &attrs);
+
+        /*
+         * Set the backspace character to be whichever of ^H and ^? is
+         * specified by bksp_is_delete.
+         */
        attrs.c_cc[VERASE] = conf_get_int(conf, CONF_bksp_is_delete)
            ? '\177' : '\010';
+
+        /*
+         * Set the IUTF8 bit iff the character set is UTF-8.
+         */
+#ifdef IUTF8
+        if (frontend_is_utf8(frontend))
+            attrs.c_iflag |= IUTF8;
+        else
+            attrs.c_iflag &= ~IUTF8;
+#endif
+
        tcsetattr(pty->master_fd, TCSANOW, &attrs);
     }
 
@@ -808,7 +815,7 @@ static const char *pty_init(void *frontend, void **backend_handle, Conf *conf,
        }
 
        close(pty->master_fd);
-       fcntl(slavefd, F_SETFD, 0);    /* don't close on exec */
+       noncloexec(slavefd);
        dup2(slavefd, 0);
        dup2(slavefd, 1);
        dup2(slavefd, 2);
@@ -842,6 +849,19 @@ static const char *pty_init(void *frontend, void **backend_handle, Conf *conf,
             * environment in place.
             */
        }
+        {
+            /*
+             * In case we were invoked with a --display argument that
+             * doesn't match DISPLAY in our actual environment, we
+             * should set DISPLAY for processes running inside the
+             * terminal to match the display the terminal itself is
+             * on.
+             */
+            const char *x_display = get_x_display(pty->frontend);
+            char *x_display_env_var = dupprintf("DISPLAY=%s", x_display);
+            putenv(x_display_env_var);
+            /* As above, we don't free this. */
+        }
 #endif
        {
            char *key, *val;
@@ -946,7 +966,7 @@ static const char *pty_init(void *frontend, void **backend_handle, Conf *conf,
 
     *backend_handle = pty;
 
-    *realhost = dupprintf("\0");
+    *realhost = dupstr("");
 
     return NULL;
 }