This commit was generated by cvs2svn to compensate for changes in r146309,

which included commits to RCS files with non-trunk default branches.
This commit is contained in:
Mike Heffner 2005-05-17 03:11:29 +00:00
commit d64cfd6cad
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=146310
11 changed files with 281 additions and 181 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: cmds.c,v 1.111 2005/02/11 06:21:22 simonb Exp $ */
/* $NetBSD: cmds.c,v 1.112 2005/04/11 01:49:31 lukem Exp $ */
/*-
* Copyright (c) 1996-2005 The NetBSD Foundation, Inc.
@ -72,7 +72,7 @@
/*
* Copyright (C) 1997 and 1998 WIDE Project.
* All rights reserved.
*
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@ -84,7 +84,7 @@
* 3. Neither the name of the project nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
*
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@ -103,7 +103,7 @@
#if 0
static char sccsid[] = "@(#)cmds.c 8.6 (Berkeley) 10/9/94";
#else
__RCSID("$NetBSD: cmds.c,v 1.111 2005/02/11 06:21:22 simonb Exp $");
__RCSID("$NetBSD: cmds.c,v 1.112 2005/04/11 01:49:31 lukem Exp $");
#endif
#endif /* not lint */
@ -571,10 +571,10 @@ get(int argc, char *argv[])
int
getit(int argc, char *argv[], int restartit, const char *mode)
{
int loc, rval;
int loc, rval;
char *remfile, *olocfile;
const char *locfile;
char buf[MAXPATHLEN];
char buf[MAXPATHLEN];
loc = rval = 0;
if (argc == 2) {
@ -1690,7 +1690,7 @@ do_chmod(int argc, char *argv[])
(void)command("SITE CHMOD %s %s", argv[1], argv[2]);
}
#define COMMAND_1ARG(argc, argv, cmd) \
#define COMMAND_1ARG(argc, argv, cmd) \
if (argc == 1) \
command(cmd); \
else \

View File

@ -1,4 +1,4 @@
/* $NetBSD: cmdtab.c,v 1.43 2004/07/15 08:50:10 lukem Exp $ */
/* $NetBSD: cmdtab.c,v 1.44 2005/04/11 01:49:31 lukem Exp $ */
/*-
* Copyright (c) 1996-2000 The NetBSD Foundation, Inc.
@ -70,7 +70,7 @@
#if 0
static char sccsid[] = "@(#)cmdtab.c 8.4 (Berkeley) 10/9/94";
#else
__RCSID("$NetBSD: cmdtab.c,v 1.43 2004/07/15 08:50:10 lukem Exp $");
__RCSID("$NetBSD: cmdtab.c,v 1.44 2005/04/11 01:49:31 lukem Exp $");
#endif
#endif /* not lint */
@ -188,7 +188,7 @@ HSTR empty[] = "";
#define CMPL0
#else /* !NO_EDITCOMPLETE */
#define CMPL(x) #x,
#define CMPL0 empty,
#define CMPL0 empty,
#endif /* !NO_EDITCOMPLETE */
struct cmd cmdtab[] = {

View File

@ -1,4 +1,4 @@
/* $NetBSD: extern.h,v 1.64 2005/02/09 23:17:27 christos Exp $ */
/* $NetBSD: extern.h,v 1.67 2005/05/14 15:26:43 lukem Exp $ */
/*-
* Copyright (c) 1996-2005 The NetBSD Foundation, Inc.
@ -70,7 +70,7 @@
/*
* Copyright (C) 1997 and 1998 WIDE Project.
* All rights reserved.
*
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@ -82,7 +82,7 @@
* 3. Neither the name of the project nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
*
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@ -248,8 +248,9 @@ void updatelocalcwd(void);
void updateremotecwd(void);
void usage(void);
void user(int, char **);
int xconnect(int, const struct sockaddr *, int);
int xconnect(int, const struct sockaddr *, socklen_t);
int xlisten(int, int);
int xpoll(struct pollfd *, int, int);
void *xmalloc(size_t);
StringList *xsl_init(void);
void xsl_add(StringList *, char *);

View File

@ -1,4 +1,4 @@
/* $NetBSD: fetch.c,v 1.155 2005/01/12 22:37:41 lukem Exp $ */
/* $NetBSD: fetch.c,v 1.158 2005/05/14 15:26:43 lukem Exp $ */
/*-
* Copyright (c) 1997-2004 The NetBSD Foundation, Inc.
@ -41,7 +41,7 @@
#include <sys/cdefs.h>
#ifndef lint
__RCSID("$NetBSD: fetch.c,v 1.155 2005/01/12 22:37:41 lukem Exp $");
__RCSID("$NetBSD: fetch.c,v 1.158 2005/05/14 15:26:43 lukem Exp $");
#endif /* not lint */
/*
@ -219,7 +219,8 @@ auth_url(const char *challenge, char **response, const char *guser,
(void)strlcpy(*response, scheme, rlen);
len = strlcat(*response, " ", rlen);
/* use `clen - 1' to not encode the trailing NUL */
base64_encode(clear, clen - 1, (unsigned char *)*response + len);
base64_encode((unsigned char *)clear, clen - 1,
(unsigned char *)*response + len);
memset(clear, 0, clen);
rval = 0;
@ -733,7 +734,6 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
/* success */
break;
}
freeaddrinfo(res0);
if (s < 0) {
warn("Can't connect to %s", host);
@ -975,7 +975,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
|| match_token(&cp, "WWW-Authenticate:")) {
if (! (token = match_token(&cp, "Basic"))) {
if (debug)
fprintf(ttyout,
fprintf(ttyout,
"skipping unknown auth scheme `%s'\n",
token);
continue;
@ -1276,6 +1276,8 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
close(s);
if (closefunc != NULL && fout != NULL)
(*closefunc)(fout);
if (res0)
freeaddrinfo(res0);
FREEPTR(savefile);
FREEPTR(user);
FREEPTR(pass);
@ -1416,7 +1418,7 @@ fetch_ftp(const char *url)
} else
dir = NULL;
if (urltype == FTP_URL_T && file != NULL) {
url_decode(file);
url_decode(file);
/* but still don't url_decode(dir) */
}
if (debug)
@ -1797,7 +1799,7 @@ auto_put(int argc, char **argv, const char *uploadserver)
pathsep++;
uargv[2] = xstrdup(pathsep);
pathsep[0] = '/';
} else
} else
uargv[2] = xstrdup(pathsep + 1);
pathsep[1] = '\0';
uargc++;
@ -1806,8 +1808,8 @@ auto_put(int argc, char **argv, const char *uploadserver)
if (debug)
fprintf(ttyout, "auto_put: URL `%s' argv[2] `%s'\n",
path, uargv[2] ? uargv[2] : "<null>");
/* connect and cwd */
/* connect and cwd */
rval = auto_fetch(1, &path);
free(path);
if(rval >= 0)
@ -1821,7 +1823,7 @@ auto_put(int argc, char **argv, const char *uploadserver)
}
for(; argv[0] != NULL; argv++) {
uargv[1] = argv[0];
uargv[1] = argv[0];
mput(uargc, uargv);
}
rval = 0;

