summaryrefslogtreecommitdiff
path: root/methods/gzip.cc
diff options
context:
space:
mode:
authorDavid Kalnischkies <david@kalnischkies.de>2016-01-03 19:23:30 +0100
committerDavid Kalnischkies <david@kalnischkies.de>2016-01-08 15:40:01 +0100
commit9bd2313a5c7523501bcec398877489c5a1fc1415 (patch)
treec0478eaac2a4ce97ab0582246324e4ed73ade388 /methods/gzip.cc
parent83758aed35c3eec66008b2ec01957c8e1cb129b5 (diff)
use one 'store' method to rule all (de)compressors
Adding a new compressor method meant adding a new method as well – even if that boilt down to just linking to our generalized decompressor with a new name. That is unneeded busywork if we can instead just call the generalized decompressor and let it figure out which compressor to use based on the filenames rather than by program name. For compatibility we ship still 'gzip', 'bzip2' and co, but they are just links to our "new" 'store' method.
Diffstat (limited to 'methods/gzip.cc')
-rw-r--r--methods/gzip.cc151
1 files changed, 0 insertions, 151 deletions
diff --git a/methods/gzip.cc b/methods/gzip.cc
deleted file mode 100644
index c470807ac..000000000
--- a/methods/gzip.cc
+++ /dev/null
@@ -1,151 +0,0 @@
-// -*- mode: cpp; mode: fold -*-
-// Description /*{{{*/
-// $Id: gzip.cc,v 1.17.2.1 2004/01/16 18:58:50 mdz Exp $
-/* ######################################################################
-
- GZip method - Take a file URI in and decompress it into the target
- file.
-
- ##################################################################### */
- /*}}}*/
-// Include Files /*{{{*/
-#include <config.h>
-
-#include <apt-pkg/configuration.h>
-#include <apt-pkg/acquire-method.h>
-#include <apt-pkg/error.h>
-#include <apt-pkg/fileutl.h>
-#include <apt-pkg/hashes.h>
-#include <apt-pkg/strutl.h>
-#include <apt-pkg/aptconfiguration.h>
-#include "aptmethod.h"
-
-#include <string.h>
-#include <sys/stat.h>
-#include <sys/time.h>
-#include <string>
-#include <vector>
-
-#include <apti18n.h>
- /*}}}*/
-
-class GzipMethod : public aptMethod
-{
- std::string const Prog;
- virtual bool Fetch(FetchItem *Itm) APT_OVERRIDE;
-
- public:
-
- explicit GzipMethod(std::string const &pProg) : aptMethod(pProg.c_str(),"1.1",SingleInstance | SendConfig), Prog(pProg) {};
-};
-
-// GzipMethod::Fetch - Decompress the passed URI /*{{{*/
-// ---------------------------------------------------------------------
-/* */
-bool GzipMethod::Fetch(FetchItem *Itm)
-{
- URI Get = Itm->Uri;
- std::string Path = Get.Host + Get.Path; // To account for relative paths
-
- FetchResult Res;
- Res.Filename = Itm->DestFile;
- URIStart(Res);
-
- std::vector<APT::Configuration::Compressor> const compressors = APT::Configuration::getCompressors();
- std::vector<APT::Configuration::Compressor>::const_iterator compressor = compressors.begin();
- for (; compressor != compressors.end(); ++compressor)
- if (compressor->Name == Prog)
- break;
- if (compressor == compressors.end())
- return _error->Error("Extraction of file %s requires unknown compressor %s", Path.c_str(), Prog.c_str());
-
- // Open the source and destination files
- FileFd From;
- if (_config->FindB("Method::Compress", false) == false)
- {
- From.Open(Path, FileFd::ReadOnly, *compressor);
- if(From.FileSize() == 0)
- return _error->Error(_("Empty files can't be valid archives"));
- }
- else
- From.Open(Path, FileFd::ReadOnly);
- if (From.IsOpen() == false || From.Failed() == true)
- return false;
-
- FileFd To;
- if (Itm->DestFile != "/dev/null")
- {
- if (_config->FindB("Method::Compress", false) == false)
- To.Open(Itm->DestFile, FileFd::WriteAtomic);
- else
- To.Open(Itm->DestFile, FileFd::WriteOnly | FileFd::Create | FileFd::Empty, *compressor);
-
- if (To.IsOpen() == false || To.Failed() == true)
- return false;
- To.EraseOnFailure();
- }
-
-
- // Read data from source, generate checksums and write
- Hashes Hash(Itm->ExpectedHashes);
- bool Failed = false;
- Res.Size = 0;
- while (1)
- {
- unsigned char Buffer[4*1024];
- unsigned long long Count = 0;
-
- if (!From.Read(Buffer,sizeof(Buffer),&Count))
- {
- if (To.IsOpen())
- To.OpFail();
- return false;
- }
- if (Count == 0)
- break;
- Res.Size += Count;
-
- Hash.Add(Buffer,Count);
- if (To.IsOpen() && To.Write(Buffer,Count) == false)
- {
- Failed = true;
- break;
- }
- }
-
- From.Close();
- To.Close();
-
- if (Failed == true)
- return false;
-
- // Transfer the modification times
- if (Itm->DestFile != "/dev/null")
- {
- struct stat Buf;
- if (stat(Path.c_str(),&Buf) != 0)
- return _error->Errno("stat",_("Failed to stat"));
-
- struct timeval times[2];
- times[0].tv_sec = Buf.st_atime;
- Res.LastModified = times[1].tv_sec = Buf.st_mtime;
- times[0].tv_usec = times[1].tv_usec = 0;
- if (utimes(Itm->DestFile.c_str(), times) != 0)
- return _error->Errno("utimes",_("Failed to set modification time"));
- }
-
- // Return a Done response
- Res.TakeHashes(Hash);
-
- URIDone(Res);
- return true;
-}
- /*}}}*/
-
-int main(int, char *argv[])
-{
- setlocale(LC_ALL, "");
-
- GzipMethod Mth(flNotDir(argv[0]));
- return Mth.Run();
-}