Просмотр исходного кода

More SHA-1 prep
Author: jgg
Date: 2001-03-06 07:15:29 GMT
More SHA-1 prep

Arch Librarian лет назад: 22
Родитель
Сommit
63b1700fd9
12 измененных файлов с 187 добавлено и 64 удалено
  1. 43 0
      apt-pkg/contrib/hashes.cc
  2. 41 0
      apt-pkg/contrib/hashes.h
  3. 3 3
      apt-pkg/init.h
  4. 5 4
      apt-pkg/makefile
  5. 1 0
      debian/changelog
  6. 9 9
      methods/ftp.cc
  7. 3 3
      methods/ftp.h
  8. 55 18
      methods/gzip.cc
  9. 13 13
      methods/http.cc
  10. 3 3
      methods/http.h
  11. 7 7
      methods/rsh.cc
  12. 4 4
      methods/rsh.h

+ 43 - 0
apt-pkg/contrib/hashes.cc

@@ -0,0 +1,43 @@
+// -*- mode: cpp; mode: fold -*-
+// Description								/*{{{*/
+// $Id: hashes.cc,v 1.1 2001/03/06 07:15:29 jgg Exp $
+/* ######################################################################
+
+   Hashes - Simple wrapper around the hash functions
+   
+   This is just used to make building the methods simpler, this is the
+   only interface required..
+   
+   ##################################################################### */
+									/*}}}*/
+// Include Files							/*{{{*/
+#ifdef __GNUG__
+#pragma implementation "apt-pkg/hashes.h"
+#endif
+
+#include <apt-pkg/hashes.h>
+    
+#include <unistd.h>    
+#include <system.h>    
+									/*}}}*/
+
+// Hashes::AddFD - Add the contents of the FD				/*{{{*/
+// ---------------------------------------------------------------------
+/* */
+bool Hashes::AddFD(int Fd,unsigned long Size)
+{
+   unsigned char Buf[64*64];
+   int Res = 0;
+   while (Size != 0)
+   {
+      Res = read(Fd,Buf,MIN(Size,sizeof(Buf)));
+      if (Res < 0 || (unsigned)Res != MIN(Size,sizeof(Buf)))
+	 return false;
+      Size -= Res;
+      MD5.Add(Buf,Res);
+      SHA1.Add(Buf,Res);
+   }
+   return true;
+}
+									/*}}}*/
+

+ 41 - 0
apt-pkg/contrib/hashes.h

@@ -0,0 +1,41 @@
+// -*- mode: cpp; mode: fold -*-
+// Description								/*{{{*/
+// $Id: hashes.h,v 1.1 2001/03/06 07:15:29 jgg Exp $
+/* ######################################################################
+
+   Hashes - Simple wrapper around the hash functions
+   
+   This is just used to make building the methods simpler, this is the
+   only interface required..
+   
+   ##################################################################### */
+									/*}}}*/
+#ifndef APTPKG_HASHES_H
+#define APTPKG_HASHES_H
+
+#ifdef __GNUG__
+#pragma interface "apt-pkg/hashesh.h"
+#endif 
+
+#include <apt-pkg/md5.h>
+#include <apt-pkg/sha1.h>
+
+class Hashes
+{
+   public:
+
+   MD5Summation MD5;
+   SHA1Summation SHA1;
+   
+   inline bool Add(const unsigned char *Data,unsigned long Size)
+   {
+      MD5.Add(Data,Size);
+      SHA1.Add(Data,Size);
+   };
+   inline bool Add(const char *Data) {return Add((unsigned char *)Data,strlen(Data));};
+   bool AddFD(int Fd,unsigned long Size);
+   inline bool Add(const unsigned char *Beg,const unsigned char *End) 
+                  {return Add(Beg,End-Beg);};
+};
+
+#endif