View File

@ -1,4 +1,4 @@
.\" $NetBSD: ftp.1,v 1.108 2005/01/15 21:28:16 lukem Exp $
.\" $NetBSD: ftp.1,v 1.109 2005/02/20 20:54:01 wiz Exp $
.\"
.\" Copyright (c) 1996-2004 The NetBSD Foundation, Inc.
.\" All rights reserved.
@ -952,7 +952,7 @@ traffic.
servers are required to support the
.Dv PASV
command by
.Cm RFC 1123 ,
.Li RFC 1123 ,
some do not.)
.It Ic pdir Op Ar remote-path
Perform
@ -1565,7 +1565,7 @@ ascii or binary (respectively).
The default transfer type is binary.
.Pp
In order to be compliant with
.Cm RFC 1738 ,
.Li RFC 1738 ,
.Nm
interprets the
.Ar path
@ -1618,7 +1618,7 @@ Any
.Sq Li \&% Ns Ar XX
codes
(per
.Cm RFC 1738 )
.Li RFC 1738 )
within the path components are decoded, with
.Ar XX
representing a character code in hexadecimal.
@ -2248,7 +2248,7 @@ URL characters are required in the username or password
or
.Sq / ) ,
encode them with
.Cm RFC 1738
.Li RFC 1738
.Sq Li \&% Ns Ar XX
encoding.
.Pp
@ -2292,13 +2292,13 @@ for an example of how to make this automatic.
.Sh STANDARDS
.Nm
attempts to be compliant with
.Cm RFC 959 ,
.Cm RFC 1123 ,
.Cm RFC 1738 ,
.Cm RFC 2068 ,
.Cm RFC 2389 ,
.Cm RFC 2428 ,
.Cm RFC 2732 ,
.Li RFC 959 ,
.Li RFC 1123 ,
.Li RFC 1738 ,
.Li RFC 2068 ,
.Li RFC 2389 ,
.Li RFC 2428 ,
.Li RFC 2732 ,
and
.Cm draft-ietf-ftpext-mlst-11 .
.Sh HISTORY

