version 1.52.2.2, 2006/02/03 02:53:45 |
version 1.53, 2005/04/28 10:17:56 |
|
|
static char * |
static char * |
Linebuf_getline(Linebuf * lb) |
Linebuf_getline(Linebuf * lb) |
{ |
{ |
size_t n = 0; |
int n = 0; |
void *p; |
void *p; |
|
|
lb->lineno++; |
lb->lineno++; |
|
|
static void |
static void |
congreet(int s) |
congreet(int s) |
{ |
{ |
int n = 0, remote_major = 0, remote_minor = 0; |
int remote_major = 0, remote_minor = 0, n = 0; |
char buf[256], *cp; |
char buf[256], *cp; |
char remote_version[sizeof buf]; |
char remote_version[sizeof buf]; |
size_t bufsiz; |
size_t bufsiz; |
con *c = &fdcon[s]; |
con *c = &fdcon[s]; |
|
|
for (;;) { |
bufsiz = sizeof(buf); |
memset(buf, '\0', sizeof(buf)); |
cp = buf; |
bufsiz = sizeof(buf); |
while (bufsiz-- && (n = atomicio(read, s, cp, 1)) == 1 && *cp != '\n') { |
cp = buf; |
if (*cp == '\r') |
while (bufsiz-- && |
*cp = '\n'; |
(n = atomicio(read, s, cp, 1)) == 1 && *cp != '\n') { |
cp++; |
if (*cp == '\r') |
|
*cp = '\n'; |
|
cp++; |
|
} |
|
if (n != 1 || strncmp(buf, "SSH-", 4) == 0) |
|
break; |
|
} |
} |
if (n == 0) { |
if (n < 0) { |
switch (errno) { |
if (errno != ECONNREFUSED) |
case EPIPE: |
|
error("%s: Connection closed by remote host", c->c_name); |
|
break; |
|
case ECONNREFUSED: |
|
break; |
|
default: |
|
error("read (%s): %s", c->c_name, strerror(errno)); |
error("read (%s): %s", c->c_name, strerror(errno)); |
break; |
|
} |
|
conrecycle(s); |
conrecycle(s); |
return; |
return; |
} |
} |
|
if (n == 0) { |
|
error("%s: Connection closed by remote host", c->c_name); |
|
conrecycle(s); |
|
return; |
|
} |
if (*cp != '\n' && *cp != '\r') { |
if (*cp != '\n' && *cp != '\r') { |
error("%s: bad greeting", c->c_name); |
error("%s: bad greeting", c->c_name); |
confree(s); |
confree(s); |
|
|
n = snprintf(buf, sizeof buf, "SSH-%d.%d-OpenSSH-keyscan\r\n", |
n = snprintf(buf, sizeof buf, "SSH-%d.%d-OpenSSH-keyscan\r\n", |
c->c_keytype == KT_RSA1? PROTOCOL_MAJOR_1 : PROTOCOL_MAJOR_2, |
c->c_keytype == KT_RSA1? PROTOCOL_MAJOR_1 : PROTOCOL_MAJOR_2, |
c->c_keytype == KT_RSA1? PROTOCOL_MINOR_1 : PROTOCOL_MINOR_2); |
c->c_keytype == KT_RSA1? PROTOCOL_MINOR_1 : PROTOCOL_MINOR_2); |
if (n < 0 || (size_t)n >= sizeof(buf)) { |
if (n == -1 || n >= sizeof buf) { |
error("snprintf: buffer too small"); |
error("snprintf: buffer too small"); |
confree(s); |
confree(s); |
return; |
return; |
} |
} |
if (atomicio(vwrite, s, buf, n) != (size_t)n) { |
if (atomicio(vwrite, s, buf, n) != n) { |
error("write (%s): %s", c->c_name, strerror(errno)); |
error("write (%s): %s", c->c_name, strerror(errno)); |
confree(s); |
confree(s); |
return; |
return; |
|
|
conread(int s) |
conread(int s) |
{ |
{ |
con *c = &fdcon[s]; |
con *c = &fdcon[s]; |
size_t n; |
int n; |
|
|
if (c->c_status == CS_CON) { |
if (c->c_status == CS_CON) { |
congreet(s); |
congreet(s); |
return; |
return; |
} |
} |
n = atomicio(read, s, c->c_data + c->c_off, c->c_len - c->c_off); |
n = atomicio(read, s, c->c_data + c->c_off, c->c_len - c->c_off); |
if (n == 0) { |
if (n < 0) { |
error("read (%s): %s", c->c_name, strerror(errno)); |
error("read (%s): %s", c->c_name, strerror(errno)); |
confree(s); |
confree(s); |
return; |
return; |
|
|
extern char *optarg; |
extern char *optarg; |
|
|
TAILQ_INIT(&tq); |
TAILQ_INIT(&tq); |
|
|
/* Ensure that fds 0, 1 and 2 are open or directed to /dev/null */ |
|
sanitise_stdfd(); |
|
|
|
if (argc <= 1) |
if (argc <= 1) |
usage(); |
usage(); |