version 1.17, 2001/02/21 07:37:04 |
version 1.18, 2001/03/03 06:53:12 |
|
|
#include "buffer.h" |
#include "buffer.h" |
#include "bufaux.h" |
#include "bufaux.h" |
#include "log.h" |
#include "log.h" |
|
#include "atomicio.h" |
|
|
static int argno = 1; /* Number of argument currently being parsed */ |
static int argno = 1; /* Number of argument currently being parsed */ |
|
|
|
|
int timeout = 5; |
int timeout = 5; |
|
|
int maxfd; |
int maxfd; |
#define maxcon (maxfd - 10) |
#define MAXCON (maxfd - 10) |
|
|
extern char *__progname; |
extern char *__progname; |
fd_set read_wait; |
fd_set read_wait; |
|
|
void |
void |
confree(int s) |
confree(int s) |
{ |
{ |
close(s); |
|
if (s >= maxfd || fdcon[s].c_status == CS_UNUSED) |
if (s >= maxfd || fdcon[s].c_status == CS_UNUSED) |
fatal("confree: attempt to free bad fdno %d", s); |
fatal("confree: attempt to free bad fdno %d", s); |
|
close(s); |
xfree(fdcon[s].c_namebase); |
xfree(fdcon[s].c_namebase); |
xfree(fdcon[s].c_output_name); |
xfree(fdcon[s].c_output_name); |
if (fdcon[s].c_status == CS_KEYS) |
if (fdcon[s].c_status == CS_KEYS) |
|
|
buf[n - 1] = '\0'; |
buf[n - 1] = '\0'; |
fprintf(stderr, "# %s %s\n", c->c_name, buf); |
fprintf(stderr, "# %s %s\n", c->c_name, buf); |
n = snprintf(buf, sizeof buf, "SSH-1.5-OpenSSH-keyscan\r\n"); |
n = snprintf(buf, sizeof buf, "SSH-1.5-OpenSSH-keyscan\r\n"); |
if (write(s, buf, n) != n) { |
if (atomicio(write, 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; |
|
|
gettimeofday(&now, NULL); |
gettimeofday(&now, NULL); |
c = tq.tqh_first; |
c = tq.tqh_first; |
|
|
if (c && |
if (c && (c->c_tv.tv_sec > now.tv_sec || |
(c->c_tv.tv_sec > now.tv_sec || |
(c->c_tv.tv_sec == now.tv_sec && c->c_tv.tv_usec > now.tv_usec))) { |
(c->c_tv.tv_sec == now.tv_sec && c->c_tv.tv_usec > now.tv_usec))) { |
|
seltime = c->c_tv; |
seltime = c->c_tv; |
seltime.tv_sec -= now.tv_sec; |
seltime.tv_sec -= now.tv_sec; |
seltime.tv_usec -= now.tv_usec; |
seltime.tv_usec -= now.tv_usec; |
|
|
(errno == EAGAIN || errno == EINTR)) |
(errno == EAGAIN || errno == EINTR)) |
; |
; |
|
|
for (i = 0; i < maxfd; i++) |
for (i = 0; i < maxfd; i++) { |
if (FD_ISSET(i, &e)) { |
if (FD_ISSET(i, &e)) { |
error("%s: exception!", fdcon[i].c_name); |
error("%s: exception!", fdcon[i].c_name); |
confree(i); |
confree(i); |
} else if (FD_ISSET(i, &r)) |
} else if (FD_ISSET(i, &r)) |
conread(i); |
conread(i); |
|
} |
|
|
c = tq.tqh_first; |
c = tq.tqh_first; |
while (c && |
while (c && (c->c_tv.tv_sec < now.tv_sec || |
(c->c_tv.tv_sec < now.tv_sec || |
(c->c_tv.tv_sec == now.tv_sec && c->c_tv.tv_usec < now.tv_usec))) { |
(c->c_tv.tv_sec == now.tv_sec && c->c_tv.tv_usec < now.tv_usec))) { |
|
int s = c->c_fd; |
int s = c->c_fd; |
|
|
c = c->c_link.tqe_next; |
c = c->c_link.tqe_next; |
conrecycle(s); |
conrecycle(s); |
} |
} |
|
|
return (argv[argno++]); |
return (argv[argno++]); |
} else if (!strncmp(argv[argno], "-f", 2)) { |
} else if (!strncmp(argv[argno], "-f", 2)) { |
char *fname; |
char *fname; |
|
|
if (argv[argno][2]) |
if (argv[argno][2]) |
fname = &argv[argno++][2]; |
fname = &argv[argno++][2]; |
else if (++argno >= argc) { |
else if (++argno >= argc) { |
|
|
fname = NULL; |
fname = NULL; |
lb = Linebuf_alloc(fname, error); |
lb = Linebuf_alloc(fname, error); |
} else |
} else |
error("ignoring invalid/misplaced option `%s'", argv[argno++]); |
error("ignoring invalid/misplaced option `%s'", |
|
argv[argno++]); |
} else { |
} else { |
char *line; |
char *line; |
|
|
line = Linebuf_getline(lb); |
line = Linebuf_getline(lb); |
if (line) |
if (line) |
return (line); |
return (line); |
|
|
fatal("%s: fdlim_get: bad value", __progname); |
fatal("%s: fdlim_get: bad value", __progname); |
if (maxfd > MAXMAXFD) |
if (maxfd > MAXMAXFD) |
maxfd = MAXMAXFD; |
maxfd = MAXMAXFD; |
if (maxcon <= 0) |
if (MAXCON <= 0) |
fatal("%s: not enough file descriptors", __progname); |
fatal("%s: not enough file descriptors", __progname); |
if (maxfd > fdlim_get(0)) |
if (maxfd > fdlim_get(0)) |
fdlim_set(maxfd); |
fdlim_set(maxfd); |
|
|
memset(fdcon, 0, maxfd * sizeof(con)); |
memset(fdcon, 0, maxfd * sizeof(con)); |
|
|
do { |
do { |
while (ncon < maxcon) { |
while (ncon < MAXCON) { |
char *name; |
char *name; |
|
|
host = nexthost(argc, argv); |
host = nexthost(argc, argv); |