Author: des
Date: Wed Oct 19 12:14:14 2011
New Revision: 226540
URL: http://svn.freebsd.org/changeset/base/226540

Log:
  MFH r225599,225800,225805: improve handling of resumed http transfers
  
  PR:           bin/117277

Modified:
  stable/8/usr.bin/fetch/fetch.c
Directory Properties:
  stable/8/usr.bin/fetch/   (props changed)

Modified: stable/8/usr.bin/fetch/fetch.c
==============================================================================
--- stable/8/usr.bin/fetch/fetch.c      Wed Oct 19 11:49:14 2011        
(r226539)
+++ stable/8/usr.bin/fetch/fetch.c      Wed Oct 19 12:14:14 2011        
(r226540)
@@ -522,6 +522,12 @@ fetch(char *URL, const char *path)
                                    "does not match remote", path);
                                goto failure_keep;
                        }
+               } else if (url->offset > sb.st_size) {
+                       /* gap between what we asked for and what we got */
+                       warnx("%s: gap in resume mode", URL);
+                       fclose(of);
+                       of = NULL;
+                       /* picked up again later */
                } else if (us.size != -1) {
                        if (us.size == sb.st_size)
                                /* nothing to do */
@@ -534,7 +540,7 @@ fetch(char *URL, const char *path)
                                goto failure;
                        }
                        /* we got it, open local file */
-                       if ((of = fopen(path, "a")) == NULL) {
+                       if ((of = fopen(path, "r+")) == NULL) {
                                warn("%s: fopen()", path);
                                goto failure;
                        }
@@ -551,8 +557,16 @@ fetch(char *URL, const char *path)
                                fclose(of);
                                of = NULL;
                                sb = nsb;
+                               /* picked up again later */
                        }
                }
+               /* seek to where we left off */
+               if (of != NULL && fseeko(of, url->offset, SEEK_SET) != 0) {
+                       warn("%s: fseeko()", path);
+                       fclose(of);
+                       of = NULL;
+                       /* picked up again later */
+               }
        } else if (m_flag && sb.st_size != -1) {
                /* mirror mode, local file exists */
                if (sb.st_size == us.size && sb.st_mtime == us.mtime)
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to