X-Git-Url: https://git.saurik.com/apt.git/blobdiff_plain/be4401bfa4a240bbc894e1bfeb1e1e8d63fc7b18..10639577016904cccab77c311e7c0b4363997504:/methods/gzip.cc diff --git a/methods/gzip.cc b/methods/gzip.cc index be4f82e6f..78b196115 100644 --- a/methods/gzip.cc +++ b/methods/gzip.cc @@ -1,6 +1,6 @@ // -*- mode: cpp; mode: fold -*- // Description /*{{{*/ -// $Id: gzip.cc,v 1.4 1998/11/01 05:27:43 jgg Exp $ +// $Id: gzip.cc,v 1.10 2000/03/18 07:39:33 jgg Exp $ /* ###################################################################### GZip method - Take a file URI in and decompress it into the target @@ -12,12 +12,11 @@ #include #include #include -#include +#include #include #include #include -#include #include /*}}}*/ @@ -36,9 +35,14 @@ class GzipMethod : public pkgAcqMethod bool GzipMethod::Fetch(FetchItem *Itm) { URI Get = Itm->Uri; + string Path = Get.Host + Get.Path; // To account for relative paths + + FetchResult Res; + Res.Filename = Itm->DestFile; + URIStart(Res); // Open the source and destintation files - FileFd From(Get.Path,FileFd::ReadOnly); + FileFd From(Path,FileFd::ReadOnly); FileFd To(Itm->DestFile,FileFd::WriteEmpty); To.EraseOnFailure(); if (_error->PendingError() == true) @@ -69,24 +73,17 @@ bool GzipMethod::Fetch(FetchItem *Itm) From.Close(); // Wait for gzip to finish - int Status; - if (waitpid(Process,&Status,0) != Process) - { - To.OpFail(); - return _error->Errno("wait","Waiting for gzip failed"); - } - - if (WIFEXITED(Status) == 0 || WEXITSTATUS(Status) != 0) + if (ExecWait(Process,_config->Find("Dir::bin::gzip","gzip").c_str(),false) == false) { To.OpFail(); - return _error->Error("gzip failed, perhaps the disk is full or the directory permissions are wrong."); - } - + return false; + } + To.Close(); // Transfer the modification times struct stat Buf; - if (stat(Get.Path.c_str(),&Buf) != 0) + if (stat(Path.c_str(),&Buf) != 0) return _error->Errno("stat","Failed to stat"); struct utimbuf TimeBuf; @@ -95,10 +92,12 @@ bool GzipMethod::Fetch(FetchItem *Itm) if (utime(Itm->DestFile.c_str(),&TimeBuf) != 0) return _error->Errno("utime","Failed to set modification time"); + if (stat(Itm->DestFile.c_str(),&Buf) != 0) + return _error->Errno("stat","Failed to stat"); + // Return a Done response - FetchResult Res; Res.LastModified = Buf.st_mtime; - Res.Filename = Itm->DestFile; + Res.Size = Buf.st_size; URIDone(Res); return true;