Import lukemftp-1.6-beta2.

This commit is contained in:
Mike Heffner 2002-06-15 09:40:37 +00:00
parent ccb3a87203
commit 2e0951ee2d
22 changed files with 2106 additions and 508 deletions

View File

@ -1,3 +1,209 @@
Mon Jun 10 08:12:35 UTC 2002 lukem
* crank FTP_VERSION from 1.6-beta1 to 1.6-beta2
* replace missing fseeko(), with a wrapper to fseek() which
checks that the offset isn't > LONG_MAX
* #include <regex.h> #if HAVE_REGEX_H
Mon Jun 10 01:27:46 UTC 2002 lukem
* check for and replace sa_family_t definition
* don't bother checking for issetugid(); it was only used in the
internal libedit to prevent $HOME/.editrc from being used if
running set-id, and the newer libedit code wouldn't even read
$HOME/.editrc if issetugid() wasn't available. as many target
operating systems don't have issetugid(), and lukemftp isn't
likely to be run set-id (and $HOME/.netrc is used in any case),
the issetugid() check has been disabled in libedit.
* add back cpp code which #defines REGEX #if HAVE_REGEX_H
Wed Jun 5 14:39:11 UTC 2002 lukem
* crank FTP_VERSION from 1.6alpha1 to 1.6-beta1
* implement replacement setprogname()
* use getprogname() instead of __progname
* convert to christos' replacement fgetln(), as it's better than mine
* merge ftp from NetBSD 20020605 to 20020606:
- use setprogname()
- only support -6 if INET6 is defined
Wed Jun 5 13:08:25 UTC 2002 lukem
* don't bother checking if <glob.h> is usable (see below).
* always compile in local glob; it's the best way to ensure that
various security issues are fixed
* update libukem/glob.c from NetBSD's __glob13.c rev 1.22 and rev 1.23
* merge libedit from NetBSD 20010413 to 20020606:
- constify; passes all gcc and lint strict checks.
- add config.h [Jason Evans], to create a portable version of
libedit that can be easily compiled on other OS's.
- PR/12963:Jason Waterman: Fix signed cast problems.
- Fixed an __P remnant
- Close quoting.
- Generate <>& symbolically.
- Punctuation and whitespace nits, fix a typo.
- PR/14188: Anthony Mallet: Provide an opaque data
pointer to client programs.
- a couple of minor fixes. originally by Ruslan Ermilov
<ru@FreeBSD.org>, highlighted to me by way of Mike Barcroft
<mike@FreeBSD.org> (thanks!)
- PR/14067: Anthony Mallet: Provide a programmatic way
to set the read_char function via a new el_set() operation.
Thanks, nicely done :-)
- `existent', not `existant'
- Don't use HAVE_ yet.
- Fix a warning.
- Remove an unused variable.
- If term_init() fails, cleanup and return NULL. This
avoids other lossage. Pointed by charles.
- va_{start,end} audit: Make sure that each va_start has one
and only one matching va_end, especially in error cases.
If the va_list is used multiple times, do multiple
va_starts/va_ends. If a function gets va_list as argument,
don't let it use va_end (since it's the callers
responsibility). Improved by comments from enami and
christos -- thanks!
- history_def_enter: fix off-by-one mistake in delete
condition (the behaviour to keep at least one entry on the
history list is retained). This fixes lib/9704 by Phil Nelson.
* merge ftp from NetBSD 20020524 to 20020605:
- when showing the final progress bar, replace "00:00 ETA"
with the elapsed time. (suggested by simonb)
- actually display transfer stats after a URL fetch.
(bug introduced a *long* time ago)
- update copyright & version
* merge ftp from NetBSD 20001127 to 20020524:
- Use "r+" instead of "r+w", since the latter is not standard.
Noted by <Steve.McClellan@radisys.com> in private email.
- Only send port number in HTTP/1.1 Host: request if port !=
80. Fixes [bin/15415] from Takahiro Kambe
<taca@sky.yamashina.kyoto.jp>
- Fix bad mode passed by mls() to recvrequest(). Fixes
[bin/16642] from <steve.mcclellan@radisys.com>
- update copyrights
- minor knf
- invoke cmdtab.c_handler()s with argv[0] == c_name instead
of the supplied name. that way the full (unambiguous) name
is displayed in error messages and usage strings.
- line2 may overrun if line is too long (> 200). be more
careful on strcpy.
- Handle URLs without files correctly (e.g, when using '-o -').
Fix from Anders Dinsen <anders@dinsen.net> in [bin/13768]
- portnum is unsigned, use %u instead of %d
- Add -4 to force IPv4 and -6 to force IPv6 address usage.
From Hajimu UMEMOTO, via Mike Heffner of FreeBSD.
- use u_char instead of char in base64_encode().
problem noticed by Jorgen Lundman in private mail.
- don't make broken file with -R option.
- handle "*" in Content-Range properly.
- If no_proxy condition is true && urltype == FTP_URL_T,
use fetch_ftp to retrieve
- convert to use getprogname()
- Fix description for "form", "mode", and "struct" commands.
Inspired by [bin/16736] from Steve McClellan
<steve.mcclellan@radisys.com>
- Generate <>& symbolically. I'm avoiding .../dist/...
directories for now.
- Punctuation nits.
- Whitespace cleanup.
- put "site" in alphabetical order. noted by Mike Barcroft
in private email
- avoid buffer overrun on PASV from malicious server.
- Large file ASCII mode support by using fseeko()
instead of fseek(). From Andrey A. Chernov of FreeBSD,
via Mike Heffner.
- Deal with const'ification if el_parse().
- call setlocale() on startup
- display a limited progress bar (containing bytes xferred
and xfer rate) when the file size is unknown
- disable progress bar during remglob()
Thu Mar 14 05:41:49 UTC 2002 lukem
* ensure all AF_INET6 use is protected with #ifdef INET6
* remove unnecessary __attribute__ goop
* libukem/snprintf.c: fix compile errors with gcc 3.x
Tue Apr 17 08:07:29 UTC 2001 lukem
* autoconf check for %q long long support in *printf()
(instead of %ll), define and use HAVE_PRINTF_QD if so
* ipv6 isn't compatible with socks, so disable the former
* look for <libutil.h> (instead of <util.h>) and <arpa/nameser.h>
* don't check for fparseln() twice
* fix getaddrinfo() checks
* crank FTP_VERSION from 1.5 to 1.6alpha1
* always ensure _PATH_BSHELL and _PATH_TMP are defined
* prototype inet_pton() if its missing
* don't bother trying to use if_indextoname() in ip6_sa2str()
(fixes problems on MacOS X)
* in inet_pton(), pull in <arpa/nameser.h> for IN6ADDRSZ and INT16SZ,
and define if missing
Fri Apr 13 15:24:44 UTC 2001 lukem
* only include <arpa/nameser.h> if we have it
* update glob(3) to netbsd-current (20010329), adding support
for GLOB_LIMIT and fixing various buffer overflows.
* update editline from NetBSD 20000915 -> NetBSD 20010413
- Enlarge editline buffers as needed to support arbitrary
length lines. This also addresses lib/9712 by Phil Nelson.
- consistently check for allocation failures and return -1,
if we could not get more memory.
- add support for home and end keys.
- improve debugging support
- el_line_t: make 'limit' const
Mon Nov 27 23:23:40 EST 2000 lukem
* merge ftp from NetBSD-current (20001127):
- implement "mreget"; as per "mget" but uses "reget" instead
of "get"
- add -N netrc and $NETRC, as methods to select an alternative
.netrc file
- cache local user name and home directory for further use
- in mget(), use docase() instead of a local version to do
the case conversion.
- format string cleanups
- be more explicit that $ftp_proxy and $http_proxy are not
supported for interactive sessions
- cope with 2553bis getnameinfo (always attach scope id)
getnameinfo error check.
- use NI_MAXHOST with getnameinfo. we can assume presence of
getnameinfo.
Tue Nov 7 00:16:23 EST 2000 lukem
* libukem/snprintf.c had a non-functional `%s' due to a
function declaration mismatch. problem found and fixed
by Hubert Feyrer <hubert@feyrer.de>
Wed Oct 11 14:06:19 EST 2000 lukem
* released version 1.5

View File

@ -74,11 +74,13 @@ The following platforms & compilers have been tested:
- AIX 4.1.5:
- AIX 4.2.1:
- Compiler: cc -qlanglvl=ansi
- AIX 4.3.3:
- Compiler: xlc -qlanglvl=ansi
version: xlC 3.1.4.10 -- C for AIX Compiler
version: ibmcxx.cmp 3.6.6.6 -- IBM C and C++ Compilers
Configure with:
env CC="cc -qlanglvl=ansi" ./configure
env CC="xlc" CFLAGS="-qlanglvl=ansi" ./configure
- BSD/OS 4.0.1 (x86)
- BSD/OS 4.1 (x86)
@ -173,10 +175,6 @@ The following platforms & compilers have been tested:
XXX: clean up to match reality
------------------------------
- AIX 4.3.2:
Compiler: cc
version: ibmcxx 3.6.6.1 -- IBM C and C++ Compilers
- RedHat Linux 5.0 (i386)
Compiler: cc

View File

@ -2,7 +2,7 @@ Whilst a lot of the work in lukemftp (both the original sources in NetBSD
and this port) was done by me (Luke Mewburn), it would not be as useable
without the enhancements, fixes, or input from the following people:
Brian Stark <bstark@siemens-psc.com>
Brian Stark <bstark1990@netscape.net>
Chris G. Demetriou <cgd@netbsd.org>
Christos Zoulas <christos@netbsd.org>
Dan Winship <danw@mit.edu>

View File

@ -1,4 +1,4 @@
/* $Id: acconfig.h,v 1.6 2000/09/17 23:29:12 lukem Exp $ */
/* $Id: acconfig.h,v 1.9 2002/06/10 01:27:13 lukem Exp $ */
@TOP@
@BOTTOM@
@ -6,9 +6,15 @@
/* Define if your compiler supports `long long' */
#undef HAVE_LONG_LONG
/* Define if *printf() uses %qd to print `long long' (otherwise uses %lld) */
#undef HAVE_PRINTF_QD
/* Define if in_port_t exists */
#undef HAVE_IN_PORT_T
/* Define if sa_family_t exists in <sys/socket.h> */
#undef HAVE_SA_FAMILY_T
/* Define if struct sockaddr.sa_len exists (implies sockaddr_in.sin_len, etc) */
#undef HAVE_SOCKADDR_SA_LEN
@ -33,9 +39,6 @@
/* Define if `struct direct' has a d_namlen element */
#undef HAVE_D_NAMLEN
/* Define if GLOB_BRACE exists in <glob.h> */
#undef HAVE_GLOB_BRACE
/* Define if h_errno exists in <netdb.h> */
#undef HAVE_H_ERRNO_D

