* preserve modtime if size is 0 [bin/3040, Enami Tsugutomo]
* in autofetch mode, don't retry a file if the connection failed - skip it and move to the next file. [bin/3051, Matt Green] * only print error messages from SIZE or MDTM if the user used 'size' or 'modt' (respectively). prevents extraneous warnings during normal transfers when connected to a site which doesn't support these (behaviour prior to last commit), but still allows error feedback to specific user requests for this info (which the last commit broke). * 'account': only accept one optional argument * if invoked as pftp, default to passive mode on (from FreeBSD) * remove leading '0 ' in progress bar - looked ugly * use warn instead of perror * use strncpy when src isn't known to have safe length * remglob(): use mkstemp() to prevent symlink games, and don't override _PATH_TMP, use it as the prefix to the temp file
This commit is contained in:
parent
ca69bed024
commit
e699917c51
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: cmds.c,v 1.12 1996/12/25 16:00:38 christos Exp $ */
|
||||
/* $NetBSD: cmds.c,v 1.13 1996/12/29 04:05:29 lukem Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1985, 1989, 1993, 1994
|
||||
@ -37,7 +37,7 @@
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)cmds.c 8.6 (Berkeley) 10/9/94";
|
||||
#else
|
||||
static char rcsid[] = "$NetBSD: cmds.c,v 1.12 1996/12/25 16:00:38 christos Exp $";
|
||||
static char rcsid[] = "$NetBSD: cmds.c,v 1.13 1996/12/29 04:05:29 lukem Exp $";
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
@ -658,7 +658,7 @@ usage:
|
||||
if (ret == 0) {
|
||||
time_t mtime;
|
||||
|
||||
mtime = remotemodtime(argv[1]);
|
||||
mtime = remotemodtime(argv[1], 0);
|
||||
if (mtime == -1)
|
||||
return(0);
|
||||
if (stbuf.st_mtime >= mtime)
|
||||
@ -760,7 +760,7 @@ remglob(argv, doswitch)
|
||||
char *argv[];
|
||||
int doswitch;
|
||||
{
|
||||
char temp[16];
|
||||
char temp[MAXPATHLEN];
|
||||
static char buf[MAXPATHLEN];
|
||||
static FILE *ftemp = NULL;
|
||||
static char **args;
|
||||
@ -787,14 +787,10 @@ remglob(argv, doswitch)
|
||||
return (cp);
|
||||
}
|
||||
if (ftemp == NULL) {
|
||||
(void) strcpy(temp, _PATH_TMP);
|
||||
(void) mktemp(temp);
|
||||
/* create a zero-length version of the file so that
|
||||
* people can't play symlink games.
|
||||
*/
|
||||
fd = open (temp, O_CREAT | O_EXCL | O_WRONLY, 600);
|
||||
(void) snprintf(temp, sizeof(temp), "%s%s", _PATH_TMP, TMPFILE);
|
||||
fd = mkstemp(temp);
|
||||
if (fd < 0) {
|
||||
printf("Temporary file %s already exists\n", temp);
|
||||
warn("unable to create temporary file %s", temp);
|
||||
return (NULL);
|
||||
}
|
||||
close(fd);
|
||||
@ -1335,7 +1331,7 @@ shell(argc, argv)
|
||||
{
|
||||
pid_t pid;
|
||||
sig_t old1, old2;
|
||||
char shellnam[40], *shell, *namep;
|
||||
char shellnam[MAXPATHLEN], *shell, *namep;
|
||||
union wait status;
|
||||
|
||||
old1 = signal (SIGINT, SIG_IGN);
|
||||
@ -1351,8 +1347,8 @@ shell(argc, argv)
|
||||
namep = strrchr(shell, '/');
|
||||
if (namep == NULL)
|
||||
namep = shell;
|
||||
(void) strcpy(shellnam, "-");
|
||||
(void) strcat(shellnam, ++namep);
|
||||
shellnam[0] = '-';
|
||||
(void) strncpy(shellnam + 1, ++namep, sizeof(shellnam) - 1);
|
||||
if (strcmp(namep, "sh") != 0)
|
||||
shellnam[0] = '+';
|
||||
if (debug) {
|
||||
@ -1558,13 +1554,14 @@ quote1(initial, argc, argv)
|
||||
int i, len;
|
||||
char buf[BUFSIZ]; /* must be >= sizeof(line) */
|
||||
|
||||
(void) strcpy(buf, initial);
|
||||
(void) strncpy(buf, initial, sizeof(buf));
|
||||
if (argc > 1) {
|
||||
len = strlen(buf);
|
||||
len += strlen(strcpy(&buf[len], argv[1]));
|
||||
len += strlen(strncpy(&buf[len], argv[1], sizeof(buf) - len));
|
||||
for (i = 2; i < argc; i++) {
|
||||
buf[len++] = ' ';
|
||||
len += strlen(strcpy(&buf[len], argv[i]));
|
||||
len += strlen(strncpy(&buf[len], argv[i],
|
||||
sizeof(buf) - len));
|
||||
}
|
||||
}
|
||||
if (command(buf) == PRELIM) {
|
||||
@ -1740,23 +1737,17 @@ account(argc, argv)
|
||||
int argc;
|
||||
char *argv[];
|
||||
{
|
||||
char acct[50], *ap;
|
||||
char *ap;
|
||||
|
||||
if (argc > 1) {
|
||||
++argv;
|
||||
--argc;
|
||||
(void) strncpy(acct, *argv, 49);
|
||||
acct[49] = '\0';
|
||||
while (argc > 1) {
|
||||
--argc;
|
||||
++argv;
|
||||
(void) strncat(acct, *argv, 49-strlen(acct));
|
||||
}
|
||||
ap = acct;
|
||||
if (argc > 2) {
|
||||
printf("usage: %s [password]\n", argv[0]);
|
||||
code = -1;
|
||||
return;
|
||||
}
|
||||
else {
|
||||
else if (argc == 2)
|
||||
ap = argv[1];
|
||||
else
|
||||
ap = getpass("Account:");
|
||||
}
|
||||
(void) command("ACCT %s", ap);
|
||||
}
|
||||
|
||||
@ -2245,8 +2236,9 @@ macdef(argc, argv)
|
||||
* determine size of remote file
|
||||
*/
|
||||
off_t
|
||||
remotesize(file)
|
||||
remotesize(file, noisy)
|
||||
const char *file;
|
||||
int noisy;
|
||||
{
|
||||
int overbose;
|
||||
off_t size;
|
||||
@ -2257,7 +2249,7 @@ remotesize(file)
|
||||
verbose = -1;
|
||||
if (command("SIZE %s", file) == COMPLETE)
|
||||
sscanf(reply_string, "%*s %qd", &size);
|
||||
else if (debug != 0)
|
||||
else if (noisy && debug == 0)
|
||||
printf("%s\n", reply_string);
|
||||
verbose = overbose;
|
||||
return (size);
|
||||
@ -2278,7 +2270,7 @@ sizecmd(argc, argv)
|
||||
code = -1;
|
||||
return;
|
||||
}
|
||||
size = remotesize(argv[1]);
|
||||
size = remotesize(argv[1], 1);
|
||||
if (size != -1)
|
||||
printf("%s\t%qd\n", argv[1], size);
|
||||
code = size;
|
||||
@ -2288,8 +2280,9 @@ sizecmd(argc, argv)
|
||||
* determine last modification time (in GMT) of remote file
|
||||
*/
|
||||
time_t
|
||||
remotemodtime(file)
|
||||
remotemodtime(file, noisy)
|
||||
const char *file;
|
||||
int noisy;
|
||||
{
|
||||
int overbose;
|
||||
time_t rtime;
|
||||
@ -2312,11 +2305,11 @@ remotemodtime(file)
|
||||
timebuf.tm_year = yy - 1900;
|
||||
timebuf.tm_isdst = -1;
|
||||
rtime = mktime(&timebuf);
|
||||
if (rtime == -1)
|
||||
if (rtime == -1 && (noisy || debug != 0))
|
||||
printf("Can't convert %s to a time\n", reply_string);
|
||||
else
|
||||
rtime += timebuf.tm_gmtoff; /* conv. local -> GMT */
|
||||
} else if (debug != 0)
|
||||
} else if (noisy && debug == 0)
|
||||
printf("%s\n", reply_string);
|
||||
verbose = overbose;
|
||||
return(rtime);
|
||||
@ -2337,7 +2330,7 @@ modtime(argc, argv)
|
||||
code = -1;
|
||||
return;
|
||||
}
|
||||
mtime = remotemodtime(argv[1]);
|
||||
mtime = remotemodtime(argv[1], 1);
|
||||
if (mtime != -1)
|
||||
printf("%s\t%s", argv[1], asctime(localtime(&mtime)));
|
||||
code = mtime;
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: extern.h,v 1.7 1996/12/06 02:06:48 lukem Exp $ */
|
||||
/* $NetBSD: extern.h,v 1.8 1996/12/29 04:05:30 lukem Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1994 The Regents of the University of California.
|
||||
@ -106,8 +106,8 @@ void recvrequest __P((const char *, const char *, const char *,
|
||||
const char *, int));
|
||||
void reget __P((int, char **));
|
||||
char *remglob __P((char **, int));
|
||||
off_t remotesize __P((const char *));
|
||||
time_t remotemodtime __P((const char *));
|
||||
off_t remotesize __P((const char *, int));
|
||||
time_t remotemodtime __P((const char *, int));
|
||||
void removedir __P((int, char **));
|
||||
void renamefile __P((int, char **));
|
||||
void reset __P((int, char **));
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: ftp.c,v 1.18 1996/12/25 16:02:06 christos Exp $ */
|
||||
/* $NetBSD: ftp.c,v 1.19 1996/12/29 04:05:31 lukem Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1985, 1989, 1993, 1994
|
||||
@ -37,7 +37,7 @@
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)ftp.c 8.6 (Berkeley) 10/27/94";
|
||||
#else
|
||||
static char rcsid[] = "$NetBSD: ftp.c,v 1.18 1996/12/25 16:02:06 christos Exp $";
|
||||
static char rcsid[] = "$NetBSD: ftp.c,v 1.19 1996/12/29 04:05:31 lukem Exp $";
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
@ -875,7 +875,7 @@ recvrequest(cmd, local, remote, lmode, printnames)
|
||||
} else {
|
||||
if (curtype != type)
|
||||
changetype(type, 0);
|
||||
filesize = remotesize(remote);
|
||||
filesize = remotesize(remote, 0);
|
||||
}
|
||||
if (initconn()) {
|
||||
(void) signal(SIGINT, oldintr);
|
||||
@ -1061,10 +1061,11 @@ break2:
|
||||
(void) signal(SIGPIPE, oldintp);
|
||||
(void) fclose(din);
|
||||
(void) getreply(0);
|
||||
if (bytes > 0 && is_retr) {
|
||||
ptransfer(0);
|
||||
if (bytes >= 0 && is_retr) {
|
||||
if (bytes > 0)
|
||||
ptransfer(0);
|
||||
if (preserve && (closefunc == fclose)) {
|
||||
mtime = remotemodtime(remote);
|
||||
mtime = remotemodtime(remote, 0);
|
||||
if (mtime != -1) {
|
||||
(void) gettimeofday(&tval[0],
|
||||
(struct timezone *)0);
|
||||
@ -1124,13 +1125,13 @@ initconn()
|
||||
if (passivemode) {
|
||||
data = socket(AF_INET, SOCK_STREAM, 0);
|
||||
if (data < 0) {
|
||||
perror("ftp: socket");
|
||||
warn("socket");
|
||||
return(1);
|
||||
}
|
||||
if ((options & SO_DEBUG) &&
|
||||
setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *)&on,
|
||||
sizeof (on)) < 0)
|
||||
perror("ftp: setsockopt (ignored)");
|
||||
warn("setsockopt (ignored)");
|
||||
if (command("PASV") != COMPLETE) {
|
||||
printf("Passive mode refused.\n");
|
||||
goto bad;
|
||||
@ -1164,14 +1165,14 @@ initconn()
|
||||
|
||||
if (connect(data, (struct sockaddr *)&data_addr,
|
||||
sizeof(data_addr)) < 0) {
|
||||
perror("ftp: connect");
|
||||
warn("connect");
|
||||
goto bad;
|
||||
}
|
||||
#ifdef IP_TOS
|
||||
on = IPTOS_THROUGHPUT;
|
||||
if (setsockopt(data, IPPROTO_IP, IP_TOS, (char *)&on,
|
||||
sizeof(int)) < 0)
|
||||
perror("ftp: setsockopt TOS (ignored)");
|
||||
warn("setsockopt TOS (ignored)");
|
||||
#endif
|
||||
return(0);
|
||||
}
|
||||
@ -1303,9 +1304,9 @@ progressmeter(flag)
|
||||
ratio = cursize * 100 / filesize;
|
||||
ratio = MAX(ratio, 0);
|
||||
ratio = MIN(ratio, 100);
|
||||
printf("\r%3d%% 0 ", ratio);
|
||||
printf("\r%3d%% ", ratio);
|
||||
|
||||
barlength = ttywidth - 30;
|
||||
barlength = ttywidth - 32;
|
||||
if (barlength > 0) {
|
||||
i = barlength * ratio / 100;
|
||||
printf("%.*s%*s", i,
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: main.c,v 1.14 1996/12/06 02:06:52 lukem Exp $ */
|
||||
/* $NetBSD: main.c,v 1.15 1996/12/29 04:05:32 lukem Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1985, 1989, 1993, 1994
|
||||
@ -43,7 +43,7 @@ static char copyright[] =
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)main.c 8.6 (Berkeley) 10/9/94";
|
||||
#else
|
||||
static char rcsid[] = "$NetBSD: main.c,v 1.14 1996/12/06 02:06:52 lukem Exp $";
|
||||
static char rcsid[] = "$NetBSD: main.c,v 1.15 1996/12/29 04:05:32 lukem Exp $";
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
@ -93,6 +93,11 @@ main(argc, argv)
|
||||
preserve = 1;
|
||||
mark = HASHBYTES;
|
||||
|
||||
cp = strrchr(argv[0], '/');
|
||||
cp = (cp == NULL) ? argv[0] : cp + 1;
|
||||
if (strcmp(cp, "pftp") == 0)
|
||||
passivemode = 1;
|
||||
|
||||
while ((ch = getopt(argc, argv, "adginpP:tv")) != EOF) {
|
||||
switch (ch) {
|
||||
case 'a':
|
||||
@ -586,7 +591,7 @@ auto_fetch(argc, argv)
|
||||
/*
|
||||
* Loop through as long as there's files to fetch.
|
||||
*/
|
||||
while (argc > 0 && strchr(argv[0], ':') != NULL) {
|
||||
for ( ; argc > 0 && strchr(argv[0], ':') != NULL ; --argc, argv++) {
|
||||
host = dir = file = portnum = NULL;
|
||||
|
||||
/*
|
||||
@ -673,8 +678,6 @@ auto_fetch(argc, argv)
|
||||
|
||||
disconnect(0, NULL);
|
||||
free(host);
|
||||
|
||||
--argc, ++argv;
|
||||
}
|
||||
|
||||
return (rval);
|
||||
|
@ -1,4 +1,4 @@
|
||||
/* $NetBSD: pathnames.h,v 1.5 1995/09/08 01:06:40 tls Exp $ */
|
||||
/* $NetBSD: pathnames.h,v 1.6 1996/12/29 04:05:32 lukem Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1989, 1993
|
||||
@ -37,5 +37,4 @@
|
||||
|
||||
#include <paths.h>
|
||||
|
||||
#undef _PATH_TMP
|
||||
#define _PATH_TMP "/tmp/ftpXXXXXX"
|
||||
#define TMPFILE "ftpXXXXXX"
|
||||
|
Loading…
Reference in New Issue
Block a user