]> git.saurik.com Git - apt.git/blobdiff - apt-pkg/indexcopy.cc
Sync with Michael
[apt.git] / apt-pkg / indexcopy.cc
index 4b6ac5ce09fa645f14f368f55efaf32f7c1dc69c..1f65062f7c2e29757d08c195ca9500557ffe8bcf 100644 (file)
@@ -593,17 +593,45 @@ bool SigVerify::CopyAndVerify(string CDROM,string Name,vector<string> &SigList,
 
       // verify the gpg signature of "Release"
       // gpg --verify "*I+Release.gpg", "*I+Release"
+      const char *Args[400];
+      unsigned int i = 0;
+
       string gpgvpath = _config->Find("Dir::Bin::gpg", "/usr/bin/gpgv");
       string pubringpath = _config->Find("Apt::GPGV::TrustedKeyring", "/etc/apt/trusted.gpg");
+      string releasegpg = *I+"Release.gpg";
+      string release = *I+"Release";
+
+      Args[i++] = gpgvpath.c_str();
+      Args[i++] = "--keyring";
+      Args[i++] = pubringpath.c_str();
+      Configuration::Item const *Opts;
+      Opts = _config->Tree("Acquire::gpgv::Options");
+      if (Opts != 0)
+      {
+         Opts = Opts->Child;
+        for (; Opts != 0; Opts = Opts->Next)
+         {
+            if (Opts->Value.empty() == true)
+               continue;
+            Args[i++] = Opts->Value.c_str();
+           if(i >= 390) { 
+              _error->Error("Argument list from Acquire::gpgv::Options too long. Exiting.");
+              return false;
+           }
+         }
+      }
+      
+      Args[i++] = releasegpg.c_str();
+      Args[i++] = release.c_str();
+      Args[i++] = NULL;
+      
       pid_t pid = ExecFork();
       if(pid < 0) {
         _error->Error("Fork failed");
         return false;
       }
       if(pid == 0) {
-        execlp(gpgvpath.c_str(), gpgvpath.c_str(), "--keyring", 
-               pubringpath.c_str(), string(*I+"Release.gpg").c_str(), 
-               string(*I+"Release").c_str(), NULL);
+        execvp(gpgvpath.c_str(), (char**)Args);
       }
       if(!ExecWait(pid, "gpgv")) {
         _error->Warning("Signature verification failed for: %s",