I like this, but it's rather late in the release cycle to be adding
features to ftp(1), could you send a reminder when we're at 6.2-current?
(Also, if you haven't already done so, check that "make release" and the
installer still work).



On 2017/09/22 22:01, Jesper Wallin wrote:
> Hi all,
> 
> My morning routine consists of downloading the latest snapshot files and
> running the upgrade.  To avoid wasting bandwidth and time, I check the
> local modification time of INSTALL.amd64, fetch the remote one and check
> if the modification time has changed.
> 
> A few days ago, the mirror I use had issues with the ftpd.  I quickly
> switched the ftp:// to http:// and continued with my routine.  By doing
> so, I noticed that when running ftp(1) on ftp links, it does preserve
> the modification time.  But for http or https links, the modification
> time is ignored.
> 
> I noticed the 'preserve' option is enabled by default, even when using
> the auto-fetch feature.  I find this behaviour a bit inconsistent and
> unintuitive, seeing it won't let the user specify whether or not the
> preserve option should be enabled.  Yet, it behaves differently
> depending on what protocol we use to fetch the file.
> 
> The patch below will use the Last-Modified header in order to set the
> modification time for http or https links.  I also added, what to me
> looked like a missing "\n" on the error message in ftp.c.
> 
> An alternative solution might be to have the preserve option disabled
> by default when auto-fetching files.
> 
> 
> Jesper Wallin
> 
> 
> Index: fetch.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/ftp/fetch.c,v
> retrieving revision 1.163
> diff -u -p -r1.163 fetch.c
> --- fetch.c   7 Mar 2017 08:00:23 -0000       1.163
> +++ fetch.c   22 Sep 2017 19:52:49 -0000
> @@ -210,6 +210,7 @@ url_get(const char *origline, const char
>       int status;
>       int save_errno;
>       const size_t buflen = 128 * 1024;
> +     time_t mtime = -1;
>  
>       direction = "received";
>  
> @@ -860,6 +861,12 @@ noslash:
>                       if (restart_point)
>                               filesize += restart_point;
>  #endif /* !SMALL */
> +#define LASTMOD "Last-Modified: "
> +             } else if (strncasecmp(cp, LASTMOD, sizeof(LASTMOD) - 1) == 0) {
> +                     struct tm tm;
> +                     cp += sizeof(LASTMOD) - 1;
> +                     if (strptime(cp, "%a, %d %b %Y %T %z", &tm) != NULL)
> +                             mtime = mktime(&tm);
>  #define LOCATION "Location: "
>               } else if (isredirect &&
>                   strncasecmp(cp, LOCATION, sizeof(LOCATION) - 1) == 0) {
> @@ -1043,8 +1050,22 @@ cleanup_url_get:
>               fclose(fin);
>       else if (s != -1)
>               close(s);
> -     if (out >= 0 && out != fileno(stdout))
> +     if (out >= 0 && out != fileno(stdout)) {
> +
> +             if (mtime != -1) {
> +                     struct timeval tv[2];
> +                     tv[0].tv_sec = time(NULL);
> +                     tv[0].tv_usec = tv[1].tv_usec = 0;
> +                     tv[1].tv_sec = mtime;
> +
> +                     if (futimes(out, tv) == -1)
> +                             fprintf(ttyout,
> +                             "Can't change modification time on %s to %s\n",
> +                                 savefile, asctime(localtime(&mtime)));
> +             }
> +
>               close(out);
> +     }
>       free(buf);
>       free(proxyhost);
>       free(proxyurl);
> Index: ftp.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/ftp/ftp.c,v
> retrieving revision 1.100
> diff -u -p -r1.100 ftp.c
> --- ftp.c     22 Aug 2016 16:27:00 -0000      1.100
> +++ ftp.c     22 Sep 2017 19:52:50 -0000
> @@ -1217,7 +1217,7 @@ break2:
>                               ut.modtime = mtime;
>                               if (utime(local, &ut) == -1)
>                                       fprintf(ttyout,
> -                             "Can't change modification time on %s to %s",
> +                             "Can't change modification time on %s to %s\n",
>                                           local, asctime(localtime(&mtime)));
>                       }
>               }
> 

Reply via email to