View File

@ -1,5 +1,5 @@
/* config.h.in. Generated automatically from configure.in by autoheader. */
/* $Id: config.h.in,v 1.24 2000/09/18 00:40:12 lukem Exp $ */
/* $Id: config.h.in,v 1.28 2002/06/10 08:10:33 lukem Exp $ */
/* Define if on AIX 3.
@ -54,6 +54,9 @@
/* Define if you have the fparseln function. */
#undef HAVE_FPARSELN
/* Define if you have the fseeko function. */
#undef HAVE_FSEEKO
/* Define if you have the getaddrinfo function. */
#undef HAVE_GETADDRINFO
@ -69,18 +72,12 @@
/* Define if you have the getpgrp function. */
#undef HAVE_GETPGRP
/* Define if you have the glob function. */
#undef HAVE_GLOB
/* Define if you have the inet_ntop function. */
#undef HAVE_INET_NTOP
/* Define if you have the inet_pton function. */
#undef HAVE_INET_PTON
/* Define if you have the issetugid function. */
#undef HAVE_ISSETUGID
/* Define if you have the memmove function. */
#undef HAVE_MEMMOVE
@ -93,6 +90,9 @@
/* Define if you have the select function. */
#undef HAVE_SELECT
/* Define if you have the setprogname function. */
#undef HAVE_SETPROGNAME
/* Define if you have the sl_init function. */
#undef HAVE_SL_INIT
@ -132,12 +132,18 @@
/* Define if you have the usleep function. */
#undef HAVE_USLEEP
/* Define if you have the <arpa/nameser.h> header file. */
#undef HAVE_ARPA_NAMESER_H
/* Define if you have the <dirent.h> header file. */
#undef HAVE_DIRENT_H
/* Define if you have the <err.h> header file. */
#undef HAVE_ERR_H
/* Define if you have the <libutil.h> header file. */
#undef HAVE_LIBUTIL_H
/* Define if you have the <ndir.h> header file. */
#undef HAVE_NDIR_H
@ -183,9 +189,15 @@
/* Define if your compiler supports `long long' */
#undef HAVE_LONG_LONG
/* Define if *printf() uses %qd to print `long long' (otherwise uses %lld) */
#undef HAVE_PRINTF_QD
/* Define if in_port_t exists */
#undef HAVE_IN_PORT_T
/* Define if sa_family_t exists in <sys/socket.h> */
#undef HAVE_SA_FAMILY_T
/* Define if struct sockaddr.sa_len exists (implies sockaddr_in.sin_len, etc) */
#undef HAVE_SOCKADDR_SA_LEN
@ -210,9 +222,6 @@
/* Define if `struct direct' has a d_namlen element */
#undef HAVE_D_NAMLEN
/* Define if GLOB_BRACE exists in <glob.h> */
#undef HAVE_GLOB_BRACE
/* Define if h_errno exists in <netdb.h> */
#undef HAVE_H_ERRNO_D

File diff suppressed because it is too large Load Diff

View File

