svn commit: r226540 - stable/8/usr.bin/fetch

Dag-Erling Smorgrav des at FreeBSD.org
Wed Oct 19 12:14:15 UTC 2011


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)


More information about the svn-src-stable-8 mailing list