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);
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);
}
}
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);
* 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;
*backend_handle = pty;
- *realhost = dupprintf("\0");
+ *realhost = dupstr("");
return NULL;
}