@ -1,10 +1,10 @@
dnl $Id: configure.in,v 1.32 2000/09/18 00:10:43 lukem Exp $
dnl $Id: configure.in,v 1.37 2002/06/10 08:08:53 lukem Exp $
dnl
dnl configure.in --
dnl process this file with autoconf to produce a configure script.
dnl
AC_REVISION($Revision: 1.32 $)dnl
AC_REVISION($Revision: 1.37 $)dnl
AC_INIT(lukemftp.h)
@ -37,7 +37,6 @@ AC_AIX
dnl Checks for libraries.
dnl
dnl XXX: we check fparseln twice; probably best to fix that
AC_CHECK_LIB(util, fparseln)
if test $opt_editcomplete = yes; then
AC_CHECK_LIB(tinfo, tgetent, ,
@ -48,6 +47,12 @@ if test $opt_editcomplete = yes; then
fi
AC_LIBRARY_NET
AC_LIBRARY_SOCKS
if test -n "$socks"; then
if test $opt_ipv6 = yes; then
echo "IPv6 is incompatible with socks, disabling IPv6 support"
opt_ipv6=no
fi
fi
dnl Checks for header files.
@ -55,7 +60,8 @@ dnl
AC_CONFIG_HEADER(config.h)
AC_HEADER_DIRENT
AC_HEADER_STDC
AC_CHECK_HEADERS(err.h regex.h paths.h poll.h sys/poll.h termcap.h util.h vis.h)
AC_CHECK_HEADERS(arpa/nameser.h err.h regex.h paths.h poll.h sys/poll.h \
termcap.h util.h libutil.h vis.h)
dnl Checks for typedefs, structures, and compiler characteristics.
@ -74,6 +80,10 @@ AC_MSG_TRY_COMPILE(for in_port_t, ftp_cv_HAVE_IN_PORT_T, [
#include <sys/types.h>
#include <netinet/in.h> ], [ in_port_t X ], [AC_DEFINE(HAVE_IN_PORT_T, 1)])
AC_MSG_TRY_COMPILE(for sa_family_t, ftp_cv_HAVE_SA_FAMILY_T, [
#include <sys/types.h>
#include <sys/socket.h> ], [ sa_family_t X ], [AC_DEFINE(HAVE_SA_FAMILY_T, 1)])
AC_MSG_TRY_COMPILE(for sockaddr_in.sin_len, ftp_cv_HAVE_SOCKADDR_SA_LEN, [
#include <sys/types.h>
#include <sys/socket.h>
@ -123,9 +133,6 @@ AC_MSG_TRY_COMPILE(for d_namlen in struct dirent, ftp_cv_HAVE_D_NAMLEN, [
struct dirent dp;
int X = dp.d_namlen; ], [AC_DEFINE(HAVE_D_NAMLEN, 1)])
AC_MSG_TRY_COMPILE(for GLOB_BRACE, ftp_cv_have_glob_brace, [
#include <glob.h> ], [ int X = GLOB_BRACE ], [:])
AC_MSG_TRY_COMPILE(for h_errno declaration, ftp_cv_HAVE_H_ERRNO_D, [
#include <netdb.h> ], [ int X = h_errno ], [AC_DEFINE(HAVE_H_ERRNO_D, 1)])
@ -151,14 +158,18 @@ AC_MSG_TRY_COMPILE(for pclose() declaration, ftp_cv_HAVE_PCLOSE_D, [
dnl Checks for library functions.
dnl
AC_REPLACE_FUNCS(err fgetln fparseln getaddrinfo getnameinfo glob inet_ntop \
inet_pton mkstemp sl_init snprintf strdup strerror strlcat \
AC_REPLACE_FUNCS(err fgetln fseeko getaddrinfo getnameinfo inet_ntop inet_pton \
mkstemp setprogname sl_init snprintf strdup strerror strlcat \
strlcpy strptime strsep strunvis strvis timegm usleep)
AC_CHECK_FUNCS(gethostbyname2 getpassphrase getpgrp issetugid memmove poll \
select)
AC_CHECK_FUNCS(gethostbyname2 getpassphrase getpgrp memmove poll select)
if test $ac_cv_func_getpgrp = yes; then
AC_FUNC_GETPGRP
fi
if test $ac_cv_lib_util_fparseln != yes; then
AC_REPLACE_FUNCS(fparseln)
fi
LIBOBJS="$LIBOBJS glob.o"
if test $ac_cv_func_strptime = yes; then
AC_MSG_TRY_COMPILE(for strptime() declaration, ftp_cv_HAVE_STRPTIME_D, [
@ -166,44 +177,51 @@ if test $ac_cv_func_strptime = yes; then
[AC_DEFINE(HAVE_STRPTIME_D, 1)])
fi
AC_MSG_CHECKING(for GLOB_BRACE support in glob)
if test $ftp_cv_have_glob_brace = yes; then
AC_DEFINE(HAVE_GLOB_BRACE, 1)
AC_MSG_RESULT(yes)
else
AC_MSG_RESULT([no, using my own])
LIBOBJS="$LIBOBJS glob.o"
fi
if test $have_long_long = yes -a $ac_cv_sizeof_off_t -ge 8; then
AC_DEFINE(HAVE_QUAD_SUPPORT, 1)
AC_REPLACE_FUNCS(strtoll)
AC_MSG_CHECKING(snprintf support for %lld)
if test $ac_cv_func_snprintf = yes; then
dnl We assume that if sprintf() supports %lld or %qd,
dnl then all of *printf() does. If not, disable long long
dnl support because we don't know how to display it.
AC_MSG_CHECKING(*printf() support for %lld)
can_printf_longlong=no
AC_TRY_RUN([
#include <stdio.h>
int main() {
char buf[100];
sprintf(buf, "%lld", 4294967300LL);
return (strcmp(buf, "4294967300"));
}
], [
AC_MSG_RESULT(yes)
can_printf_longlong=yes
], [
AC_MSG_RESULT(no)
], [ : ])
if test $can_printf_longlong != yes; then
AC_MSG_CHECKING(*printf() support for %qd)
AC_TRY_RUN([
#include <stdio.h>
int main() {
char buf[100];
snprintf(buf, sizeof(buf), "%lld",
4294967300LL);
sprintf(buf, "%qd", 4294967300LL);
return (strcmp(buf, "4294967300"));
}
], [
AC_MSG_RESULT(yes)
have_snprintf_lld=yes
can_printf_longlong=yes
AC_DEFINE(HAVE_PRINTF_QD, 1)
], [
AC_MSG_RESULT(no, using local version)
have_snprintf_lld=no
], [
AC_MSG_RESULT(cross-compiling, using local version)
have_snprintf_lld=no
])
if test $have_snprintf_lld = no; then
LIBOBJS="$LIBOBJS snprintf.o"
fi
else
AC_MSG_RESULT(using local version)
AC_MSG_RESULT(no)
], [ : ])
fi
if test $can_printf_longlong = yes; then
AC_DEFINE(HAVE_QUAD_SUPPORT, 1)
AC_REPLACE_FUNCS(strtoll)
fi
fi
@ -217,7 +235,7 @@ if test $opt_editcomplete = yes; then
AC_MSG_CHECKING(for working libedit)
if test $have_libedit = no; then
AC_MSG_RESULT([no, using my own])
AC_MSG_RESULT(no - using my own)
INCLUDES="-I\${srcdir}/../libedit $INCLUDES"
LDFLAGS="-L../libedit $LDFLAGS"
LIBS="-ledit $LIBS"
@ -238,18 +256,24 @@ fi
have_rfc2553_netdb=no
if test $ac_cv_func_getaddrinfo = yes; then
AC_MSG_TRY_COMPILE(for AI_NUMERICHOST, ftp_cv_have_ai_numerichost, [
if test $ac_cv_func_getaddrinfo = yes -a ! -n "$socks"; then
AC_MSG_TRY_COMPILE(for AI_NUMERICHOST,
ftp_cv_have_ai_numerichost, [
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h> ],
[ int X = AI_NUMERICHOST ], [ have_rfc2553_netdb=yes ])
fi
AC_MSG_CHECKING(for working getaddrinfo())
if test $have_rfc2553_netdb = yes; then
AC_DEFINE(HAVE_RFC2553_NETDB, 1)
AC_MSG_RESULT(yes)
else
if test $ac_cv_func_getaddrinfo = yes; then
LIBOBJS="$LIBOBJS getaddrinfo.o"
AC_MSG_RESULT(no - using local version)
else
AC_MSG_RESULT(using local version)
fi
fi

View File

@ -1,7 +1,7 @@
/* $Id: lukemftp.h,v 1.36 2000/10/11 03:07:36 lukem Exp $ */
/* $Id: lukemftp.h,v 1.43 2002/06/10 08:13:01 lukem Exp $ */
#define FTP_PRODUCT "lukemftp"
#define FTP_VERSION "1.5"
#define FTP_VERSION "1.6-beta2"
#include "config.h"
@ -77,7 +77,7 @@
# include <err.h>
#endif
#if HAVE_GLOB_BRACE
#if USE_GLOB_H /* not set by configure; used by other build systems */
# include <glob.h>
#else
# include "ftpglob.h"
@ -85,9 +85,12 @@
#if HAVE_PATHS_H
# include <paths.h>
#else
# define _PATH_BSHELL "/bin/sh"
# define _PATH_TMP "/tmp/"
#endif
#ifndef _PATH_BSHELL
#define _PATH_BSHELL "/bin/sh"
#endif
#ifndef _PATH_TMP
#define _PATH_TMP "/tmp/"
#endif
typedef struct _stringlist {
@ -116,6 +119,10 @@ void tputs(const char *, int, int (*)(int));
# include <util.h>
#endif
#if HAVE_LIBUTIL_H
# include <libutil.h>
#endif
#if HAVE_VIS_H
# include <vis.h>
#else
@ -126,6 +133,10 @@ void tputs(const char *, int, int (*)(int));
typedef unsigned short in_port_t;
#endif
#if ! HAVE_SA_FAMILY_T
typedef unsigned short sa_family_t;
#endif
#if ! HAVE_SOCKLEN_T
typedef unsigned int socklen_t;
#endif
@ -274,6 +285,10 @@ void warnx(const char *, ...);
char *fgetln(FILE *, size_t *);
#endif
#if ! HAVE_FSEEKO
int fseeko(FILE *, off_t, int);
#endif
#if ! HAVE_FPARSELN
# define FPARSELN_UNESCESC 0x01
# define FPARSELN_UNESCCONT 0x02
@ -287,10 +302,19 @@ char *fparseln(FILE *, size_t *, size_t *, const char[3], int);
const char *inet_ntop(int, const void *, char *, size_t);
#endif
#if ! HAVE_INET_PTON
int inet_pton(int, const char *, void *);
#endif
#if ! HAVE_MKSTEMP
int mkstemp(char *);
#endif
#if ! HAVE_SETPROGNAME
const char *getprogname(void);
void setprogname(const char *);
#endif
#if ! HAVE_SNPRINTF
int snprintf(char *, size_t, const char *, ...);
#endif

View File

@ -1,7 +1,7 @@
/* $NetBSD: cmds.c,v 1.90 2000/08/01 22:47:25 lukem Exp $ */
/* $NetBSD: cmds.c,v 1.98 2002/06/05 10:20:46 lukem Exp $ */
/*-
* Copyright (c) 1996-2000 The NetBSD Foundation, Inc.
* Copyright (c) 1996-2002 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@ -515,26 +515,28 @@ void
reget(int argc, char *argv[])
{
(void)getit(argc, argv, 1, "r+w");
(void)getit(argc, argv, 1, "r+");
}
void
get(int argc, char *argv[])
{
(void)getit(argc, argv, 0, restart_point ? "r+w" : "w" );
(void)getit(argc, argv, 0, restart_point ? "r+" : "w" );
}
/*
* Receive one file.
* If restartit is 1, restart the xfer always.
* If restartit is -1, restart the xfer only if the remote file is newer.
*/
int
getit(int argc, char *argv[], int restartit, const char *mode)
{
int loc = 0;
int rval = 0;
char *remfile, *locfile, *olocfile;
int loc, rval;
char *remfile, *locfile, *olocfile;
loc = rval = 0;
if (argc == 2) {
argc++;
argv[2] = argv[1];
@ -639,8 +641,9 @@ void
mget(int argc, char *argv[])
{
sigfunc oldintr;
int ch, ointer;
char *cp, *tp, *tp2, tmpbuf[MAXPATHLEN];
int ointer;
char *cp, *tp;
int restartit;
if (argc == 0 ||
(argc == 1 && !another(&argc, &argv, "remote-files"))) {
@ -650,6 +653,16 @@ mget(int argc, char *argv[])
}
mname = argv[0];
mflag = 1;
restart_point = 0;
restartit = 0;
if (strcmp(argv[0], "mreget") == 0) {
if (! features[FEAT_REST_STREAM]) {
fprintf(ttyout,
"Restart is not supported by the remote server.\n");
return;
}
restartit = 1;
}
oldintr = xsignal(SIGINT, mintr);
if (sigsetjmp(jabort, 1))
mabort();
@ -658,30 +671,32 @@ mget(int argc, char *argv[])
mflag = 0;
continue;
}
if (mflag && confirm(argv[0], cp)) {
tp = cp;
if (mcase) {
for (tp2 = tmpbuf; (ch = *tp++) != 0; )
*tp2++ = isupper(ch) ? tolower(ch) : ch;
*tp2 = '\0';
tp = tmpbuf;
}
if (ntflag) {
tp = dotrans(tp);
}
if (mapflag) {
tp = domap(tp);
}
recvrequest("RETR", tp, cp, "w",
tp != cp || !interactive, 1);
if (!mflag && fromatty) {
ointer = interactive;
interactive = 1;
if (confirm("Continue with", "mget")) {
mflag++;
}
interactive = ointer;
}
if (! mflag || !confirm(argv[0], cp))
continue;
tp = cp;
if (mcase)
tp = docase(tp);
if (ntflag)
tp = dotrans(tp);
if (mapflag)
tp = domap(tp);
if (restartit) {
struct stat stbuf;
if (stat(tp, &stbuf) == 0)
restart_point = stbuf.st_size;
else
warn("stat %s", tp);
}
recvrequest("RETR", tp, cp, restart_point ? "r+" : "w",
tp != cp || !interactive, 1);
restart_point = 0;
if (!mflag && fromatty) {
ointer = interactive;
interactive = 1;
if (confirm("Continue with", "mget"))
mflag++;
interactive = ointer;
}
}
(void)xsignal(SIGINT, oldintr);
@ -711,7 +726,7 @@ fget(int argc, char *argv[])
}
argv[0] = "get";
mode = restart_point ? "r+w" : "w";
mode = restart_point ? "r+" : "w";
for (;
(buf = fparseln(fp, NULL, NULL, "\0\0\0", 0)) != NULL;
@ -1111,7 +1126,7 @@ lcd(int argc, char *argv[])
code = -1;
if (argc == 1) {
argc++;
argv[1] = home;
argv[1] = localhome;
}
if (argc != 2) {
fprintf(ttyout, "usage: %s [local-directory]\n", argv[0]);
@ -1306,7 +1321,7 @@ mls(int argc, char *argv[])
sigfunc oldintr;
int ointer, i;
int dolist;
char mode[1], *dest, *odest;
char *mode, *dest, *odest;
if (argc == 0)
goto usage;
@ -1333,7 +1348,7 @@ mls(int argc, char *argv[])
if (sigsetjmp(jabort, 1))
mabort();
for (i = 1; mflag && i < argc-1 && connected; i++) {
*mode = (i == 1) ? 'w' : 'a';
mode = (i == 1) ? "w" : "a";
recvrequest(dolist ? "LIST" : "NLST", dest, argv[i], mode,
0, 0);
if (!mflag && fromatty) {
@ -1620,6 +1635,12 @@ do_chmod(int argc, char *argv[])
(void)command("SITE CHMOD %s %s", argv[1], argv[2]);
}
#define COMMAND_1ARG(argc, argv, cmd) \
if (argc == 1) \
command(cmd); \
else \
command(cmd " %s", argv[1])
void
do_umask(int argc, char *argv[])
{
@ -1631,7 +1652,7 @@ do_umask(int argc, char *argv[])
return;
}
verbose = 1;
(void)command(argc == 1 ? "SITE UMASK" : "SITE UMASK %s", argv[1]);
COMMAND_1ARG(argc, argv, "SITE UMASK");
verbose = oldverbose;
}
@ -1646,7 +1667,7 @@ idlecmd(int argc, char *argv[])
return;
}
verbose = 1;
(void)command(argc == 1 ? "SITE IDLE" : "SITE IDLE %s", argv[1]);
COMMAND_1ARG(argc, argv, "SITE IDLE");
verbose = oldverbose;
}
@ -1664,7 +1685,7 @@ rmthelp(int argc, char *argv[])
return;
}
verbose = 1;
(void)command(argc == 1 ? "HELP" : "HELP %s", argv[1]);
COMMAND_1ARG(argc, argv, "HELP");
verbose = oldverbose;
}
@ -1792,6 +1813,7 @@ doproxy(int argc, char *argv[])
cmdpos = strcspn(line, " \t");
if (cmdpos > 0) /* remove leading "proxy " from input buffer */
memmove(line, line + cmdpos + 1, strlen(line) - cmdpos + 1);
argv[1] = c->c_name;
(*c->c_handler)(argc-1, argv+1);
if (connected) {
proxflag = 1;
@ -2427,7 +2449,7 @@ rmtstatus(int argc, char *argv[])
code = -1;
return;
}
(void)command(argc > 1 ? "STAT %s" : "STAT" , argv[1]);
COMMAND_1ARG(argc, argv, "STAT");
}
/*
@ -2503,7 +2525,7 @@ page(int argc, char *argv[])
orestart_point = restart_point;
overbose = verbose;
hash = restart_point = verbose = 0;
recvrequest("RETR", pager, argv[1], "r+w", 1, 0);
recvrequest("RETR", pager, argv[1], "r+", 1, 0);
hash = ohash;
restart_point = orestart_point;
verbose = overbose;
@ -2648,7 +2670,7 @@ mlst(int argc, char *argv[])
return;
}
verbose = 1; /* If we aren't verbose, this doesn't do anything! */
(void)command(argc == 1 ? "MLST" : "MLST %s", argv[1]);
COMMAND_1ARG(argc, argv, "MLST");
verbose = oldverbose;
}
@ -2668,6 +2690,9 @@ opts(int argc, char *argv[])
return;
}
verbose = 1; /* If we aren't verbose, this doesn't do anything! */
(void)command(argc == 2 ? "OPTS %s" : "OPTS %s %s", argv[1], argv[2]);
if (argc == 2)
command("OPTS %s", argv[1]);
else
command("OPTS %s %s", argv[1], argv[2]);
verbose = oldverbose;
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: cmdtab.c,v 1.38 2000/09/14 13:48:33 lukem Exp $ */
/* $NetBSD: cmdtab.c,v 1.39 2000/11/15 00:10:59 lukem Exp $ */
/*-
* Copyright (c) 1996-2000 The NetBSD Foundation, Inc.
@ -108,6 +108,7 @@ char lshelp[] = "list contents of remote path";
char macdefhelp[] = "define a macro";
char mdeletehelp[] = "delete multiple files";
char mgethelp[] = "get multiple files";
char mregethelp[] = "get multiple files restarting at end of local file";
char fgethelp[] = "get files using a localfile as a source of names";
char mkdirhelp[] = "make directory on the remote machine";
char mlshelp[] = "list contents of multiple remote directories";
@ -224,6 +225,7 @@ struct cmd cmdtab[] = {
{ "modtime", modtimehelp, 0, 1, 1, CMPL(r) modtime },
{ "more", pagehelp, 1, 1, 1, CMPL(r) page },
{ "mput", mputhelp, 1, 1, 1, CMPL(L) mput },
{ "mreget", mregethelp, 1, 1, 1, CMPL(R) mget },
{ "msend", mputhelp, 1, 1, 1, CMPL(L) mput },
{ "newer", newerhelp, 1, 1, 1, CMPL(r) newer },
{ "nlist", lshelp, 1, 1, 1, CMPL(rl) ls },

View File

@ -1,4 +1,4 @@
/* $NetBSD: domacro.c,v 1.17 2000/07/18 06:45:03 lukem Exp $ */
/* $NetBSD: domacro.c,v 1.19 2002/02/01 05:04:43 itojun Exp $ */
/*
* Copyright (c) 1985, 1993, 1994
@ -41,7 +41,7 @@ void
domacro(int argc, char *argv[])
{
int i, j, count = 2, loopflg = 0;
char *cp1, *cp2, line2[200];
char *cp1, *cp2, line2[FTPBUFLEN];
struct cmd *c;
if ((argc == 0 && argv != NULL) ||
@ -59,7 +59,7 @@ domacro(int argc, char *argv[])
code = -1;
return;
}
(void)strcpy(line2, line);
(void)strlcpy(line2, line, sizeof(line2));
TOP:
cp1 = macros[i].mac_start;
while (cp1 != macros[i].mac_end) {
@ -78,7 +78,8 @@ domacro(int argc, char *argv[])
j = 10*j + *cp1 - '0';
cp1--;
if (argc - 2 >= j) {
(void)strcpy(cp2, argv[j+1]);
(void)strlcpy(cp2, argv[j+1],
sizeof(line) - (cp2 - line));
cp2 += strlen(argv[j+1]);
}
break;
@ -87,7 +88,8 @@ domacro(int argc, char *argv[])
loopflg = 1;
cp1++;
if (count < argc) {
(void)strcpy(cp2, argv[count]);
(void)strlcpy(cp2, argv[count],
sizeof(line) - (cp2 - line));
cp2 += strlen(argv[count]);
}
break;
@ -117,10 +119,11 @@ domacro(int argc, char *argv[])
fputs(line, ttyout);
putc('\n', ttyout);
}
margv[0] = c->c_name;
(*c->c_handler)(margc, margv);
if (bell && c->c_bell)
(void)putc('\007', ttyout);
(void)strcpy(line, line2);
(void)strlcpy(line, line2, sizeof(line));
makeargv();
argc = margc;
argv = margv;

View File

@ -1,4 +1,4 @@
/* $NetBSD: extern.h,v 1.59 2000/08/06 08:51:22 lukem Exp $ */
/* $NetBSD: extern.h,v 1.60 2000/10/11 14:46:03 is Exp $ */
/*-
* Copyright (c) 1996-2000 The NetBSD Foundation, Inc.
@ -122,7 +122,8 @@ void cleanuppeer(void);
void cmdabort(int);
void cmdtimeout(int);
void cmdscanner(void);
int command(const char *, ...);
int command(const char *, ...)
;
#ifndef NO_EDITCOMPLETE
unsigned char complete(EditLine *, int);
void controlediting(void);

View File

@ -1,7 +1,7 @@
/* $NetBSD: fetch.c,v 1.125 2000/09/28 12:29:23 lukem Exp $ */
/* $NetBSD: fetch.c,v 1.136 2002/06/05 10:20:48 lukem Exp $ */
/*-
* Copyright (c) 1997-2000 The NetBSD Foundation, Inc.
* Copyright (c) 1997-2002 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@ -58,7 +58,7 @@ typedef enum {
void aborthttp(int);
static int auth_url(const char *, char **, const char *, const char *);
static void base64_encode(const char *, size_t, char *);
static void base64_encode(const u_char *, size_t, u_char *);
static int go_fetch(const char *);
static int fetch_ftp(const char *);
static int fetch_url(const char *, const char *, char *, char *);
@ -171,11 +171,11 @@ auth_url(const char *challenge, char **response, const char *guser,
* which should be at least ((len + 2) * 4 / 3 + 1) in size.
*/
static void
base64_encode(const char *clear, size_t len, char *encoded)
base64_encode(const u_char *clear, size_t len, u_char *encoded)
{
static const char enc[] =
static const u_char enc[] =
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
char *cp;
u_char *cp;
int i;
cp = encoded;
@ -373,7 +373,7 @@ parse_url(const char *url, const char *desc, url_t *type,
if (tport != NULL)
*port = xstrdup(tport);
if (*path == NULL)
*path = xstrdup("");
*path = xstrdup("/");
if (debug)
fprintf(ttyout,
@ -393,7 +393,7 @@ sigjmp_buf httpabort;
* If proxyenv is set, use that for the proxy, otherwise try ftp_proxy or
* http_proxy as appropriate.
* Supports HTTP redirects.
* Returns -1 on failure, 0 on completed xfer, 1 if ftp connection
* Returns 1 on failure, 0 on completed xfer, -1 if ftp connection
* is still open (e.g, ftp xfer with trailing /)
*/
static int
@ -574,6 +574,10 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
}
}
FREEPTR(np_copy);
if (isproxy == 0 && urltype == FTP_URL_T) {
rval = fetch_ftp(url);
goto cleanup_fetch_url;
}
}
if (isproxy) {
@ -700,10 +704,13 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
(p = strchr(h, '%')) != NULL) {
*p = '\0';
}
fprintf(fin, "Host: [%s]:%d\r\n", h, portnum);
fprintf(fin, "Host: [%s]", h);
free(h);
} else
fprintf(fin, "Host: %s:%d\r\n", host, portnum);
fprintf(fin, "Host: %s", host);
if (portnum != HTTP_PORT)
fprintf(fin, ":%u", portnum);
fprintf(fin, "\r\n");
fprintf(fin, "Accept: */*\r\n");
fprintf(fin, "Connection: close\r\n");
if (restart_point) {
@ -801,26 +808,42 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
} else if (strncasecmp(cp, CONTENTRANGE,
sizeof(CONTENTRANGE) - 1) == 0) {
cp += sizeof(CONTENTRANGE) - 1;
rangestart = STRTOLL(cp, &ep, 10);
if (rangestart < 0 || *ep != '-')
if (*cp == '*') {
ep = cp + 1;
}
else {
rangestart = STRTOLL(cp, &ep, 10);
if (rangestart < 0 || *ep != '-')
goto improper;
cp = ep + 1;
rangeend = STRTOLL(cp, &ep, 10);
if (rangeend < 0 || rangeend < rangestart)
goto improper;
}
if (*ep != '/')
goto improper;
cp = ep + 1;
rangeend = STRTOLL(cp, &ep, 10);
if (rangeend < 0 || *ep != '/' ||
rangeend < rangestart)
goto improper;
cp = ep + 1;
entitylen = STRTOLL(cp, &ep, 10);
if (entitylen < 0 || *ep != '\0')
if (*cp == '*') {
ep = cp + 1;
}
else {
entitylen = STRTOLL(cp, &ep, 10);
if (entitylen < 0)
goto improper;
}
if (*ep != '\0')
goto improper;
if (debug)
fprintf(ttyout,
"parsed range as: "
LLF "-" LLF "/" LLF "\n",
(LLT)rangestart,
(LLT)rangeend,
(LLT)entitylen);
if (debug) {
fprintf(ttyout, "parsed range as: ");
if (rangestart == -1)
fprintf(ttyout, "*");
else
fprintf(ttyout, LLF "-" LLF,
(LLT)rangestart,
(LLT)rangeend);
fprintf(ttyout, "/" LLF "\n", (LLT)entitylen);
}
if (! restart_point) {
warnx(
"Received unexpected Content-Range header");
@ -1014,10 +1037,18 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
}
closefunc = pclose;
} else {
if (restart_point){
if ((rangeend != -1 && rangeend <= restart_point) ||
(rangestart == -1 && filesize != -1 && filesize <= restart_point)) {
/* already done */
if (verbose)
fprintf(ttyout, "already done\n");
rval = 0;
goto cleanup_fetch_url;
}
if (restart_point && rangestart != -1) {
if (entitylen != -1)
filesize = entitylen;
if (rangestart != -1 && rangestart != restart_point) {
if (rangestart != restart_point) {
warnx(
"Size of `%s' differs from save file `%s'",
url, savefile);
@ -1149,7 +1180,6 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
goto cleanup_fetch_url;
}
progressmeter(1);
bytes = 0;
(void)fflush(fout);
if (closefunc == fclose && mtime != -1) {
struct timeval tval[2];
@ -1168,6 +1198,7 @@ fetch_url(const char *url, const char *proxyenv, char *proxyauth, char *wwwauth)
}
if (bytes > 0)
ptransfer(0);
bytes = 0;
rval = 0;
goto cleanup_fetch_url;
@ -1351,7 +1382,7 @@ fetch_ftp(const char *url)
/* Set up the connection */
if (connected)
disconnect(0, NULL);
xargv[0] = __progname;
xargv[0] = (char *)getprogname(); /* XXX discards const */
xargv[1] = host;
xargv[2] = NULL;
xargc = 2;

View File

@ -1,6 +1,6 @@
.\" $NetBSD: ftp.1,v 1.73 2000/09/28 12:26:19 lukem Exp $
.\" $NetBSD: ftp.1,v 1.83 2002/06/05 10:20:48 lukem Exp $
.\"
.\" Copyright (c) 1996-2000 The NetBSD Foundation, Inc.
.\" Copyright (c) 1996-2002 The NetBSD Foundation, Inc.
.\" All rights reserved.
.\"
.\" This code is derived from software contributed to The NetBSD Foundation
@ -68,7 +68,7 @@
.\"
.\" @(#)ftp.1 8.3 (Berkeley) 10/9/94
.\"
.Dd September 28, 2000
.Dd May 18, 2002
.Dt FTP 1
.Os
.Sh NAME
@ -79,6 +79,9 @@ Internet file transfer program
.Nm ""
.Op Fl 46AadefginpRtvV
.Bk -words
.Op Fl N Ar netrc
.Ek
.Bk -words
.Op Fl o Ar output
.Ek
.Bk -words
@ -202,6 +205,14 @@ If no entry exists,
will prompt for the remote machine login name (default is the user
identity on the local machine), and, if necessary, prompt for a password
and an account with which to login.
.It Fl N Ar netrc
Use
.Ar netrc
instead of
.Pa ~/.netrc .
Refer to
.Sx THE .netrc FILE
for more information.
.It Fl o Ar output
When auto-fetching files, save the contents in
.Ar output .
@ -299,7 +310,7 @@ from the user.
When
.Nm
is awaiting commands from the user the prompt
.Ql ftp>
.Ql ftp\*[Gt]
is provided to the user.
The following commands are recognized
by
@ -359,7 +370,10 @@ and exit
An end of file will also terminate the session and exit.
.It Ic case
Toggle remote computer file name case mapping during
.Ic get ,
.Ic mget
and
.Ic mput
commands.
When
.Ic case
@ -413,7 +427,7 @@ When debugging is on,
.Nm
prints each command sent to the remote machine, preceded
by the string
.Ql \-\->
.Ql \-\-\*[Gt]
.It Ic delete Ar remote-file
Delete the file
.Ar remote-file
@ -481,8 +495,9 @@ Set the file transfer
.Ic form
to
.Ar format .
The default format is
.Dq file .
The default (and only supported)
format is
.Dq non-print .
.It Ic ftp Ar host Op Ar port
A synonym for
.Ic open .
@ -525,9 +540,10 @@ are used while transferring the file.
.It Ic glob
Toggle filename expansion for
.Ic mdelete ,
.Ic mget
.Ic mget ,
.Ic mput ,
and
.Ic mput .
.Ic mreget .
If globbing is turned off with
.Ic glob ,
the file name arguments
@ -537,9 +553,10 @@ Globbing for
is done as in
.Xr csh 1 .
For
.Ic mdelete
.Ic mdelete ,
.Ic mget ,
and
.Ic mget ,
.Ic mreget ,
each remote file name is expanded
separately on the remote machine and the lists are not merged.
Expansion of a directory name is likely to be
@ -548,9 +565,10 @@ the exact result depends on the foreign operating system and ftp server,
and can be previewed by doing
.Ql mls remote-files \-
Note:
.Ic mget
and
.Ic mget ,
.Ic mput
and
.Ic mreget
are not meant to transfer
entire directory subtrees of files.
That can be done by
@ -697,9 +715,9 @@ Set the file transfer
.Ic mode
to
.Ar mode-name .
The default mode is
.Dq stream
mode.
The default (and only supported)
mode is
.Dq stream .
.It Ic modtime Ar remote-file
Show the last modification time of the file on the remote machine.
.It Ic more Ar file
@ -718,6 +736,13 @@ Resulting file names will then be processed according to
and
.Ic nmap
settings.
.It Ic mreget Ar remote-files
As per
.Ic mget ,
but performs a
.Ic reget
instead of
.Ic get .
.It Ic msend Ar local-files
A synonym for
.Ic mput .
@ -800,7 +825,7 @@ the output filename "myfile.data" for input filenames "myfile.data" and
"myfile.myfile" for the input filename ".myfile".
Spaces may be included in
.Ar outpattern ,
as in the example: `nmap $1 sed "s/ *$//" > $1' .
as in the example: `nmap $1 sed "s/ *$//" \*[Gt] $1' .
Use the `\e' character to prevent special treatment
of the `$','[',']', and `,' characters.
.It Ic ntrans Op Ar inchars Op Ar outchars
@ -1121,7 +1146,7 @@ commands known to support options include:
.Sq MLST
(used for
.Dv MLSD
and
and
.Dv MLST ) .
.It Ic rename Op Ar from Op Ar to
Rename the file
@ -1249,6 +1274,12 @@ Defaults to
Defaults to
.Ev $FTPRPROMPT .
.El
.It Ic site Ar arg1 arg2 ...
The arguments specified are sent, verbatim, to the remote
.Tn FTP
server as a
.Dv SITE
command.
.It Ic size Ar remote-file
Return size of
.Ar remote-file
@ -1256,12 +1287,6 @@ on remote machine.
.It Ic sndbuf Ar size
Set the size of the socket send buffer to
.Ar size .
.It Ic site Ar arg1 arg2 ...
The arguments specified are sent, verbatim, to the remote
.Tn FTP
server as a
.Dv SITE
command.
.It Ic status
Show the current status of
.Nm ftp .
@ -1270,9 +1295,9 @@ Set the file transfer
.Ar structure
to
.Ar struct-name .
By default
.Dq stream
structure is used.
The default (and only supported)
structure is
.Dq file .
.It Ic sunique
Toggle storing of files on remote machine under unique file names.
The remote
@ -1720,7 +1745,12 @@ The
.Pa .netrc
file contains login and initialization information
used by the auto-login process.
It resides in the user's home directory.
It resides in the user's home directory,
unless overridden with the
.Fl N Ar netrc
option, or specified in the
.Ev NETRC
environment variable.
The following tokens are recognized; they may be separated by spaces,
tabs, or new-lines:
.Bl -tag -width password
@ -1844,7 +1874,7 @@ By default, this is bound to the TAB key.
By default,
.Nm
displays a command line prompt of
.Dq "ftp> "
.Dq "ftp\*[Gt] "
to the user.
This can be changed with the
.Ic "set prompt"
@ -1872,7 +1902,7 @@ begins with
.Sq 0 ,
the number of skipped components precede the trailing component(s) in
the format
.Dq /\fI<skipped>\fRtrailing
.Dq /\fI\*[Lt]skipped\*[Gt]\fRtrailing
(for
.Sq %c )
or
@ -1920,7 +1950,7 @@ only
.It Ev FTPPROMPT
Command-line prompt to use.
Defaults to
.Dq "ftp> " .
.Dq "ftp\*[Gt] " .
Refer to
.Sx COMMAND LINE PROMPT
for more information.
@ -1947,6 +1977,10 @@ lookup of
For default location of a
.Pa .netrc
file, if one exists.
.It Ev NETRC
An alternate location of the
.Pa .netrc
file.
.It Ev PAGER
Used by various commands to display files.
Defaults to
@ -1963,6 +1997,10 @@ URL requests
(if not defined, use the standard
.Tn FTP
protocol).
.Pp
.Em NOTE :
this is not used for interactive sessions, only for command-line
fetches.
.It Ev http_proxy
URL of
.Tn HTTP
@ -1979,7 +2017,11 @@ and
.Ev http_proxy
may be incompatible with other programs that use it
(such as
.Xr lynx 1 ).
.Xr lynx 1 ) .
.Pp
.Em NOTE :
this is not used for interactive sessions, only for command-line
fetches.
.It Ev no_proxy
A space or comma separated list of hosts (or domains) for which
proxying is not to be used.
@ -2019,7 +2061,7 @@ and other enhancements over the standard
were implemented in
.Nx 1.3
and later releases
by Luke Mewburn <lukem@netbsd.org>.
by Luke Mewburn \*[Lt]lukem@netbsd.org\*[Gt].
.Pp
IPv6 support was added by the WIDE/KAME project
(but may not be present in all non-NetBSD versions of this program, depending

View File

@ -1,7 +1,7 @@
/* $NetBSD: ftp.c,v 1.109 2000/09/28 12:29:24 lukem Exp $ */
/* $NetBSD: ftp.c,v 1.120 2002/06/05 10:20:49 lukem Exp $ */
/*-
* Copyright (c) 1996-2000 The NetBSD Foundation, Inc.
* Copyright (c) 1996-2002 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@ -192,8 +192,9 @@ hookup(char *host, char *port)
if (res0->ai_next) /* if we have multiple possibilities */
#endif
{
getnameinfo(res->ai_addr, res->ai_addrlen,
hbuf, sizeof(hbuf), NULL, 0, NI_NUMERICHOST);
if (getnameinfo(res->ai_addr, res->ai_addrlen,
hbuf, sizeof(hbuf), NULL, 0, NI_NUMERICHOST))
strlcpy(hbuf, "?", sizeof(hbuf));
fprintf(ttyout, "Trying %s...\n", hbuf);
}
((struct sockaddr_in *)res->ai_addr)->sin_port = htons(portnum);
@ -209,9 +210,10 @@ hookup(char *host, char *port)
if (error) {
/* this "if" clause is to prevent print warning twice */
if (res->ai_next) {
getnameinfo(res->ai_addr, res->ai_addrlen,
if (getnameinfo(res->ai_addr, res->ai_addrlen,
hbuf, sizeof(hbuf), NULL, 0,
NI_NUMERICHOST);
NI_NUMERICHOST))
strlcpy(hbuf, "?", sizeof(hbuf));
warn("connect to address %s", hbuf);
}
cause = "connect";
@ -703,7 +705,7 @@ sendrequest(const char *cmd, const char *local, const char *remote,
}
if (command("REST " LLF, (LLT)restart_point) != CONTINUE)
goto cleanupsend;
lmode = "r+w";
lmode = "r+";
}
if (remote) {
if (command("%s %s", cmd, remote) != PRELIM)
@ -1178,7 +1180,7 @@ recvrequest(const char *cmd, const char *local, const char *remote,
bytes++;
contin2: ;
}
break2:
break2:
if (hash && (!progress || filesize < 0)) {
if (bytes < hashbytes)
(void)putc('#', ttyout);
@ -1300,7 +1302,8 @@ initconn(void)
switch (data_addr.su_family) {
case AF_INET:
if (epsv4 && !epsv4bad) {
result = command(pasvcmd = "EPSV");
pasvcmd = "EPSV";
result = command("EPSV");
if (!connected)
return (1);
/*
@ -1322,14 +1325,16 @@ initconn(void)
}
}
if (result != COMPLETE) {
result = command(pasvcmd = "PASV");
pasvcmd = "PASV";
result = command("PASV");
if (!connected)
return (1);
}
break;
#ifdef INET6
case AF_INET6:
result = command(pasvcmd = "EPSV");
pasvcmd = "EPSV";
result = command("EPSV");
if (!connected)
return (1);
/* this code is to be friendly with broken BSDI ftpd */
@ -1339,8 +1344,10 @@ initconn(void)
ttyout);
result = COMPLETE + 1;
}
if (result != COMPLETE)
result = command(pasvcmd = "LPSV");
if (result != COMPLETE) {
pasvcmd = "LPSV";
result = command("LPSV");
}
if (!connected)
return (1);
break;
@ -1573,10 +1580,9 @@ initconn(void)
warn("listen");
if (sendport) {
#ifdef INET6
char hname[INET6_ADDRSTRLEN];
char hname[NI_MAXHOST], sname[NI_MAXSERV];
int af;
#endif
struct sockinet tmp;
switch (data_addr.su_family) {
case AF_INET:
@ -1587,14 +1593,20 @@ initconn(void)
/* FALLTHROUGH */
#ifdef INET6
case AF_INET6:
#endif
af = (data_addr.su_family == AF_INET) ? 1 : 2;
if (getnameinfo((struct sockaddr *)&data_addr.si_su,
data_addr.su_len, hname, sizeof(hname), NULL, 0,
NI_NUMERICHOST)) {
tmp = data_addr;
#ifdef INET6
if (tmp.su_family == AF_INET6)
tmp.si_su.su_sin6.sin6_scope_id = 0;
#endif
if (getnameinfo((struct sockaddr *)&tmp.si_su,
tmp.su_len, hname, sizeof(hname), sname,
sizeof(sname), NI_NUMERICHOST | NI_NUMERICSERV)) {
result = ERROR;
} else {
result = command("EPRT |%d|%s|%d|", af, hname,
ntohs(data_addr.su_port));
result = command("EPRT |%d|%s|%s|", af, hname,
sname);
if (!connected)
return (1);
if (result != COMPLETE) {
@ -1606,7 +1618,6 @@ initconn(void)
}
}
break;
#endif
default:
result = COMPLETE + 1;
break;

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
/* $NetBSD: ftp_var.h,v 1.58 2000/08/01 22:47:28 lukem Exp $ */
/* $NetBSD: ftp_var.h,v 1.62 2001/12/26 09:40:16 lukem Exp $ */
/*-
* Copyright (c) 1996-2000 The NetBSD Foundation, Inc.
* Copyright (c) 1996-2001 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@ -308,7 +308,9 @@ GLOBAL int macnum; /* number of defined macros */
GLOBAL struct macel macros[16];
GLOBAL char macbuf[4096];
GLOBAL char home[MAXPATHLEN]; /* home directory (for lcd) */
GLOBAL char *localhome; /* local home directory */
GLOBAL char *localname; /* local user name */
GLOBAL char netrc[MAXPATHLEN]; /* path to .netrc file */
GLOBAL char reply_string[BUFSIZ]; /* first line of previous reply */
GLOBAL void (*reply_callback)(const char *);
/*
@ -325,8 +327,6 @@ GLOBAL int data;
extern struct cmd cmdtab[];
extern struct option optiontab[];
extern char *__progname; /* from crt0.o */
#define EMPTYSTRING(x) ((x) == NULL || (*(x) == '\0'))
#define FREEPTR(x) if ((x) != NULL) { free(x); (x) = NULL; }
@ -344,6 +344,15 @@ extern char *__progname; /* from crt0.o */
# define ULLT unsigned long
# define STRTOLL(x,y,z) strtol(x,y,z)
#else
#if HAVE_PRINTF_QD
# define LLF "%qd"
# define LLFP(x) "%" x "qd"
# define LLT long long
# define ULLF "%qu"
# define ULLFP(x) "%" x "qu"
# define ULLT unsigned long long
# define STRTOLL(x,y,z) strtoll(x,y,z)
#else
# define LLF "%lld"
# define LLFP(x) "%" x "lld"
# define LLT long long
@ -352,3 +361,4 @@ extern char *__progname; /* from crt0.o */
# define ULLT unsigned long long
# define STRTOLL(x,y,z) strtoll(x,y,z)
#endif
#endif

View File

@ -1,7 +1,7 @@
/* $NetBSD: main.c,v 1.73 2000/07/18 07:16:56 lukem Exp $ */
/* $NetBSD: main.c,v 1.82 2002/06/05 13:51:54 lukem Exp $ */
/*-
* Copyright (c) 1996-2000 The NetBSD Foundation, Inc.
* Copyright (c) 1996-2002 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@ -112,8 +112,6 @@
#define NO_PROXY "no_proxy" /* env var with list of non-proxied
* hosts, comma or space separated */
char * __progname;
static void setupoption(char *, char *, char *);
int main(int, char *[]);
@ -121,15 +119,14 @@ int
main(int argc, char *argv[])
{
int ch, rval;
struct passwd *pw = NULL;
struct passwd *pw;
char *cp, *ep, *anonuser, *anonpass, *upload_path;
int dumbterm, s, len, isupload;
__progname = strrchr(argv[0], '/');
if (__progname == NULL)
__progname = argv[0];
else
__progname++;
#if 0 /* XXX */
setlocale(LC_ALL, "");
#endif
setprogname(argv[0]);
ftpport = "ftp";
httpport = "http";
@ -173,6 +170,11 @@ main(int argc, char *argv[])
reply_callback = NULL;
family = AF_UNSPEC;
netrc[0] = '\0';
cp = getenv("NETRC");
if (cp != NULL && strlcpy(netrc, cp, sizeof(netrc)) >= sizeof(netrc))
errx(1, "$NETRC `%s': %s", cp, strerror(ENAMETOOLONG));
/*
* Get the default socket buffer sizes if we don't already have them.
* It doesn't matter which socket we do this to, because on the first
@ -218,10 +220,10 @@ main(int argc, char *argv[])
warnx("unknown $FTPMODE '%s'; using defaults", cp);
}
if (strcmp(__progname, "pftp") == 0) {
if (strcmp(getprogname(), "pftp") == 0) {
passivemode = 1;
activefallback = 0;
} else if (strcmp(__progname, "gate-ftp") == 0)
} else if (strcmp(getprogname(), "gate-ftp") == 0)
gatemode = 1;
gateserver = getenv("FTPSERVER");
@ -256,14 +258,18 @@ main(int argc, char *argv[])
}
}
while ((ch = getopt(argc, argv, "46Aadefgino:pP:r:RtT:u:vV")) != -1) {
while ((ch = getopt(argc, argv, "46AadefginN:o:pP:r:RtT:u:vV")) != -1) {
switch (ch) {
case '4':
family = AF_INET;
break;
case '6':
#ifdef INET6
family = AF_INET6;
#else
warnx("INET6 support is not available; ignoring -6");
#endif
break;
case 'A':
@ -302,6 +308,13 @@ main(int argc, char *argv[])
autologin = 0;
break;
case 'N':
if (strlcpy(netrc, optarg, sizeof(netrc))
>= sizeof(netrc))
errx(1, "%s: %s", optarg,
strerror(ENAMETOOLONG));
break;
case 'o':
outfile = optarg;
if (strcmp(outfile, "-") == 0)
@ -387,21 +400,38 @@ main(int argc, char *argv[])
proxy = 0; /* proxy not active */
crflag = 1; /* strip c.r. on ascii gets */
sendport = -1; /* not using ports */
/*
* Set up the home directory in case we're globbing.
* Cache the user name and home directory.
*/
localhome = NULL;
localname = NULL;
anonuser = "anonymous";
cp = getenv("HOME");
if (! EMPTYSTRING(cp))
localhome = xstrdup(cp);
pw = NULL;
cp = getlogin();
if (cp != NULL)
pw = getpwnam(cp);
if (pw == NULL)
pw = getpwuid(getuid());
if (pw != NULL) {
(void)strlcpy(home, pw->pw_dir, sizeof(home));
anonuser = pw->pw_name;
} else {
(void)strlcpy(home, "/", sizeof(home));
anonuser = "anonymous";
if (localhome == NULL && !EMPTYSTRING(pw->pw_dir))
localhome = xstrdup(pw->pw_dir);
localname = xstrdup(pw->pw_name);
anonuser = localname;
}
if (netrc[0] == '\0' && localhome != NULL) {
if (strlcpy(netrc, localhome, sizeof(netrc)) >= sizeof(netrc) ||
strlcat(netrc, "/.netrc", sizeof(netrc)) >= sizeof(netrc)) {
warnx("%s/.netrc: %s", localhome,
strerror(ENAMETOOLONG));
netrc[0] = '\0';
}
}
if (localhome == NULL)
localhome = xstrdup("/");
/*
* Every anonymous FTP server I've encountered will accept the
@ -467,7 +497,8 @@ main(int argc, char *argv[])
user = host;
host = cp + 1;
}
xargv[0] = __progname;
/* XXX discards const */
xargv[0] = (char *)getprogname();
xargv[1] = host;
xargv[2] = argv[1];
xargv[3] = NULL;
@ -633,7 +664,7 @@ cmdscanner(void)
* such commands as invalid.
*/
if (strchr(margv[0], ':') != NULL ||
el_parse(el, margc, margv) != 0)
el_parse(el, margc, (const char **)margv) != 0)
#endif /* !NO_EDITCOMPLETE */
fputs("?Invalid command.\n", ttyout);
continue;
@ -643,6 +674,7 @@ cmdscanner(void)
continue;
}
confirmrest = 0;
margv[0] = c->c_name;
(*c->c_handler)(margc, margv);
if (bell && c->c_bell)
(void)putc('\007', ttyout);
@ -908,7 +940,7 @@ help(int argc, char *argv[])
cmd, arg);
else {
if (isusage) {
nargv[0] = arg;
nargv[0] = c->c_name;
(*c->c_handler)(0, nargv);
} else
fprintf(ttyout, "%-*s\t%s\n", HELPINDENT,
@ -964,11 +996,13 @@ setupoption(char *name, char *value, char *defaultvalue)
void
usage(void)
{
const char *progname = getprogname();
(void)fprintf(stderr,
"usage: %s [-46AadefginpRtvV] [-o outfile] [-P port] [-r retry]\n"
"usage: %s [-46AadefginpRtvV] [-N netrc] [-o outfile] [-P port] [-r retry]\n"
" [-T dir,max[,inc][[user@]host [port]]] [host:path[/]]\n"
" [file:///file] [ftp://[user[:pass]@]host[:port]/path[/]]\n"
" [http://[user[:pass]@]host[:port]/path] [...]\n"
" %s -u url file [...]\n", __progname, __progname);
" %s -u url file [...]\n", progname, progname);
exit(1);
}

View File

@ -1,4 +1,4 @@
/* $NetBSD: ruserpass.c,v 1.27 2000/07/18 06:47:02 lukem Exp $ */
/* $NetBSD: ruserpass.c,v 1.28 2000/11/15 00:11:04 lukem Exp $ */
/*
* Copyright (c) 1985, 1993, 1994
@ -66,25 +66,19 @@ static struct toktab {
int
ruserpass(const char *host, const char **aname, const char **apass,
const char **aacct)
const char **aacct)
{
char *hdir, buf[BUFSIZ], *tmp;
char *tmp;
char myname[MAXHOSTNAMELEN + 1], *mydomain;
int t, i, c, usedefault = 0;
struct stat stb;
hdir = getenv("HOME");
if (hdir == NULL)
hdir = ".";
if (strlcpy(buf, hdir, sizeof(buf)) >= sizeof(buf) ||
strlcat(buf, "/.netrc", sizeof(buf)) >= sizeof(buf)) {
warnx("%s/.netrc: %s", hdir, strerror(ENAMETOOLONG));
if (netrc[0] == '\0')
return (0);
}
cfile = fopen(buf, "r");
cfile = fopen(netrc, "r");
if (cfile == NULL) {
if (errno != ENOENT)
warn("%s", buf);
warn("%s", netrc);
return (0);
}
if (gethostname(myname, sizeof(myname)) < 0)

View File

@ -1,7 +1,7 @@
/* $NetBSD: util.c,v 1.102 2000/09/08 11:54:53 lukem Exp $ */
/* $NetBSD: util.c,v 1.107 2002/06/05 10:20:50 lukem Exp $ */
/*-
* Copyright (c) 1997-2000 The NetBSD Foundation, Inc.
* Copyright (c) 1997-2002 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@ -340,7 +340,6 @@ ftp_login(const char *host, const char *user, const char *pass)
{
char tmp[80];
const char *acct;
struct passwd *pw;
int n, aflag, rval, freeuser, freepass, freeacct;
acct = NULL;
@ -371,12 +370,8 @@ ftp_login(const char *host, const char *user, const char *pass)
}
while (user == NULL) {
const char *myname = getlogin();
if (myname == NULL && (pw = getpwuid(getuid())) != NULL)
myname = pw->pw_name;
if (myname)
fprintf(ttyout, "Name (%s:%s): ", host, myname);
if (localname)
fprintf(ttyout, "Name (%s:%s): ", host, localname);
else
fprintf(ttyout, "Name (%s): ", host);
*tmp = '\0';
@ -389,7 +384,7 @@ ftp_login(const char *host, const char *user, const char *pass)
tmp[strlen(tmp) - 1] = '\0';
freeuser = 0;
if (*tmp == '\0')
user = myname;
user = localname;
else
user = tmp;
}
@ -502,7 +497,7 @@ remglob(char *argv[], int doswitch, char **errbuf)
static char buf[MAXPATHLEN];
static FILE *ftemp = NULL;
static char **args;
int oldverbose, oldhash, fd, len;
int oldverbose, oldhash, oldprogress, fd, len;
char *cp, *mode;
if (!mflag || !connected) {
@ -536,7 +531,9 @@ remglob(char *argv[], int doswitch, char **errbuf)
oldverbose = verbose;
verbose = (errbuf != NULL) ? -1 : 0;
oldhash = hash;
oldprogress = progress;
hash = 0;
progress = 0;
if (doswitch)
pswitch(!proxy);
for (mode = "w"; *++argv != NULL; mode = "a")
@ -549,6 +546,7 @@ remglob(char *argv[], int doswitch, char **errbuf)
pswitch(!proxy);
verbose = oldverbose;
hash = oldhash;
progress = oldprogress;
ftemp = fopen(temp, "r");
(void)unlink(temp);
if (ftemp == NULL) {
@ -872,9 +870,9 @@ progressmeter(int flag)
lastsize = restart_point;
}
#ifndef NO_PROGRESS
len = 0;
if (!progress || filesize <= 0)
if (!progress)
return;
len = 0;
/*
* print progress bar only if we are foreground process.
@ -891,20 +889,23 @@ progressmeter(int flag)
wait.tv_sec = 0;
}
ratio = (int)((double)cursize * 100.0 / (double)filesize);
ratio = MAX(ratio, 0);
ratio = MIN(ratio, 100);
len += snprintf(buf + len, BUFLEFT, "\r%3d%% ", ratio);
len += snprintf(buf + len, BUFLEFT, "\r");
if (filesize > 0) {
ratio = (int)((double)cursize * 100.0 / (double)filesize);
ratio = MAX(ratio, 0);
ratio = MIN(ratio, 100);
len += snprintf(buf + len, BUFLEFT, "%3d%% ", ratio);
/*
* calculate the length of the `*' bar, ensuring that
* the number of stars won't exceed the buffer size
*/
barlength = MIN(sizeof(buf) - 1, ttywidth) - BAROVERHEAD;
if (barlength > 0) {
i = barlength * ratio / 100;
len += snprintf(buf + len, BUFLEFT,
"|%.*s%*s|", i, stars, barlength - i, "");
barlength = MIN(sizeof(buf) - 1, ttywidth) - BAROVERHEAD;
if (barlength > 0) {
i = barlength * ratio / 100;
len += snprintf(buf + len, BUFLEFT,
"|%.*s%*s|", i, stars, barlength - i, "");
}
}
abbrevsize = cursize;
@ -932,24 +933,39 @@ progressmeter(int flag)
(int)((bytespersec % 1024) * 100 / 1024),
prefixes[i]);
if (bytes <= 0 || elapsed <= 0.0 || cursize > filesize) {
len += snprintf(buf + len, BUFLEFT, " --:-- ETA");
} else if (wait.tv_sec >= STALLTIME) {
len += snprintf(buf + len, BUFLEFT, " - stalled -");
} else {
remaining = (int)
((filesize - restart_point) / (bytes / elapsed) - elapsed);
if (remaining >= 100 * SECSPERHOUR)
if (filesize > 0) {
if (bytes <= 0 || elapsed <= 0.0 || cursize > filesize) {
len += snprintf(buf + len, BUFLEFT, " --:-- ETA");
else {
i = remaining / SECSPERHOUR;
} else if (flag == 1) {
i = elapsed / SECSPERHOUR;
if (i)
len += snprintf(buf + len, BUFLEFT, "%2d:", i);
else
len += snprintf(buf + len, BUFLEFT, " ");
i = remaining % SECSPERHOUR;
i = (int)elapsed % SECSPERHOUR;
len += snprintf(buf + len, BUFLEFT,
"%02d:%02d ETA", i / 60, i % 60);
"%02d:%02d ", i / 60, i % 60);
} else if (wait.tv_sec >= STALLTIME) {
len += snprintf(buf + len, BUFLEFT, " - stalled -");
} else {
remaining = (int)
((filesize - restart_point) / (bytes / elapsed) -
elapsed);
if (remaining >= 100 * SECSPERHOUR)
len += snprintf(buf + len, BUFLEFT,
" --:-- ETA");
else {
i = remaining / SECSPERHOUR;
if (i)
len += snprintf(buf + len, BUFLEFT,
"%2d:", i);
else
len += snprintf(buf + len, BUFLEFT,
" ");
i = remaining % SECSPERHOUR;
len += snprintf(buf + len, BUFLEFT,
"%02d:%02d ETA", i / 60, i % 60);
}
}
}
if (flag == 1)
@ -1166,7 +1182,7 @@ controlediting(void)
HistEvent ev;
int editmode;
el = el_init(__progname, stdin, ttyout, stderr);
el = el_init(getprogname(), stdin, ttyout, stderr);
/* init editline */
hist = history_init(); /* init the builtin history */
history(hist, &ev, H_SETSIZE, 100);/* remember 100 events */

View File

@ -1,6 +1,6 @@
/* $NetBSD: version.h,v 1.21 2000/09/28 12:29:24 lukem Exp $ */
/* $NetBSD: version.h,v 1.29 2002/06/05 10:20:51 lukem Exp $ */
/*-
* Copyright (c) 1999, 2000 The NetBSD Foundation, Inc.
* Copyright (c) 1999-2002 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
@ -40,5 +40,5 @@
#endif
#ifndef FTP_VERSION
#define FTP_VERSION "20000928"
#define FTP_VERSION "20020605"
#endif

View File

@ -1,11 +1,21 @@
$Id: todo,v 1.25 2000/09/19 22:25:50 lukem Exp $
$Id: todo,v 1.30 2002/06/10 08:08:53 lukem Exp $
update NEWS, README, ...
at end of configure, show summary of options used and features found
if socks is defined, disable ipv6 and use own getaddrinfo()/getnameinfo()
(for tron)
add locale autoconf checks
AC_CHECK_SIZEOF(off_t, 0) doesn't work on FreeBSD 4.0 because the
test doesn't include <sys/types.h>. fix autoconf?
in configure, check for ansi c compiler and barf if it fails
check if we need #defines for memcpy() et al
we check for fparseln twice; once in libutil and once in general
check for utimes() decls [which system?]
possibly install editline.3 and editrc.5