static Backend *back;
static void *backhandle;
+static Config cfg;
/*
* Default settings that are specific to pterm.
*/
-char *platform_default_s(char *name)
+char *platform_default_s(const char *name)
{
if (!strcmp(name, "X11Display"))
return getenv("DISPLAY");
return NULL;
}
-int platform_default_i(char *name, int def)
+int platform_default_i(const char *name, int def)
{
if (!strcmp(name, "TermWidth") ||
!strcmp(name, "TermHeight")) {
return def;
}
-char *x_get_default(char *key)
+FontSpec platform_default_fontspec(const char *name)
+{
+ FontSpec ret;
+ *ret.name = '\0';
+ return ret;
+}
+
+Filename platform_default_filename(const char *name)
+{
+ Filename ret;
+ if (!strcmp(name, "LogFileName"))
+ strcpy(ret.path, "putty.log");
+ else
+ *ret.path = '\0';
+ return ret;
+}
+
+char *x_get_default(const char *key)
{
return NULL; /* this is a stub */
}
}
}
-int from_backend(void *frontend_handle, int is_stderr, char *data, int len)
+int from_backend(void *frontend_handle, int is_stderr,
+ const char *data, int len)
{
int osize, esize;
}
/*
+ * In Plink our selects are synchronous, so these functions are
+ * empty stubs.
+ */
+int uxsel_input_add(int fd, int rwx) { return 0; }
+void uxsel_input_remove(int id) { }
+
+/*
* Short description of parameters.
*/
static void usage(void)
printf(" -batch disable all interactive prompts\n");
printf("The following options only apply to SSH connections:\n");
printf(" -pw passw login with specified password\n");
+ printf(" -D listen-port Dynamic SOCKS-based port forwarding\n");
printf(" -L listen-port:host:port Forward local port to "
"remote address\n");
printf(" -R listen-port:host:port Forward remote port to"
{
int sending;
int portnumber = -1;
- int *sklist;
- int socket;
- int i, skcount, sksize, socketstate;
+ int *fdlist;
+ int fd;
+ int i, fdcount, fdsize, fdstate;
int connopen;
int exitcode;
int errors;
ssh_get_line = console_get_line;
- sklist = NULL;
- skcount = sksize = 0;
+ fdlist = NULL;
+ fdcount = fdsize = 0;
/*
* Initialise port and protocol to sensible defaults. (These
* will be overridden by more or less anything.)
while (*p) {
if (cmdlen >= cmdsize) {
cmdsize = cmdlen + 512;
- command = srealloc(command, cmdsize);
+ command = sresize(command, cmdsize, char);
}
command[cmdlen++]=*p++;
}
if (cmdlen >= cmdsize) {
cmdsize = cmdlen + 512;
- command = srealloc(command, cmdsize);
+ command = sresize(command, cmdsize, char);
}
command[cmdlen++]=' '; /* always add trailing space */
if (--argc) p = *++argv;
putty_signal(SIGWINCH, sigwinch);
sk_init();
+ uxsel_init();
/*
* Start up the connection.
*/
- logctx = log_init(NULL);
+ logctx = log_init(NULL, &cfg);
{
- char *error;
+ const char *error;
char *realhost;
/* nodelay is only useful if stdin is a terminal device */
int nodelay = cfg.tcp_nodelay && isatty(0);
- error = back->init(NULL, &backhandle, cfg.host, cfg.port,
+ error = back->init(NULL, &backhandle, &cfg, cfg.host, cfg.port,
&realhost, nodelay);
if (error) {
fprintf(stderr, "Unable to open connection:\n%s\n", error);
FD_SET_MAX(2, maxfd, wset);
}
- /* Count the currently active sockets. */
+ /* Count the currently active fds. */
i = 0;
- for (socket = first_socket(&socketstate, &rwx); socket >= 0;
- socket = next_socket(&socketstate, &rwx)) i++;
+ for (fd = first_fd(&fdstate, &rwx); fd >= 0;
+ fd = next_fd(&fdstate, &rwx)) i++;
- /* Expand the sklist buffer if necessary. */
- if (i > sksize) {
- sksize = i + 16;
- sklist = srealloc(sklist, sksize * sizeof(*sklist));
+ /* Expand the fdlist buffer if necessary. */
+ if (i > fdsize) {
+ fdsize = i + 16;
+ fdlist = sresize(fdlist, fdsize, int);
}
/*
- * Add all currently open sockets to the select sets, and
- * store them in sklist as well.
+ * Add all currently open fds to the select sets, and store
+ * them in fdlist as well.
*/
- skcount = 0;
- for (socket = first_socket(&socketstate, &rwx); socket >= 0;
- socket = next_socket(&socketstate, &rwx)) {
- sklist[skcount++] = socket;
+ fdcount = 0;
+ for (fd = first_fd(&fdstate, &rwx); fd >= 0;
+ fd = next_fd(&fdstate, &rwx)) {
+ fdlist[fdcount++] = fd;
if (rwx & 1)
- FD_SET_MAX(socket, maxfd, rset);
+ FD_SET_MAX(fd, maxfd, rset);
if (rwx & 2)
- FD_SET_MAX(socket, maxfd, wset);
+ FD_SET_MAX(fd, maxfd, wset);
if (rwx & 4)
- FD_SET_MAX(socket, maxfd, xset);
+ FD_SET_MAX(fd, maxfd, xset);
}
do {
exit(1);
}
- for (i = 0; i < skcount; i++) {
- socket = sklist[i];
+ for (i = 0; i < fdcount; i++) {
+ fd = fdlist[i];
/*
* We must process exceptional notifications before
* ordinary readability ones, or we may go straight
* past the urgent marker.
*/
- if (FD_ISSET(socket, &xset))
- select_result(socket, 4);
- if (FD_ISSET(socket, &rset))
- select_result(socket, 1);
- if (FD_ISSET(socket, &wset))
- select_result(socket, 2);
+ if (FD_ISSET(fd, &xset))
+ select_result(fd, 4);
+ if (FD_ISSET(fd, &rset))
+ select_result(fd, 1);
+ if (FD_ISSET(fd, &wset))
+ select_result(fd, 2);
}
if (FD_ISSET(signalpipe[0], &rset)) {