]> git.saurik.com Git - apt.git/commitdiff
More SHA-1 prep
authorArch Librarian <arch@canonical.com>
Mon, 20 Sep 2004 16:57:09 +0000 (16:57 +0000)
committerArch Librarian <arch@canonical.com>
Mon, 20 Sep 2004 16:57:09 +0000 (16:57 +0000)
Author: jgg
Date: 2001-03-06 07:15:29 GMT
More SHA-1 prep

12 files changed:
apt-pkg/contrib/hashes.cc [new file with mode: 0644]
apt-pkg/contrib/hashes.h [new file with mode: 0644]
apt-pkg/init.h
apt-pkg/makefile
debian/changelog
methods/ftp.cc
methods/ftp.h
methods/gzip.cc
methods/http.cc
methods/http.h
methods/rsh.cc
methods/rsh.h

diff --git a/apt-pkg/contrib/hashes.cc b/apt-pkg/contrib/hashes.cc
new file mode 100644 (file)
index 0000000..af741b6
--- /dev/null
@@ -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;
+}
+                                                                       /*}}}*/
+
diff --git a/apt-pkg/contrib/hashes.h b/apt-pkg/contrib/hashes.h
new file mode 100644 (file)
index 0000000..e00eaeb
--- /dev/null
@@ -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
index d6beb0532954cec6b317e6849becd87b0c302ca7..998c073eab4395cc4fadebea8d246fe30d3891e1 100644 (file)
@@ -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;
index 4bc8181558ae151f94a804a5f0b1e1fce53e3881..9099cc12c8ec9b6d63069200afda2473b3e7047c 100644 (file)
@@ -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 \
index 59c9ec48fa7d6e02a8b88b08c3aef9ae164376a2..c32f6bf86929117bae317690637c44b933cfc63b 100644 (file)
@@ -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
 
index 524f799c37422fb3a0646c3725a684dae1a946f9..edd150699039340f819dbeb8650a5f9a2573a612 100644 (file)
@@ -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;
index f791195b3e035f9983c178c9ef2542d9f86b6ea7..1bcea41b6829d09299c963bf8da2222aa19cb3cb 100644 (file)
@@ -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();
index f58a7263dc958448afa41b4ebab885e45bf01236..4a52c7a0c17f7030cc4a74b6e61bc6004a8cc142 100644 (file)
@@ -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 
 #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;
index c1c5d8a4a494c0183f07840d243f2f222cbf9cc7..0c520b33c232bc4d349a0b91415b4ae6a1080a31 100644 (file)
@@ -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
index 2569c292153336a2c8f6dea1e13674968b80b894..07a65d702b555e4569f7535332fd9d4634aff1bc 100644 (file)
@@ -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);
index 9e521edec7998d12f4bc9075f1cadc4129b5f6e7..5326e50980fc21ed59aa27fb6701a6a3789b15f5 100644 (file)
@@ -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;
index c3f3258e96ed1401de5a310d791574cd33053044..1b3bcaea435a138f93fd44f568cf239e8f8f4ebb 100644 (file)
@@ -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();