Update
This commit is contained in:
parent
5d9b1b20cb
commit
9b786fc227
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/vendor/ncftp/dist/; revision=5216 svn path=/vendor/ncftp/1.9.0/; revision=5218; tag=vendor/ncftp/1.9.0
@ -36,14 +36,12 @@
|
||||
#include "copyright.h"
|
||||
|
||||
/* cmds.c globals */
|
||||
#ifdef PASSIVEMODE
|
||||
int passivemode; /* no reverse FTP connections */
|
||||
#endif
|
||||
int curtype; /* file transfer type */
|
||||
char *typeabbrs = "abiet";
|
||||
str32 curtypename; /* name of file transfer type */
|
||||
int verbose; /* verbosity level of output */
|
||||
int mprompt; /* interactively prompt on m* cmds */
|
||||
int passivemode; /* no reverse FTP connections */
|
||||
int debug; /* debugging level */
|
||||
int options; /* used during socket creation */
|
||||
int macnum; /* number of defined macros */
|
||||
@ -52,7 +50,9 @@ int creating = 0;
|
||||
struct macel macros[MAXMACROS];
|
||||
char *macbuf; /* holds ALL macros */
|
||||
int doingInitMacro = 0; /* TRUE if executing "init" macro. */
|
||||
static char pad1a[8] = "Pad 1a";
|
||||
jmp_buf jabort;
|
||||
static char pad1b[8] = "Pad 1b";
|
||||
char *mname; /* name of current m* command */
|
||||
int activemcmd; /* flag: if != 0, then active multi command */
|
||||
int warnNoLSFlagsWithWildcards = 0;
|
||||
@ -2059,9 +2059,6 @@ int show_version(int argc, char **argv)
|
||||
#ifdef NET_ERRNO_H
|
||||
DStrs[nDStrs++] = "NET_ERRNO_H";
|
||||
#endif
|
||||
#ifdef PASSIVEMODE
|
||||
DStrs[nDStrs++] = "PASSIVEMODE";
|
||||
#endif
|
||||
|
||||
|
||||
/* DONE with #ifdefs for now! */
|
||||
@ -2215,14 +2212,12 @@ int unimpl(int argc, char **argv)
|
||||
return (NOERR);
|
||||
} /* unimpl */
|
||||
|
||||
#ifdef PASSIVEMODE
|
||||
int setpassive(int argc, char **argv)
|
||||
{
|
||||
passivemode = !passivemode;
|
||||
printf( "Passive mode %s.\n", (passivemode ? "ON" : "OFF") );
|
||||
return NOERR;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/* eof cmds.c */
|
||||
|
@ -121,9 +121,7 @@ int unimpl(int argc, char **argv);
|
||||
long GetDateSizeFromLSLine(char *fName, unsigned long *mod_time);
|
||||
long GetDateAndSize(char *fName, unsigned long *mod_time);
|
||||
int SetTypeByNumber(int i);
|
||||
#ifdef PASSIVEMODE
|
||||
int setpassive(int argc, char **argv);
|
||||
#endif
|
||||
|
||||
|
||||
/* In util.c: */
|
||||
|
@ -90,10 +90,7 @@ Examples:\n\
|
||||
#define PAGEHELP "view a file on the remote host with your $PAGER"
|
||||
#define PAGEUSAGE REMOTEFILE
|
||||
|
||||
#ifdef PASSIVEMODE
|
||||
#define PASSIVEHELP "enter passive transfer mode"
|
||||
#endif
|
||||
|
||||
|
||||
#define PDIRUSAGE " [flags] [remote-files]"
|
||||
|
||||
@ -191,9 +188,7 @@ struct cmd cmdtab[] = {
|
||||
{ "ntrans", 0, 1, unimpl, UNIMPLHELP, UNIMPLUSAGE },
|
||||
{ "open", 0, 0, cmdOpen, OPENHELP, OPENUSAGE },
|
||||
{ "p", 1, 1, get, PAGEHELP, PAGEUSAGE },
|
||||
#ifdef PASSIVEMODE
|
||||
{ "passive", 0, 0, setpassive, PASSIVEHELP, EMPTYSTR },
|
||||
#endif
|
||||
{ "page", 1, 0, get, PAGEHELP, PAGEUSAGE },
|
||||
{ "pdir", 1, 0, ls,
|
||||
"view a remote directory listing (long mode) with your $PAGER",
|
||||
|
@ -44,10 +44,6 @@
|
||||
#define dMPROMPT 0
|
||||
#endif
|
||||
|
||||
#ifndef PASSIVEMODE
|
||||
#define PASSIVEMODE 1
|
||||
#endif
|
||||
|
||||
/* If passive FTP can be used, this specifies whether it is turned on
|
||||
* by default. If not, we have passive mode available, but are using
|
||||
* Port ftp by default.
|
||||
|
@ -64,10 +64,15 @@ int abrtflag = 0;
|
||||
struct sockaddr_in myctladdr;
|
||||
FILE *cin = NULL, *cout = NULL;
|
||||
char *reply_string = NULL;
|
||||
jmp_buf sendabort, recvabort;
|
||||
static char pad3a[8] = "Pad 3a"; /* For SunOS :-( */
|
||||
jmp_buf sendabort;
|
||||
static char pad3b[8] = "Pad 3b";
|
||||
jmp_buf recvabort;
|
||||
static char pad3c[8] = "Pad 3c";
|
||||
int progress_meter = dPROGRESS;
|
||||
int cur_progress_meter;
|
||||
int sendport = -1; /* use PORT cmd for each data connection */
|
||||
int using_pasv;
|
||||
int code; /* return/reply code for ftp command */
|
||||
string indataline;
|
||||
int cpend; /* flag: if != 0, then pending server reply */
|
||||
@ -99,9 +104,7 @@ extern struct userinfo uinfo;
|
||||
extern struct macel macros[];
|
||||
extern struct lslist *lshead, *lstail;
|
||||
extern int is_ls;
|
||||
#ifdef PASSIVEMODE
|
||||
extern int passivemode;
|
||||
#endif
|
||||
|
||||
#ifdef GATEWAY
|
||||
extern string gateway;
|
||||
@ -244,6 +247,7 @@ int hookup(char *host, unsigned int port)
|
||||
#endif /* SO_OOBINLINE */
|
||||
|
||||
hErr = 0;
|
||||
using_pasv = passivemode; /* Re-init for each new connection. */
|
||||
goto done;
|
||||
|
||||
bad:
|
||||
@ -564,6 +568,8 @@ int getreply(int expecteof)
|
||||
} /* end for(;;) #2 */
|
||||
|
||||
*cp = '\0';
|
||||
dbprintf("rsp: %s", reply_string);
|
||||
|
||||
switch (verbose) {
|
||||
case V_QUIET:
|
||||
/* Don't print anything. */
|
||||
@ -1693,15 +1699,38 @@ int initconn(void)
|
||||
int on = 1, rval;
|
||||
string str;
|
||||
Sig_t oldintr;
|
||||
#ifdef PASSIVEMODE
|
||||
char *cp;
|
||||
int a1, a2, a3, a4, p1, p2;
|
||||
unsigned char n[6];
|
||||
#endif
|
||||
|
||||
oldintr = Signal(SIGINT, SIG_IGN);
|
||||
|
||||
#ifdef PASSIVEMODE
|
||||
if (passivemode) {
|
||||
if (using_pasv) {
|
||||
result = command("PASV");
|
||||
if (result != COMPLETE) {
|
||||
printf("Passive mode refused.\n");
|
||||
using_pasv = 0;
|
||||
goto TryPort;
|
||||
}
|
||||
|
||||
/*
|
||||
* What we've got here is a string of comma separated one-byte
|
||||
* unsigned integer values. The first four are the IP address,
|
||||
* the fifth is the MSB of the port address, and the sixth is the
|
||||
* LSB of the port address. Extract this data and prepare a
|
||||
* 'data_addr' (struct sockaddr_in).
|
||||
*/
|
||||
for (cp = reply_string + 4; *cp != '\0'; cp++)
|
||||
if (isdigit(*cp))
|
||||
break;
|
||||
|
||||
if (sscanf(cp, "%d,%d,%d,%d,%d,%d",
|
||||
&a1, &a2, &a3, &a4, &p1, &p2) != 6) {
|
||||
printf("Cannot parse PASV response: %s\n", reply_string);
|
||||
using_pasv = 0;
|
||||
goto TryPort;
|
||||
}
|
||||
|
||||
data = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (data < 0) {
|
||||
PERROR("initconn", "socket");
|
||||
@ -1712,25 +1741,7 @@ int initconn(void)
|
||||
setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on, sizeof(on)) < 0 ) {
|
||||
PERROR("initconn", "setscokopt (ignored)");
|
||||
}
|
||||
result = command("PASV");
|
||||
if (result != COMPLETE) {
|
||||
printf("Passive mode refused.\n");
|
||||
rval = 1;
|
||||
goto Return;
|
||||
}
|
||||
/*
|
||||
* What we've got here is a string of comma separated one-byte
|
||||
* unsigned integer values. The first four are the IP address,
|
||||
* the fifth is the MSB of the port address, and the sixth is the
|
||||
* LSB of the port address. Extract this data and prepare a
|
||||
* 'data_addr' (struct sockaddr_in).
|
||||
*/
|
||||
if (sscanf(reply_string+27, "%d,%d,%d,%d,%d,%d",
|
||||
&a1, &a2, &a3, &a4, &p1, &p2) != 6) {
|
||||
printf("Cannot parse PASV response: %s\n", reply_string);
|
||||
rval = 1;
|
||||
goto Return;
|
||||
}
|
||||
|
||||
n[0] = (unsigned char) a1;
|
||||
n[1] = (unsigned char) a2;
|
||||
n[2] = (unsigned char) a3;
|
||||
@ -1743,6 +1754,14 @@ int initconn(void)
|
||||
bcopy( (void *)&n[4], (void *)&data_addr.sin_port, 2 );
|
||||
|
||||
if (Connect( data, &data_addr, sizeof(data_addr) ) < 0 ) {
|
||||
if (errno == ECONNREFUSED) {
|
||||
dbprintf("Could not connect to port specified by server;\n");
|
||||
dbprintf("Falling back to PORT mode.\n");
|
||||
close(data);
|
||||
data = -1;
|
||||
using_pasv = 0;
|
||||
goto TryPort;
|
||||
}
|
||||
PERROR("initconn", "connect");
|
||||
rval = 1;
|
||||
goto Return;
|
||||
@ -1750,7 +1769,9 @@ int initconn(void)
|
||||
rval = 0;
|
||||
goto Return;
|
||||
}
|
||||
#endif
|
||||
|
||||
TryPort:
|
||||
rval = 0;
|
||||
|
||||
noport:
|
||||
data_addr = myctladdr;
|
||||
@ -1765,11 +1786,13 @@ int initconn(void)
|
||||
sendport = 1;
|
||||
rval = 1; goto Return;
|
||||
}
|
||||
|
||||
if (!sendport)
|
||||
if (setsockopt(data, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof (on)) < 0) {
|
||||
PERROR("initconn", "setsockopt (reuse address)");
|
||||
goto bad;
|
||||
}
|
||||
|
||||
#ifdef SOCKS
|
||||
if (Rbind(data, (struct sockaddr *)&data_addr, sizeof (data_addr), hisctladdr.sin_addr.s_addr) < 0) {
|
||||
#else
|
||||
@ -1859,10 +1882,8 @@ dataconn(char *mode)
|
||||
#ifdef SOCKS
|
||||
s = Raccept(data, (struct sockaddr *) &from, &fromlen);
|
||||
#else
|
||||
#ifdef PASSIVEMODE
|
||||
if (passivemode)
|
||||
if (using_pasv)
|
||||
return( fdopen( data, mode ));
|
||||
#endif
|
||||
s = Accept(data, &from, &fromlen);
|
||||
#endif
|
||||
if (s < 0) {
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
#define _main_c_
|
||||
|
||||
#define FTP_VERSION "1.8.7 (December 11, 1994)"
|
||||
#define FTP_VERSION "1.9.0 (December 22, 1994)"
|
||||
|
||||
/* #define BETA 1 */ /* If defined, it prints a little warning message. */
|
||||
|
||||
@ -46,7 +46,9 @@ int toatty; /* output is to a terminal */
|
||||
int doing_script; /* is a file being <redirected to me? */
|
||||
char *altarg; /* argv[1] with no shell-like preprocessing */
|
||||
struct servent serv; /* service spec for tcp/ftp */
|
||||
static char pad2a[8] = "Pad 2a"; /* SunOS overwrites jmp_bufs... */
|
||||
jmp_buf toplevel; /* non-local goto stuff for cmd scanner */
|
||||
static char pad2b[8] = "Pad 2b";
|
||||
char *line; /* input line buffer */
|
||||
char *stringbase; /* current scan point in line buffer */
|
||||
char *argbuf; /* argument storage buffer */
|
||||
@ -391,7 +393,7 @@ For testing purposes only. Do not re-distribute or subject to novice users."
|
||||
(void) Signal(SIGPIPE, lostpeer);
|
||||
}
|
||||
for (;;) {
|
||||
if (cmdscanner(top))
|
||||
if (cmdscanner(top) && !fromatty)
|
||||
exit(1);
|
||||
top = 1;
|
||||
}
|
||||
|
@ -1,6 +1,18 @@
|
||||
v1.9.0 - December 22, 1994. The program won't exit from the interactive shell
|
||||
if it's working from a tty. For example, it won't exit if you do an mget
|
||||
on a pattern that won't match anything. Added padding around jmp_buf's
|
||||
for SunOS. SunOS needs sigjmp_buf's, but plenty of OS's don't support
|
||||
sigjmp_buf's yet. Fixed the tips to reflect the new archive site.
|
||||
|
||||
v1.8.9 - December 20, 1994. Can now set "passive" user variable, or use
|
||||
passive command to toggle PASV/PORT ftp. Debug mode now prints remote
|
||||
responses. Can now get around buggy FTP servers like boombox.micro.umn.edu,
|
||||
that give back invalid port numbers to PASV.
|
||||
|
||||
v1.8.8 - December 19, 1994. Now falls back to port FTP if passive FTP fails.
|
||||
|
||||
v1.8.7 - December 11, 1994. Tweaks for FreeBSD. Passive mode enabled and
|
||||
turned on by default. This should be the last version of ncftp before
|
||||
version 2.
|
||||
turned on by default.
|
||||
|
||||
v1.8.6 - October 30, 1994. Tweaks for Solaris in sys.h.
|
||||
|
||||
|
@ -47,7 +47,7 @@ extern FILE *logf;
|
||||
extern longstring rcname, logfname, lcwd;
|
||||
extern int auto_binary, ansi_escapes, debug;
|
||||
extern int mprompt, remote_is_unix, verbose;
|
||||
extern int startup_msg, anon_open;
|
||||
extern int startup_msg, anon_open, passivemode;
|
||||
#ifndef NO_TIPS
|
||||
extern int tips;
|
||||
#endif
|
||||
@ -77,6 +77,7 @@ struct var vars[] = {
|
||||
VARENTRY("logsize", LONG, 0, &logsize, NULL),
|
||||
VARENTRY("mprompt", BOOL, 0, &mprompt, NULL),
|
||||
VARENTRY("netrc", -STR, 0, rcname, NULL),
|
||||
VARENTRY("passive", BOOL, 0, &passivemode, NULL),
|
||||
VARENTRY("pager", STR, 0, pager + 1, set_pager),
|
||||
VARENTRY("prompt", STR, 0, prompt, set_prompt),
|
||||
VARENTRY("progress-reports",INT, 0, &progress_meter,NULL),
|
||||
|
@ -89,8 +89,8 @@ static char *tiplist[] = {
|
||||
and/or use EMACS-style (or maybe VI-style) commands to edit the line.",
|
||||
#endif
|
||||
|
||||
"You can get the newest version of NcFTP from cse.unl.edu, in the\n\
|
||||
/pub/mgleason/ncftp directory, AFTER business hours.",
|
||||
"You can get the newest version of NcFTP from ftp.cs.unl.edu, in the\n\
|
||||
/pub/ncftp directory, AFTER business hours.",
|
||||
|
||||
"The type of progress-meter that will be used depends if the remote host\n\
|
||||
supports the SIZE command, and whether your terminal is capable of ANSI\n\
|
||||
@ -105,8 +105,8 @@ static char *tiplist[] = {
|
||||
the rc file, while still letting you use sitename abbreviations.",
|
||||
|
||||
"You can use World Wide Web style paths instead of colon-mode paths.\n\
|
||||
For example, if the colon-mode path was 'cse.unl.edu:pub/mgleason/ncftp',\n\
|
||||
the WWW-style path would be 'ftp://cse.unl.edu/pub/mgleason/ncftp'.",
|
||||
For example, if the colon-mode path was 'ftp.cs.unl.edu:pub/ncftp',\n\
|
||||
the WWW-style path would be 'ftp://ftp.cs.unl.edu/pub/ncftp'.",
|
||||
|
||||
"Sick and tired of these tips? Put '#unset tips' in your .ncftprc."
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user