=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/ssh/ssh-keyscan.c,v retrieving revision 1.30.2.3 retrieving revision 1.31 diff -u -r1.30.2.3 -r1.31 --- src/usr.bin/ssh/ssh-keyscan.c 2002/10/11 14:53:07 1.30.2.3 +++ src/usr.bin/ssh/ssh-keyscan.c 2001/11/16 12:46:13 1.31 @@ -7,7 +7,7 @@ */ #include "includes.h" -RCSID("$OpenBSD: ssh-keyscan.c,v 1.30.2.3 2002/10/11 14:53:07 miod Exp $"); +RCSID("$OpenBSD: ssh-keyscan.c,v 1.31 2001/11/16 12:46:13 markus Exp $"); #include #include @@ -109,8 +109,7 @@ if (!(lb = malloc(sizeof(*lb)))) { if (errfun) - (*errfun) ("linebuf (%s): malloc failed\n", - filename ? filename : "(stdin)"); + (*errfun) ("linebuf (%s): malloc failed\n", lb->filename); return (NULL); } if (filename) { @@ -165,14 +164,13 @@ Linebuf_getline(Linebuf * lb) { int n = 0; - void *p; lb->lineno++; for (;;) { /* Read a line */ if (!fgets(&lb->buf[n], lb->size - n, lb->stream)) { if (ferror(lb->stream) && lb->errfun) - (*lb->errfun)("%s: %s\n", lb->filename, + (*lb->errfun) ("%s: %s\n", lb->filename, strerror(errno)); return (NULL); } @@ -185,20 +183,17 @@ } if (n != lb->size - 1) { if (lb->errfun) - (*lb->errfun)("%s: skipping incomplete last line\n", + (*lb->errfun) ("%s: skipping incomplete last line\n", lb->filename); return (NULL); } /* Double the buffer if we need more space */ - lb->size *= 2; - if ((p = realloc(lb->buf, lb->size)) == NULL) { - lb->size /= 2; + if (!(lb->buf = realloc(lb->buf, (lb->size *= 2)))) { if (lb->errfun) - (*lb->errfun)("linebuf (%s): realloc failed\n", + (*lb->errfun) ("linebuf (%s): realloc failed\n", lb->filename); return (NULL); } - lb->buf = p; } } @@ -219,7 +214,6 @@ fdlim_set(int lim) { struct rlimit rlfd; - if (lim <= 0) return (-1); if (getrlimit(RLIMIT_NOFILE, &rlfd) < 0) @@ -398,8 +392,8 @@ static int conalloc(char *iname, char *oname, int keytype) { - char *namebase, *name, *namelist; int s; + char *namebase, *name, *namelist; namebase = namelist = xstrdup(iname); @@ -463,8 +457,8 @@ static int conrecycle(int s) { - con *c = &fdcon[s]; int ret; + con *c = &fdcon[s]; ret = conalloc(c->c_namelist, c->c_output_name, c->c_keytype); confree(s); @@ -474,10 +468,9 @@ static void congreet(int s) { - int remote_major, remote_minor, n = 0; char buf[256], *cp; - char remote_version[sizeof buf]; size_t bufsiz; + int n = 0; con *c = &fdcon[s]; bufsiz = sizeof(buf); @@ -493,32 +486,26 @@ conrecycle(s); return; } - if (n == 0) { - error("%s: Connection closed by remote host", c->c_name); - conrecycle(s); - return; - } if (*cp != '\n' && *cp != '\r') { error("%s: bad greeting", c->c_name); confree(s); return; } *cp = '\0'; - if (sscanf(buf, "SSH-%d.%d-%[^\n]\n", - &remote_major, &remote_minor, remote_version) == 3) - compat_datafellows(remote_version); - else - datafellows = 0; if (c->c_keytype != KT_RSA1) { + int remote_major, remote_minor; + char remote_version[sizeof buf]; + + if (sscanf(buf, "SSH-%d.%d-%[^\n]\n", + &remote_major, &remote_minor, remote_version) == 3) + compat_datafellows(remote_version); + else + datafellows = 0; if (!ssh2_capable(remote_major, remote_minor)) { debug("%s doesn't support ssh2", c->c_name); confree(s); return; } - } else if (remote_major != 1) { - debug("%s doesn't support ssh1", c->c_name); - confree(s); - return; } fprintf(stderr, "# %s %s\n", c->c_name, chop(buf)); n = snprintf(buf, sizeof buf, "SSH-%d.%d-OpenSSH-keyscan\r\n", @@ -541,8 +528,8 @@ static void conread(int s) { - con *c = &fdcon[s]; int n; + con *c = &fdcon[s]; if (c->c_status == CS_CON) { congreet(s); @@ -581,13 +568,13 @@ static void conloop(void) { - struct timeval seltime, now; fd_set *r, *e; - con *c; + struct timeval seltime, now; int i; + con *c; gettimeofday(&now, NULL); - c = TAILQ_FIRST(&tq); + c = tq.tqh_first; if (c && (c->c_tv.tv_sec > now.tv_sec || (c->c_tv.tv_sec == now.tv_sec && c->c_tv.tv_usec > now.tv_usec))) { @@ -620,12 +607,12 @@ xfree(r); xfree(e); - c = TAILQ_FIRST(&tq); + c = tq.tqh_first; while (c && (c->c_tv.tv_sec < now.tv_sec || (c->c_tv.tv_sec == now.tv_sec && c->c_tv.tv_usec < now.tv_usec))) { int s = c->c_fd; - c = TAILQ_NEXT(c, c_link); + c = c->c_link.tqe_next; conrecycle(s); } } @@ -647,26 +634,26 @@ } } -void -fatal(const char *fmt,...) +static void +fatal_callback(void *arg) { - va_list args; - - va_start(args, fmt); - do_log(SYSLOG_LEVEL_FATAL, fmt, args); - va_end(args); if (nonfatal_fatal) longjmp(kexjmp, -1); - else - fatal_cleanup(); } static void usage(void) { - fprintf(stderr, "usage: %s [-v46] [-p port] [-T timeout] [-f file]\n" - "\t\t [host | addrlist namelist] [...]\n", + fprintf(stderr, "Usage: %s [options] host ...\n", __progname); + fprintf(stderr, "Options:\n"); + fprintf(stderr, " -f file Read hosts or addresses from file.\n"); + fprintf(stderr, " -p port Connect to the specified port.\n"); + fprintf(stderr, " -t keytype Specify the host key type.\n"); + fprintf(stderr, " -T timeout Set connection timeout.\n"); + fprintf(stderr, " -v Verbose; display verbose debugging messages.\n"); + fprintf(stderr, " -4 Use IPv4 only.\n"); + fprintf(stderr, " -6 Use IPv6 only.\n"); exit(1); } @@ -695,11 +682,9 @@ } break; case 'T': - timeout = convtime(optarg); - if (timeout == -1 || timeout == 0) { - fprintf(stderr, "Bad timeout '%s'\n", optarg); + timeout = atoi(optarg); + if (timeout <= 0) usage(); - } break; case 'v': if (!debug_flag) { @@ -732,7 +717,7 @@ get_keytypes |= KT_RSA; break; case KEY_UNSPEC: - fatal("unknown key type %s", tname); + fatal("unknown key type %s\n", tname); } tname = strtok(NULL, ","); } @@ -752,6 +737,7 @@ usage(); log_init("ssh-keyscan", log_level, SYSLOG_FACILITY_USER, 1); + fatal_add_cleanup(fatal_callback, NULL); maxfd = fdlim_get(1); if (maxfd < 0)