View File

@ -1,7 +1,7 @@
/* $NetBSD: ftp.c,v 1.126 2004/07/20 10:40:22 lukem Exp $ */
/* $NetBSD: ftp.c,v 1.132 2005/05/14 15:26:43 lukem Exp $ */
/*-
* Copyright (c) 1996-2004 The NetBSD Foundation, Inc.
* Copyright (c) 1996-2005 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@ -68,7 +68,7 @@
/*
* Copyright (C) 1997 and 1998 WIDE Project.
* All rights reserved.
*
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@ -80,7 +80,7 @@
* 3. Neither the name of the project nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
*
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@ -99,7 +99,7 @@
#if 0
static char sccsid[] = "@(#)ftp.c 8.6 (Berkeley) 10/27/94";
#else
__RCSID("$NetBSD: ftp.c,v 1.126 2004/07/20 10:40:22 lukem Exp $");
__RCSID("$NetBSD: ftp.c,v 1.132 2005/05/14 15:26:43 lukem Exp $");
#endif
#endif /* not lint */
@ -118,6 +118,7 @@ __RCSID("$NetBSD: ftp.c,v 1.126 2004/07/20 10:40:22 lukem Exp $");
#include <ctype.h>
#include <err.h>
#include <errno.h>
#include <fcntl.h>
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
@ -125,9 +126,6 @@ __RCSID("$NetBSD: ftp.c,v 1.126 2004/07/20 10:40:22 lukem Exp $");
#include <time.h>
#include <unistd.h>
#include <stdarg.h>
#ifndef USE_SELECT
#include <poll.h>
#endif
#include "ftp_var.h"
@ -166,11 +164,13 @@ struct sockinet myctladdr, hisctladdr, data_addr;
char *
hookup(char *host, char *port)
{
int s = -1, len, error, portnum;
int s = -1, error, portnum;
struct addrinfo hints, *res, *res0;
char hbuf[MAXHOSTNAMELEN];
static char hostnamebuf[MAXHOSTNAMELEN];
char *cause = "unknown";
socklen_t len;
int on = 1;
memset((char *)&hisctladdr, 0, sizeof (hisctladdr));
memset((char *)&myctladdr, 0, sizeof (myctladdr));
@ -193,7 +193,7 @@ hookup(char *host, char *port)
else
(void)strlcpy(hostnamebuf, host, sizeof(hostnamebuf));
hostname = hostnamebuf;
for (res = res0; res; res = res->ai_next) {
/*
* make sure that ai_addr is NOT an IPv4 mapped address.
@ -262,7 +262,7 @@ hookup(char *host, char *port)
res0 = res = NULL;
len = hisctladdr.su_len;
if (getsockname(s, (struct sockaddr *)&myctladdr.si_su, &len) < 0) {
if (getsockname(s, (struct sockaddr *)&myctladdr.si_su, &len) == -1) {
warn("getsockname");
code = -1;
goto bad;
@ -272,10 +272,12 @@ hookup(char *host, char *port)
#ifdef IPTOS_LOWDELAY
if (hisctladdr.su_family == AF_INET) {
int tos = IPTOS_LOWDELAY;
if (setsockopt(s, IPPROTO_IP, IP_TOS, (char *)&tos,
sizeof(int)) < 0)
if (setsockopt(s, IPPROTO_IP, IP_TOS,
(void *)&tos, sizeof(tos)) == -1) {
if (debug)
warn("setsockopt TOS (ignored)");
warn("setsockopt %s (ignored)",
"IPTOS_LOWDELAY");
}
}
#endif
cin = fdopen(s, "r");
@ -299,13 +301,11 @@ hookup(char *host, char *port)
code = -1;
goto bad;
}
{
int on = 1;
if (setsockopt(s, SOL_SOCKET, SO_OOBINLINE, (char *)&on, sizeof(on))
< 0 && debug) {
warn("setsockopt");
}
if (setsockopt(s, SOL_SOCKET, SO_OOBINLINE,
(void *)&on, sizeof(on)) == -1) {
if (debug)
warn("setsockopt %s (ignored)", "SO_OOBINLINE");
}
return (hostname);
@ -539,39 +539,10 @@ getreply(int expecteof)
static int
empty(FILE *cin, FILE *din, int sec)
{
int nr;
int nfd = 0;
#ifdef USE_SELECT
struct timeval t;
fd_set rmask;
FD_ZERO(&rmask);
if (cin) {
if (nfd < fileno(cin))
nfd = fileno(cin);
FD_SET(fileno(cin), &rmask);
}
if (din) {
if (nfd < fileno(din))
nfd = fileno(din);
FD_SET(fileno(din), &rmask);
}
t.tv_sec = (long) sec;
t.tv_usec = 0;
if ((nr = select(nfd, &rmask, NULL, NULL, &t)) <= 0)
return nr;
nr = 0;
if (cin)
nr |= FD_ISSET(fileno(cin), &rmask) ? 1 : 0;
if (din)
nr |= FD_ISSET(fileno(din), &rmask) ? 2 : 0;
#else
struct pollfd pfd[2];
int nr, nfd;
struct pollfd pfd[2];
nfd = 0;
if (cin) {
pfd[nfd].fd = fileno(cin);
pfd[nfd++].events = POLLIN;
@ -582,7 +553,7 @@ empty(FILE *cin, FILE *din, int sec)
pfd[nfd++].events = POLLIN;
}
if ((nr = poll(pfd, nfd, sec * 1000)) <= 0)
if ((nr = xpoll(pfd, nfd, sec * 1000)) <= 0)
return nr;
nr = 0;
@ -591,7 +562,6 @@ empty(FILE *cin, FILE *din, int sec)
nr |= (pfd[nfd++].revents & POLLIN) ? 1 : 0;
if (din)
nr |= (pfd[nfd++].revents & POLLIN) ? 2 : 0;
#endif
return nr;
}
@ -601,7 +571,7 @@ void
abortxfer(int notused)
{
char msgbuf[100];
int len;
size_t len;
sigint_raised = 1;
alarmtimer(0);
@ -1301,11 +1271,12 @@ int
initconn(void)
{
char *p, *a;
int result, len, tmpno = 0;
int result, tmpno = 0;
int on = 1;
int error;
u_int addr[16], port[2];
u_int af, hal, pal;
socklen_t len;
char *pasvcmd = NULL;
#ifdef INET6
@ -1324,15 +1295,16 @@ initconn(void)
return (1);
}
if ((options & SO_DEBUG) &&
setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on,
sizeof(on)) < 0)
setsockopt(data, SOL_SOCKET, SO_DEBUG,
(void *)&on, sizeof(on)) == -1) {
if (debug)
warn("setsockopt (ignored)");
warn("setsockopt %s (ignored)", "SO_DEBUG");
}
result = COMPLETE + 1;
switch (data_addr.su_family) {
case AF_INET:
if (epsv4 && !epsv4bad) {
pasvcmd = "EPSV";
pasvcmd = "EPSV";
result = command("EPSV");
if (!connected)
return (1);
@ -1355,7 +1327,7 @@ initconn(void)
}
}
if (result != COMPLETE) {
pasvcmd = "PASV";
pasvcmd = "PASV";
result = command("PASV");
if (!connected)
return (1);
@ -1363,7 +1335,7 @@ initconn(void)
break;
#ifdef INET6
case AF_INET6:
pasvcmd = "EPSV";
pasvcmd = "EPSV";
result = command("EPSV");
if (!connected)
return (1);
@ -1555,16 +1527,18 @@ initconn(void)
#endif
goto reinit;
}
warn("connect");
warn("connect for data channel");
goto bad;
}
#ifdef IPTOS_THROUGHPUT
if (data_addr.su_family == AF_INET) {
on = IPTOS_THROUGHPUT;
if (setsockopt(data, IPPROTO_IP, IP_TOS, (char *)&on,
sizeof(int)) < 0)
if (setsockopt(data, IPPROTO_IP, IP_TOS,
(void *)&on, sizeof(on)) == -1) {
if (debug)
warn("setsockopt TOS (ignored)");
warn("setsockopt %s (ignored)",
"IPTOS_THROUGHPUT");
}
}
#endif
return (0);
@ -1584,9 +1558,9 @@ initconn(void)
return (1);
}
if (!sendport)
if (setsockopt(data, SOL_SOCKET, SO_REUSEADDR, (char *)&on,
sizeof(on)) < 0) {
warn("setsockopt (reuse address)");
if (setsockopt(data, SOL_SOCKET, SO_REUSEADDR,
(void *)&on, sizeof(on)) == -1) {
warn("setsockopt %s", "SO_REUSEADDR");
goto bad;
}
if (bind(data, (struct sockaddr *)&data_addr.si_su,
@ -1594,14 +1568,15 @@ initconn(void)
warn("bind");
goto bad;
}
if (options & SO_DEBUG &&
setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on,
sizeof(on)) < 0)
if ((options & SO_DEBUG) &&
setsockopt(data, SOL_SOCKET, SO_DEBUG,
(void *)&on, sizeof(on)) == -1) {
if (debug)
warn("setsockopt (ignored)");
warn("setsockopt %s (ignored)", "SO_DEBUG");
}
len = sizeof(data_addr.si_su);
memset((char *)&data_addr, 0, sizeof (data_addr));
if (getsockname(data, (struct sockaddr *)&data_addr.si_su, &len) < 0) {
if (getsockname(data, (struct sockaddr *)&data_addr.si_su, &len) == -1) {
warn("getsockname");
goto bad;
}
@ -1683,7 +1658,7 @@ initconn(void)
if (!connected)
return (1);
skip_port:
if (result == ERROR && sendport == -1) {
sendport = 0;
tmpno = 1;
@ -1696,15 +1671,17 @@ initconn(void)
#ifdef IPTOS_THROUGHPUT
if (data_addr.su_family == AF_INET) {
on = IPTOS_THROUGHPUT;
if (setsockopt(data, IPPROTO_IP, IP_TOS, (char *)&on,
sizeof(int)) < 0)
if (setsockopt(data, IPPROTO_IP, IP_TOS,
(void *)&on, sizeof(on)) == -1)
if (debug)
warn("setsockopt TOS (ignored)");
warn("setsockopt %s (ignored)",
"IPTOS_THROUGHPUT");
}
#endif
return (0);
bad:
(void)close(data), data = -1;
(void)close(data);
data = -1;
if (tmpno)
sendport = 1;
return (1);
@ -1713,31 +1690,79 @@ initconn(void)
FILE *
dataconn(const char *lmode)
{
struct sockinet from;
int s, fromlen = myctladdr.su_len;
struct sockinet from;
int s, flags, rv, timeout;
struct timeval endtime, now, td;
struct pollfd pfd[1];
socklen_t fromlen;
if (passivemode)
if (passivemode) /* passive data connection */
return (fdopen(data, lmode));
s = accept(data, (struct sockaddr *) &from.si_su, &fromlen);
if (s < 0) {
warn("accept");
(void)close(data), data = -1;
return (NULL);
/* active mode data connection */
if ((flags = fcntl(data, F_GETFL, 0)) == -1)
goto dataconn_failed; /* get current socket flags */
if (fcntl(data, F_SETFL, flags | O_NONBLOCK) == -1)
goto dataconn_failed; /* set non-blocking connect */
/* NOTE: we now must restore socket flags on successful exit */
/* limit time waiting on listening socket */
pfd[0].fd = data;
pfd[0].events = POLLIN;
(void)gettimeofday(&endtime, NULL); /* determine end time */
endtime.tv_sec += (quit_time > 0) ? quit_time: 60;
/* without -q, default to 60s */
do {
(void)gettimeofday(&now, NULL);
timersub(&endtime, &now, &td);
timeout = td.tv_sec * 1000 + td.tv_usec/1000;
if (timeout < 0)
timeout = 0;
rv = xpoll(pfd, 1, timeout);
} while (rv == -1 && errno == EINTR); /* loop until poll ! EINTR */
if (rv == -1) {
warn("poll waiting before accept");
goto dataconn_failed;
}
if (rv == 0) {
warn("poll timeout waiting before accept");
goto dataconn_failed;
}
/* (non-blocking) accept the connection */
fromlen = myctladdr.su_len;
do {
s = accept(data, (struct sockaddr *) &from.si_su, &fromlen);
} while (s == -1 && errno == EINTR); /* loop until accept ! EINTR */
if (s == -1) {
warn("accept");
goto dataconn_failed;
}
(void)close(data);
data = s;
if (fcntl(data, F_SETFL, flags) == -1) /* restore socket flags */
goto dataconn_failed;
#ifdef IPTOS_THROUGHPUT
if (from.su_family == AF_INET) {
int tos = IPTOS_THROUGHPUT;
if (setsockopt(s, IPPROTO_IP, IP_TOS, (char *)&tos,
sizeof(int)) < 0) {
if (setsockopt(s, IPPROTO_IP, IP_TOS,
(void *)&tos, sizeof(tos)) == -1) {
if (debug)
warn("setsockopt TOS (ignored)");
warn("setsockopt %s (ignored)",
"IPTOS_THROUGHPUT");
}
}
#endif
return (fdopen(data, lmode));
dataconn_failed:
(void)close(data);
data = -1;
return (NULL);
}
void
@ -2022,7 +2047,7 @@ gunique(const char *local)
}
len = strlcpy(new, local, sizeof(new));
cp = &new[len];
*cp++ = '.';
*cp++ = '.';
while (!d) {
if (++count == 100) {
fputs("runique: can't find unique file name.\n",
@ -2059,7 +2084,7 @@ void
abort_squared(int dummy)
{
char msgbuf[100];
int len;
size_t len;
sigint_raised = 1;
alarmtimer(0);
@ -2118,7 +2143,7 @@ ai_unmapped(struct addrinfo *ai)
#ifdef INET6
struct sockaddr_in6 *sin6;
struct sockaddr_in sin;
int len;
socklen_t len;
if (ai->ai_family != AF_INET6)
return;

View File

@ -1,4 +1,4 @@
/* $NetBSD: ftp_var.h,v 1.69 2005/01/03 09:50:09 lukem Exp $ */
/* $NetBSD: ftp_var.h,v 1.71 2005/04/11 01:49:31 lukem Exp $ */
/*-
* Copyright (c) 1996-2005 The NetBSD Foundation, Inc.
@ -70,7 +70,7 @@
/*
* Copyright (C) 1997 and 1998 WIDE Project.
* All rights reserved.
*
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@ -82,7 +82,7 @@
* 3. Neither the name of the project nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
*
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@ -112,6 +112,8 @@
#include <netinet/in.h>
#include <arpa/inet.h>
#include <poll.h>
#include <setjmp.h>
#include <stringlist.h>
@ -128,9 +130,9 @@
struct cmd {
char *c_name; /* name of command */
const char *c_help; /* help string */
char c_bell; /* give bell when command completes */
char c_conn; /* must be connected to use command */
char c_proxy; /* proxy server may execute */
char c_bell; /* give bell when command completes */
char c_conn; /* must be connected to use command */
char c_proxy; /* proxy server may execute */
#ifndef NO_EDITCOMPLETE
const char *c_complete; /* context sensitive completion list */
#endif /* !NO_EDITCOMPLETE */

View File

@ -1,4 +1,4 @@
/* $NetBSD: main.c,v 1.90 2004/07/21 00:09:14 lukem Exp $ */
/* $NetBSD: main.c,v 1.94 2005/05/13 05:03:49 lukem Exp $ */
/*-
* Copyright (c) 1996-2004 The NetBSD Foundation, Inc.
@ -68,7 +68,7 @@
/*
* Copyright (C) 1997 and 1998 WIDE Project.
* All rights reserved.
*
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
@ -80,7 +80,7 @@
* 3. Neither the name of the project nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
*
* THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
@ -104,7 +104,7 @@ __COPYRIGHT("@(#) Copyright (c) 1985, 1989, 1993, 1994\n\
#if 0
static char sccsid[] = "@(#)main.c 8.6 (Berkeley) 10/9/94";
#else
__RCSID("$NetBSD: main.c,v 1.90 2004/07/21 00:09:14 lukem Exp $");
__RCSID("$NetBSD: main.c,v 1.94 2005/05/13 05:03:49 lukem Exp $");
#endif
#endif /* not lint */
@ -144,6 +144,7 @@ main(int argc, char *argv[])
struct passwd *pw;
char *cp, *ep, *anonuser, *anonpass, *upload_path;
int dumbterm, s, len, isupload;
socklen_t slen;
setlocale(LC_ALL, "");
setprogname(argv[0]);
@ -206,13 +207,13 @@ main(int argc, char *argv[])
s = socket(AF_INET, SOCK_STREAM, 0);
if (s == -1)
err(1, "can't create socket");
len = sizeof(rcvbuf_size);
if (getsockopt(s, SOL_SOCKET, SO_RCVBUF, (void *) &rcvbuf_size, &len)
< 0)
slen = sizeof(rcvbuf_size);
if (getsockopt(s, SOL_SOCKET, SO_RCVBUF,
(void *)&rcvbuf_size, &slen) == -1)
err(1, "unable to get default rcvbuf size");
len = sizeof(sndbuf_size);
if (getsockopt(s, SOL_SOCKET, SO_SNDBUF, (void *) &sndbuf_size, &len)
< 0)
slen = sizeof(sndbuf_size);
if (getsockopt(s, SOL_SOCKET, SO_SNDBUF,
(void *)&sndbuf_size, &slen) == -1)
err(1, "unable to get default sndbuf size");
(void)close(s);
/* sanity check returned buffer sizes */
@ -457,7 +458,7 @@ main(int argc, char *argv[])
}
if (netrc[0] == '\0' && localhome != NULL) {
if (strlcpy(netrc, localhome, sizeof(netrc)) >= sizeof(netrc) ||
strlcat(netrc, "/.netrc", sizeof(netrc)) >= sizeof(netrc)) {
strlcat(netrc, "/.netrc", sizeof(netrc)) >= sizeof(netrc)) {
warnx("%s/.netrc: %s", localhome,
strerror(ENAMETOOLONG));
netrc[0] = '\0';
@ -655,7 +656,8 @@ cmdscanner(void)
break;
line[num] = '\0';
} else if (num == sizeof(line) - 2) {
fputs("sorry, input line too long.\n", ttyout);
fputs("Sorry, input line is too long.\n",
ttyout);
while ((num = getchar()) != '\n' && num != EOF)
/* void */;
break;
@ -666,20 +668,23 @@ cmdscanner(void)
HistEvent ev;
cursor_pos = NULL;
if ((buf = el_gets(el, &num)) == NULL || num == 0) {
buf = el_gets(el, &num);
if (buf == NULL || num == 0) {
if (fromatty)
putc('\n', ttyout);
quit(0, NULL);
}
if (buf[--num] == '\n') {
if (num == 0)
break;
} else if (num >= sizeof(line)) {
fputs("sorry, input line too long.\n", ttyout);
if (num >= sizeof(line)) {
fputs("Sorry, input line is too long.\n",
ttyout);
break;
}
memcpy(line, buf, num);
line[num] = '\0';
if (line[--num] == '\n') {
line[num] = '\0';
if (num == 0)
break;
}
history(hist, &ev, H_ENTER, buf);
}
#endif /* !NO_EDITCOMPLETE */

View File

@ -1,4 +1,4 @@
/* $NetBSD: progressbar.c,v 1.6 2005/02/10 16:00:28 jmc Exp $ */
/* $NetBSD: progressbar.c,v 1.7 2005/04/11 01:49:31 lukem Exp $ */
/*-
* Copyright (c) 1997-2003 The NetBSD Foundation, Inc.
@ -38,7 +38,7 @@
#include <sys/cdefs.h>
#ifndef lint
__RCSID("$NetBSD: progressbar.c,v 1.6 2005/02/10 16:00:28 jmc Exp $");
__RCSID("$NetBSD: progressbar.c,v 1.7 2005/04/11 01:49:31 lukem Exp $");
#endif /* not lint */
/*
@ -214,11 +214,11 @@ progressmeter(int flag)
/*
* calculate the length of the `*' bar, ensuring that
* the number of stars won't exceed the buffer size
* the number of stars won't exceed the buffer size
*/
barlength = MIN(sizeof(buf) - 1, ttywidth) - BAROVERHEAD;
if (prefix)
barlength -= strlen(prefix);
barlength -= strlen(prefix);
if (barlength > 0) {
i = barlength * ratio / 100;
len += snprintf(buf + len, BUFLEFT,

View File

@ -1,4 +1,4 @@
/* $NetBSD: util.c,v 1.117 2005/01/03 09:50:09 lukem Exp $ */
/* $NetBSD: util.c,v 1.123 2005/05/14 18:56:45 dsl Exp $ */
/*-
* Copyright (c) 1997-2005 The NetBSD Foundation, Inc.
@ -71,7 +71,7 @@
#include <sys/cdefs.h>
#ifndef lint
__RCSID("$NetBSD: util.c,v 1.117 2005/01/03 09:50:09 lukem Exp $");
__RCSID("$NetBSD: util.c,v 1.123 2005/05/14 18:56:45 dsl Exp $");
#endif /* not lint */
/*
@ -749,7 +749,7 @@ remotemodtime(const char *file, int noisy)
timebuf.tm_hour = hour;
timebuf.tm_mday = day;
timebuf.tm_mon = mo - 1;
timebuf.tm_year = yy - TM_YEAR_BASE;
timebuf.tm_year = yy - TM_YEAR_BASE;
timebuf.tm_isdst = -1;
rtime = timegm(&timebuf);
if (rtime == -1) {
@ -1029,12 +1029,12 @@ void
setupsockbufsize(int sock)
{
if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF, (void *) &sndbuf_size,
sizeof(rcvbuf_size)) < 0)
if (setsockopt(sock, SOL_SOCKET, SO_SNDBUF,
(void *)&sndbuf_size, sizeof(sndbuf_size)) == -1)
warn("unable to set sndbuf size %d", sndbuf_size);
if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (void *) &rcvbuf_size,
sizeof(rcvbuf_size)) < 0)
if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF,
(void *)&rcvbuf_size, sizeof(rcvbuf_size)) == -1)
warn("unable to set rcvbuf size %d", rcvbuf_size);
}
@ -1244,28 +1244,83 @@ isipv6addr(const char *addr)
/*
* Internal version of connect(2); sets socket buffer sizes first and
* handles the syscall being interrupted.
* supports a connection timeout using a non-blocking connect(2) with
* a poll(2).
* Socket fcntl flags are temporarily updated to include O_NONBLOCK;
* these will not be reverted on connection failure.
* Returns -1 upon failure (with errno set to the problem), or 0 on success.
*/
int
xconnect(int sock, const struct sockaddr *name, int namelen)
xconnect(int sock, const struct sockaddr *name, socklen_t namelen)
{
int rv;
int flags, rv, timeout, error;
socklen_t slen;
struct timeval endtime, now, td;
struct pollfd pfd[1];
setupsockbufsize(sock);
rv = connect(sock, name, namelen);
if (rv == -1 && errno == EINTR) {
fd_set connfd;
FD_ZERO(&connfd);
FD_SET(sock, &connfd);
do {
rv = select(sock + 1, NULL, &connfd, NULL, NULL);
} while (rv == -1 && errno == EINTR);
if (rv > 0)
rv = 0;
if ((flags = fcntl(sock, F_GETFL, 0)) == -1)
return -1; /* get current socket flags */
if (fcntl(sock, F_SETFL, flags | O_NONBLOCK) == -1)
return -1; /* set non-blocking connect */
/* NOTE: we now must restore socket flags on successful exit */
pfd[0].fd = sock;
pfd[0].events = POLLIN|POLLOUT;
if (quit_time > 0) { /* want a non default timeout */
(void)gettimeofday(&endtime, NULL);
endtime.tv_sec += quit_time; /* determine end time */
}
return (rv);
rv = connect(sock, name, namelen); /* inititate the connection */
if (rv == -1) { /* connection error */
if (errno != EINPROGRESS) /* error isn't "please wait" */
return -1;
/* connect EINPROGRESS; wait */
do {
if (quit_time > 0) { /* determine timeout */
(void)gettimeofday(&now, NULL);
timersub(&endtime, &now, &td);
timeout = td.tv_sec * 1000 + td.tv_usec/1000;
if (timeout < 0)
timeout = 0;
} else {
timeout = INFTIM;
}
pfd[0].revents = 0;
rv = xpoll(pfd, 1, timeout);
/* loop until poll ! EINTR */
} while (rv == -1 && errno == EINTR);
if (rv == 0) { /* poll (connect) timed out */
errno = ETIMEDOUT;
return -1;
}
if (rv == -1) { /* poll error */
return -1;
} else if (pfd[0].revents & (POLLIN|POLLOUT)) {
slen = sizeof(error); /* OK, or pending error */
if (getsockopt(sock, SOL_SOCKET, SO_ERROR,
&error, &slen) == -1)
return -1; /* Solaris pending error */
if (error != 0) {
errno = error; /* BSD pending error */
return -1;
}
} else {
errno = EBADF; /* this shouldn't happen ... */
return -1;
}
}
if (fcntl(sock, F_SETFL, flags) == -1) /* restore socket flags */
return -1;
return 0;
}
/*
@ -1279,6 +1334,16 @@ xlisten(int sock, int backlog)
return (listen(sock, backlog));
}
/*
* Internal version of poll(2), to allow reimplementation by select(2)
* on platforms without the former.
*/
int
xpoll(struct pollfd *fds, int nfds, int timeout)
{
return poll(fds, nfds, timeout);
}
/*
* malloc() with inbuilt error checking
*/

View File

@ -1,4 +1,4 @@
/* $NetBSD: version.h,v 1.44 2005/01/12 22:37:41 lukem Exp $ */
/* $NetBSD: version.h,v 1.50 2005/05/14 15:26:43 lukem Exp $ */
/*-
* Copyright (c) 1999-2005 The NetBSD Foundation, Inc.
* All rights reserved.
@ -40,5 +40,5 @@
#endif
#ifndef FTP_VERSION
#define FTP_VERSION "20050112"
#define FTP_VERSION "20050514"
#endif