Hi,

  I found another one.  In unattended mode, if the setup.ini download or
signature verification fails, we can loop forever trying again, because
there's no user to select a different mirror.  A parallel problem exists if we
try and install from a local package dir with no or a corrupt setup.ini file.
 The first case is worth retrying a few times, because it might just be a
network glitch; the second not.

  (Note that this all only kicks in if *all* the selected mirrors / local
package dir setup.ini files are invalid.)

        * threebar.cc (ThreeBarProgressPage::OnMessageApp): Don't loop forever
        retrying ini file download/parse if it errors in unattended mode.

  Ok?

    cheers,
      DaveK
Index: threebar.cc
===================================================================
RCS file: /cvs/cygwin-apps/setup/threebar.cc,v
retrieving revision 2.15
diff -p -u -r2.15 threebar.cc
--- threebar.cc	20 Jun 2009 21:54:22 -0000	2.15
+++ threebar.cc	22 Nov 2009 03:28:41 -0000
@@ -236,13 +236,33 @@ ThreeBarProgressPage::OnMessageApp (UINT
 	  {
 	    if (source == IDC_SOURCE_CWD)
 	      {
-		// There was a setup.ini file (as found by
-		// do_fromcwd), but it had parse errors.
+		// There was a setup.ini file (as found by do_fromcwd), but it
+		// had parse errors.  In unattended mode, don't retry even once,
+		// because we'll only loop forever.
+		if (unattended_mode)
+		  {
+		    log (LOG_PLAIN)
+			<< "can't install from bad local package dir"
+			<< endLog;
+		    exit_msg = IDS_INSTALL_INCOMPLETE;
+		    LogSingleton::GetInstance().exit (1);
+		  }
 		GetOwner ()->SetActivePageByID (IDD_SOURCE);
 	      }
 	    else
 	      {
-		// Download failed, try another site.
+		// Download failed, try another site; in unattended mode, retry
+		// the same site a few times in case it was a transient network
+		// glitch, but don't loop forever.
+		static int retries = 4;
+		if (unattended_mode && retries-- <= 0)
+		  {
+		    log (LOG_PLAIN)
+			<< "download/verify error in unattended_mode: out of retries"
+			<< endLog;
+		    exit_msg = IDS_INSTALL_INCOMPLETE;
+		    LogSingleton::GetInstance().exit (1);
+		  }
 		GetOwner ()->SetActivePageByID (IDD_SITE);
 	      }
 	  }

Reply via email to