{
if (!strcmp(name, "TermType"))
return dupstr(getenv("TERM"));
- if (!strcmp(name, "UserName"))
- return get_username();
+ if (!strcmp(name, "UserName"))
+ return get_username();
if (!strcmp(name, "SerialLine"))
return dupstr("/dev/ttyS0");
return NULL;
bufchain stdout_data, stderr_data;
-void try_output(int is_stderr)
+int try_output(int is_stderr)
{
bufchain *chain = (is_stderr ? &stderr_data : &stdout_data);
int fd = (is_stderr ? STDERR_FILENO : STDOUT_FILENO);
int sendlen, ret, fl;
if (bufchain_size(chain) == 0)
- return;
+ return bufchain_size(&stdout_data) + bufchain_size(&stderr_data);
- bufchain_prefix(chain, &senddata, &sendlen);
fl = fcntl(fd, F_GETFL);
if (fl != -1 && !(fl & O_NONBLOCK))
fcntl(fd, F_SETFL, fl | O_NONBLOCK);
- ret = write(fd, senddata, sendlen);
+ do {
+ bufchain_prefix(chain, &senddata, &sendlen);
+ ret = write(fd, senddata, sendlen);
+ if (ret > 0)
+ bufchain_consume(chain, ret);
+ } while (ret == sendlen && bufchain_size(chain) != 0);
if (fl != -1 && !(fl & O_NONBLOCK))
fcntl(fd, F_SETFL, fl);
- if (ret > 0)
- bufchain_consume(chain, ret);
- else if (ret < 0 && errno != EAGAIN) {
+ if (ret < 0 && errno != EAGAIN) {
perror(is_stderr ? "stderr: write" : "stdout: write");
exit(1);
}
+ return bufchain_size(&stdout_data) + bufchain_size(&stderr_data);
}
int from_backend(void *frontend_handle, int is_stderr,
const char *data, int len)
{
- int osize, esize;
-
if (is_stderr) {
bufchain_add(&stderr_data, data, len);
- try_output(TRUE);
+ return try_output(TRUE);
} else {
bufchain_add(&stdout_data, data, len);
- try_output(FALSE);
+ return try_output(FALSE);
}
-
- osize = bufchain_size(&stdout_data);
- esize = bufchain_size(&stderr_data);
-
- return osize + esize;
}
int from_backend_untrusted(void *frontend_handle, const char *data, int len)
void sigwinch(int signum)
{
- write(signalpipe[1], "x", 1);
+ if (write(signalpipe[1], "x", 1) <= 0)
+ /* not much we can do about it */;
}
/*
printf(" -pgpfp print PGP key fingerprints and exit\n");
printf(" -v show verbose messages\n");
printf(" -load sessname Load settings from saved session\n");
- printf(" -ssh -telnet -rlogin -raw\n");
+ printf(" -ssh -telnet -rlogin -raw -serial\n");
printf(" force use of a particular protocol\n");
printf(" -P port connect to specified port\n");
printf(" -l user connect with specified username\n");
printf(" -N don't start a shell/command (SSH-2 only)\n");
printf(" -nc host:port\n");
printf(" open tunnel in place of session (SSH-2 only)\n");
+ printf(" -sercfg configuration-string (e.g. 19200,8,n,1,X)\n");
+ printf(" Specify the serial configuration (serial only)\n");
exit(1);
}
int exitcode;
int errors;
int use_subsystem = 0;
+ int got_host = FALSE;
void *ldisc;
long now;
errors = 1;
}
} else if (*p) {
- if (!cfg_launchable(&cfg)) {
+ if (!cfg_launchable(&cfg) || !(got_host || loaded_session)) {
char *q = p;
/*
cfg.port = -1;
strncpy(cfg.host, q, sizeof(cfg.host) - 1);
cfg.host[sizeof(cfg.host) - 1] = '\0';
+ got_host = TRUE;
} else {
char *r, *user, *host;
/*
strncpy(cfg.host, host, sizeof(cfg.host) - 1);
cfg.host[sizeof(cfg.host) - 1] = '\0';
cfg.port = default_port;
+ got_host = TRUE;
} else {
cfg = cfg2;
+ loaded_session = TRUE;
}
}
if (errors)
return 1;
- if (!cfg_launchable(&cfg)) {
+ if (!cfg_launchable(&cfg) || !(got_host || loaded_session)) {
usage();
}
if (FD_ISSET(signalpipe[0], &rset)) {
char c[1];
struct winsize size;
- read(signalpipe[0], c, 1); /* ignore its value; it'll be `x' */
+ if (read(signalpipe[0], c, 1) <= 0)
+ /* ignore error */;
+ /* ignore its value; it'll be `x' */
if (ioctl(0, TIOCGWINSZ, (void *)&size) >= 0)
back->size(backhandle, size.ws_col, size.ws_row);
}
}
if (FD_ISSET(STDOUT_FILENO, &wset)) {
- try_output(FALSE);
+ back->unthrottle(backhandle, try_output(FALSE));
}
if (FD_ISSET(STDERR_FILENO, &wset)) {
- try_output(TRUE);
+ back->unthrottle(backhandle, try_output(TRUE));
}
if ((!connopen || !back->connected(backhandle)) &&