+ 3 - 3
apt-pkg/init.h

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
-// $Id: init.h,v 1.6 2001/03/03 23:02:39 tausq Exp $
+// $Id: init.h,v 1.7 2001/03/06 07:15:29 jgg Exp $
 /* ######################################################################
 
    Init - Initialize the package library
@@ -19,8 +19,8 @@
 // See the makefile
 #define APT_PKG_MAJOR 3
 #define APT_PKG_MINOR 1
-#define APT_PKG_RELEASE 2
-
+#define APT_PKG_RELEASE 3
+    
 extern const char *pkgVersion;
 extern const char *pkgLibVersion;
 extern const char *pkgOS;

+ 5 - 4
apt-pkg/makefile

@@ -13,16 +13,17 @@ include ../buildlib/defaults.mak
 LIBRARY=apt-pkg
 LIBEXT=$(GLIBC_VER)$(LIBSTDCPP_VER)
 MAJOR=3.1
-MINOR=2
+MINOR=3
 SLIBS=$(PTHREADLIB)
 
 # Source code for the contributed non-core things
 SOURCE = contrib/mmap.cc contrib/error.cc contrib/strutl.cc \
          contrib/configuration.cc contrib/progress.cc contrib/cmndline.cc \
-	 contrib/md5.cc contrib/cdromutl.cc contrib/crc-16.cc \
-	 contrib/fileutl.cc contrib/sha1.cc
+	 contrib/md5.cc contrib/sha1.cc contrib/hashes.cc \
+	 contrib/cdromutl.cc contrib/crc-16.cc \
+	 contrib/fileutl.cc 
 HEADERS = mmap.h error.h configuration.h fileutl.h  cmndline.h \
-	  md5.h crc-16.h cdromutl.h strutl.h sptr.h sha1.h
+	  md5.h crc-16.h cdromutl.h strutl.h sptr.h sha1.h hashes.h
 
 # Source code for the core main library
 SOURCE+= pkgcache.cc version.cc depcache.cc \

+ 1 - 0
debian/changelog

@@ -2,6 +2,7 @@ apt (0.5.3) unstable; urgency=low
 
   * JoeyH's dpkg::preconfig not working. Closes: #88675
   * Fixed apt override disparity
+  * Alfredo's SHA-1 and related patches
   
  -- Jason Gunthorpe <jgg@debian.org>  Sun,  4 Mar 2001 15:39:43 -0700
 

+ 9 - 9
methods/ftp.cc

@@ -1,9 +1,9 @@
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
-// $Id: ftp.cc,v 1.23 2001/02/23 07:19:49 jgg Exp $
+// $Id: ftp.cc,v 1.24 2001/03/06 07:15:29 jgg Exp $
 /* ######################################################################
 
-   HTTP Aquire Method - This is the FTP aquire method for APT.
+   FTP Aquire Method - This is the FTP aquire method for APT.
 
    This is a very simple implementation that does not try to optimize
    at all. Commands are sent syncronously with the FTP server (as the
@@ -18,7 +18,7 @@
 #include <apt-pkg/fileutl.h>
 #include <apt-pkg/acquire-method.h>
 #include <apt-pkg/error.h>
-#include <apt-pkg/md5.h>
+#include <apt-pkg/hashes.h>
 
 #include <sys/stat.h>
 #include <sys/time.h>
@@ -825,7 +825,7 @@ bool FTPConn::Finalize()
 /* This opens a data connection, sends REST and RETR and then
    transfers the file over. */
 bool FTPConn::Get(const char *Path,FileFd &To,unsigned long Resume,
-		  MD5Summation &MD5,bool &Missing)
+		  Hashes &Hash,bool &Missing)
 {
    Missing = false;
    if (CreateDataFd() == false)
@@ -849,7 +849,7 @@ bool FTPConn::Get(const char *Path,FileFd &To,unsigned long Resume,
    
    if (Resume != 0)
    {
-      if (MD5.AddFD(To.Fd(),Resume) == false)
+      if (Hash.AddFD(To.Fd(),Resume) == false)
       {
 	 _error->Errno("read","Problem hashing file");
 	 return false;
@@ -893,7 +893,7 @@ bool FTPConn::Get(const char *Path,FileFd &To,unsigned long Resume,
 	 break;
       }
    
-      MD5.Add(Buffer,Res);
+      Hash.Add(Buffer,Res);
       if (To.Write(Buffer,Res) == false)
       {
 	 Close();
@@ -1022,7 +1022,7 @@ bool FtpMethod::Fetch(FetchItem *Itm)
    }
    
    // Open the file
-   MD5Summation MD5;
+   Hashes Hash;
    {
       FileFd Fd(Itm->DestFile,FileFd::WriteAny);
       if (_error->PendingError() == true)
@@ -1035,7 +1035,7 @@ bool FtpMethod::Fetch(FetchItem *Itm)
       FailFd = Fd.Fd();
       
       bool Missing;
-      if (Server->Get(File,Fd,Res.ResumePoint,MD5,Missing) == false)
+      if (Server->Get(File,Fd,Res.ResumePoint,Hash,Missing) == false)
       {
 	 Fd.Close();
 	 
@@ -1056,7 +1056,7 @@ bool FtpMethod::Fetch(FetchItem *Itm)
    }
    
    Res.LastModified = FailTime;
-   Res.MD5Sum = MD5.Result();
+   Res.MD5Sum = Hash.MD5.Result();
    
    // Timestamp
    struct utimbuf UBuf;

+ 3 - 3
methods/ftp.h

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
-// Description								/*{{{*/// $Id: ftp.h,v 1.3 2001/02/20 07:03:18 jgg Exp $
-// $Id: ftp.h,v 1.3 2001/02/20 07:03:18 jgg Exp $
+// Description								/*{{{*/// $Id: ftp.h,v 1.4 2001/03/06 07:15:29 jgg Exp $
+// $Id: ftp.h,v 1.4 2001/03/06 07:15:29 jgg Exp $
 /* ######################################################################
 
    FTP Aquire Method - This is the FTP aquire method for APT.
@@ -56,7 +56,7 @@ class FTPConn
    bool Size(const char *Path,unsigned long &Size);
    bool ModTime(const char *Path, time_t &Time);
    bool Get(const char *Path,FileFd &To,unsigned long Resume,
-	    MD5Summation &MD5,bool &Missing);
+	    Hashes &MD5,bool &Missing);
    
    FTPConn(URI Srv);
    ~FTPConn();

+ 55 - 18
methods/gzip.cc

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
-// $Id: gzip.cc,v 1.11 2001/03/06 03:11:22 jgg Exp $
+// $Id: gzip.cc,v 1.12 2001/03/06 07:15:29 jgg Exp $
 /* ######################################################################
 
    GZip method - Take a file URI in and decompress it into the target 
@@ -13,11 +13,13 @@
 #include <apt-pkg/error.h>
 #include <apt-pkg/acquire-method.h>
 #include <apt-pkg/strutl.h>
+#include <apt-pkg/hashes.h>
 
 #include <sys/stat.h>
 #include <unistd.h>
 #include <utime.h>
 #include <stdio.h>
+#include <errno.h>
 									/*}}}*/
 
 class GzipMethod : public pkgAcqMethod
@@ -29,6 +31,7 @@ class GzipMethod : public pkgAcqMethod
    GzipMethod() : pkgAcqMethod("1.1",SingleInstance | SendConfig) {};
 };
 
+
 // GzipMethod::Fetch - Decompress the passed URI			/*{{{*/
 // ---------------------------------------------------------------------
 /* */
@@ -36,45 +39,74 @@ bool GzipMethod::Fetch(FetchItem *Itm)
 {
    URI Get = Itm->Uri;
    string Path = Get.Host + Get.Path; // To account for relative paths
-   string GzipPath = _config->Find("Dir::bin::gzip","gzip");
    
    FetchResult Res;
    Res.Filename = Itm->DestFile;
    URIStart(Res);
    
-   // Open the source and destintation files
+   // Open the source and destination files
    FileFd From(Path,FileFd::ReadOnly);
-   FileFd To(Itm->DestFile,FileFd::WriteEmpty);   
-   To.EraseOnFailure();
-   if (_error->PendingError() == true)
-      return false;
-   
+
+   int GzOut[2];   
+   if (pipe(GzOut) < 0)
+      return _error->Errno("pipe","Couldn't open pipe for gzip");
+
    // Fork gzip
-   int Process = fork();
-   if (Process < 0)
-      return _error->Errno("fork",string("Couldn't fork "+GzipPath).c_str());
-   
-   // The child
+   int Process = ExecFork();
    if (Process == 0)
    {
+      close(GzOut[0]);
       dup2(From.Fd(),STDIN_FILENO);
-      dup2(To.Fd(),STDOUT_FILENO);
+      dup2(GzOut[1],STDOUT_FILENO);
       From.Close();
-      To.Close();
+      close(GzOut[1]);
       SetCloseExec(STDIN_FILENO,false);
       SetCloseExec(STDOUT_FILENO,false);
       
       const char *Args[3];
-      Args[0] = GzipPath.c_str();
+      Args[0] = _config->Find("Dir::bin::gzip","gzip").c_str();
       Args[1] = "-d";
       Args[2] = 0;
       execvp(Args[0],(char **)Args);
-      exit(100);
+      _exit(100);
    }
    From.Close();
+   close(GzOut[1]);
+   
+   FileFd FromGz(GzOut[0]);  // For autoclose   
+   FileFd To(Itm->DestFile,FileFd::WriteEmpty);   
+   To.EraseOnFailure();
+   if (_error->PendingError() == true)
+      return false;
+   
+   // Read data from gzip, generate checksums and write
+   Hashes Hash;
+   bool Failed = false;
+   while (1) 
+   {
+      unsigned char Buffer[4*1024];
+      unsigned long Count;
+      
+      Count = read(GzOut[0],Buffer,sizeof(Buffer));
+      if (Count < 0 && errno == EINTR)
+	 continue;
+      
+      if (Count < 0)
+      {
+	 _error->Errno("read", "Read error from gzip process");
+	 Failed = true;
+	 break;
+      }
+      
+      if (Count == 0)
+	 break;
+      
+      Hash.Add(Buffer,Count);
+      To.Write(Buffer,Count);
+   }
    
    // Wait for gzip to finish
-   if (ExecWait(Process,GzipPath.c_str(),false) == false)
+   if (ExecWait(Process,_config->Find("Dir::bin::gzip","gzip").c_str(),false) == false)
    {
       To.OpFail();
       return false;
@@ -82,6 +114,9 @@ bool GzipMethod::Fetch(FetchItem *Itm)
        
    To.Close();
    
+   if (Failed == true)
+      return false;
+   
    // Transfer the modification times
    struct stat Buf;
    if (stat(Path.c_str(),&Buf) != 0)
@@ -99,6 +134,8 @@ bool GzipMethod::Fetch(FetchItem *Itm)
    // Return a Done response
    Res.LastModified = Buf.st_mtime;
    Res.Size = Buf.st_size;
+   Res.MD5Sum = Hash.MD5.Result();
+
    URIDone(Res);
    
    return true;

+ 13 - 13
methods/http.cc

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
-// $Id: http.cc,v 1.49 2001/02/23 07:19:49 jgg Exp $
+// $Id: http.cc,v 1.50 2001/03/06 07:15:29 jgg Exp $
 /* ######################################################################
 
    HTTP Aquire Method - This is the HTTP aquire method for APT.
@@ -28,7 +28,7 @@
 #include <apt-pkg/fileutl.h>
 #include <apt-pkg/acquire-method.h>
 #include <apt-pkg/error.h>
-#include <apt-pkg/md5.h>
+#include <apt-pkg/hashes.h>
 
 #include <sys/stat.h>
 #include <sys/time.h>
@@ -57,7 +57,7 @@ bool Debug = false;
 // CircleBuf::CircleBuf - Circular input buffer				/*{{{*/
 // ---------------------------------------------------------------------
 /* */
-CircleBuf::CircleBuf(unsigned long Size) : Size(Size), MD5(0)
+CircleBuf::CircleBuf(unsigned long Size) : Size(Size), Hash(0)
 {
    Buf = new unsigned char[Size];
    Reset();
@@ -73,10 +73,10 @@ void CircleBuf::Reset()
    StrPos = 0;
    MaxGet = (unsigned int)-1;
    OutQueue = string();
-   if (MD5 != 0)
+   if (Hash != 0)
    {
-      delete MD5;
-      MD5 = new MD5Summation;
+      delete Hash;
+      Hash = new Hashes;
    }   
 };
 									/*}}}*/
@@ -182,8 +182,8 @@ bool CircleBuf::Write(int Fd)
 	 return false;
       }
       
-      if (MD5 != 0)
-	 MD5->Add(Buf + (OutP%Size),Res);
+      if (Hash != 0)
+	 Hash->Add(Buf + (OutP%Size),Res);
       
       OutP += Res;
    }
@@ -892,14 +892,14 @@ int HttpMethod::DealWithHeaders(FetchResult &Res,ServerState *Srv)
    // Set the start point
    lseek(File->Fd(),0,SEEK_END);
 
-   delete Srv->In.MD5;
-   Srv->In.MD5 = new MD5Summation;
+   delete Srv->In.Hash;
+   Srv->In.Hash = new Hashes;
    
-   // Fill the MD5 Hash if the file is non-empty (resume)
+   // Fill the Hash if the file is non-empty (resume)
    if (Srv->StartPos > 0)
    {
       lseek(File->Fd(),0,SEEK_SET);
-      if (Srv->In.MD5->AddFD(File->Fd(),Srv->StartPos) == false)
+      if (Srv->In.Hash->AddFD(File->Fd(),Srv->StartPos) == false)
       {
 	 _error->Errno("read","Problem hashing file");
 	 return 5;
@@ -1109,7 +1109,7 @@ int HttpMethod::Loop()
 	    // Send status to APT
 	    if (Result == true)
 	    {
-	       Res.MD5Sum = Server->In.MD5->Result();	       
+	       Res.MD5Sum = Server->In.Hash->MD5.Result();	       
 	       URIDone(Res);
 	    }
 	    else

+ 3 - 3
methods/http.h

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
-// Description								/*{{{*/// $Id: http.h,v 1.9 2001/02/20 07:03:18 jgg Exp $
-// $Id: http.h,v 1.9 2001/02/20 07:03:18 jgg Exp $
+// Description								/*{{{*/// $Id: http.h,v 1.10 2001/03/06 07:15:29 jgg Exp $
+// $Id: http.h,v 1.10 2001/03/06 07:15:29 jgg Exp $
 /* ######################################################################
 
    HTTP Aquire Method - This is the HTTP aquire method for APT.
@@ -46,7 +46,7 @@ class CircleBuf
    
    public:
    
-   MD5Summation *MD5;
+   Hashes *Hash;
    
    // Read data in
    bool Read(int Fd);

+ 7 - 7
methods/rsh.cc

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
 // Description								/*{{{*/
-// $Id: rsh.cc,v 1.2 2001/02/20 07:03:18 jgg Exp $
+// $Id: rsh.cc,v 1.3 2001/03/06 07:15:29 jgg Exp $
 /* ######################################################################
 
    RSH method - Transfer files via rsh compatible program
@@ -271,7 +271,7 @@ bool RSHConn::ModTime(const char *Path, time_t &Time)
 // ---------------------------------------------------------------------
 /* */
 bool RSHConn::Get(const char *Path,FileFd &To,unsigned long Resume,
-                  MD5Summation &MD5,bool &Missing, unsigned long Size)
+                  Hashes &Hash,bool &Missing, unsigned long Size)
 {
    Missing = false;
 
@@ -284,7 +284,7 @@ bool RSHConn::Get(const char *Path,FileFd &To,unsigned long Resume,
       return false;
 
    if (Resume != 0) {
-      if (MD5.AddFD(To.Fd(),Resume) == false) {
+      if (Hash.AddFD(To.Fd(),Resume) == false) {
 	 _error->Errno("read","Problem hashing file");
 	 return false;
       }
@@ -323,7 +323,7 @@ bool RSHConn::Get(const char *Path,FileFd &To,unsigned long Resume,
       }
       MyLen += Res;
 
-      MD5.Add(Buffer,Res);
+      Hash.Add(Buffer,Res);
       if (To.Write(Buffer,Res) == false)
       {
          Close();
@@ -428,7 +428,7 @@ bool RSHMethod::Fetch(FetchItem *Itm)
    }
 
    // Open the file
-   MD5Summation MD5;
+   Hashes Hash;
    {
       FileFd Fd(Itm->DestFile,FileFd::WriteAny);
       if (_error->PendingError() == true)
@@ -441,7 +441,7 @@ bool RSHMethod::Fetch(FetchItem *Itm)
       FailFd = Fd.Fd();
 
       bool Missing;
-      if (Server->Get(File,Fd,Res.ResumePoint,MD5,Missing,Res.Size) == false)
+      if (Server->Get(File,Fd,Res.ResumePoint,Hash,Missing,Res.Size) == false)
       {
 	 Fd.Close();
 
@@ -462,7 +462,7 @@ bool RSHMethod::Fetch(FetchItem *Itm)
    }
 
    Res.LastModified = FailTime;
-   Res.MD5Sum = MD5.Result();
+   Res.MD5Sum = Hash.MD5.Result();
 
    // Timestamp
    struct utimbuf UBuf;

+ 4 - 4
methods/rsh.h

@@ -1,6 +1,6 @@
 // -*- mode: cpp; mode: fold -*-
-// Description								/*{{{*/// $Id: rsh.h,v 1.2 2001/02/20 07:03:18 jgg Exp $
-// $Id: rsh.h,v 1.2 2001/02/20 07:03:18 jgg Exp $
+// Description								/*{{{*/// $Id: rsh.h,v 1.3 2001/03/06 07:15:29 jgg Exp $
+// $Id: rsh.h,v 1.3 2001/03/06 07:15:29 jgg Exp $
 /* ######################################################################
 
    RSH method - Transfer files via rsh compatible program
@@ -12,7 +12,7 @@
 
 #include <string>
 #include <apt-pkg/strutl.h>
-#include <apt-pkg/md5.h>
+#include <apt-pkg/hashes.h>
 #include <apt-pkg/acquire-method.h>
 #include <apt-pkg/fileutl.h>
 
@@ -44,7 +44,7 @@ class RSHConn
    bool Size(const char *Path,unsigned long &Size);
    bool ModTime(const char *Path, time_t &Time);
    bool Get(const char *Path,FileFd &To,unsigned long Resume,
-            MD5Summation &MD5,bool &Missing, unsigned long Size);
+            Hashes &Hash,bool &Missing, unsigned long Size);
 
    RSHConn(URI Srv);
    ~RSHConn();