summaryrefslogtreecommitdiff
path: root/methods
diff options
context:
space:
mode:
authormartin@piware.de <>2010-07-06 13:14:57 +0200
committermartin@piware.de <>2010-07-06 13:14:57 +0200
commit127e6df37213a1fda0dd5b44182acf678ccbbf02 (patch)
tree1fc838ca3c2ce3bc91d8f54d520266ecf24d2bf3 /methods
parentd13c2d3f7b10e558301a05948e91ac4a60160793 (diff)
methods/gzip.cc: With FileFd now being able to read gzipped files, there
is no need for the gzip method any more to spawn an external gzip process. Rewrite it to use FileFd directly, which makes the code a lot simpler, and also using less memory and overhead.
Diffstat (limited to 'methods')
-rw-r--r--methods/gzip.cc63
1 files changed, 7 insertions, 56 deletions
diff --git a/methods/gzip.cc b/methods/gzip.cc
index f732c0b86..72e3ac909 100644
--- a/methods/gzip.cc
+++ b/methods/gzip.cc
@@ -23,8 +23,6 @@
#include <apti18n.h>
/*}}}*/
-const char *Prog;
-
class GzipMethod : public pkgAcqMethod
{
virtual bool Fetch(FetchItem *Itm);
@@ -43,14 +41,12 @@ bool GzipMethod::Fetch(FetchItem *Itm)
URI Get = Itm->Uri;
string Path = Get.Host + Get.Path; // To account for relative paths
- string GzPathOption = "Dir::bin::"+string(Prog);
-
FetchResult Res;
Res.Filename = Itm->DestFile;
URIStart(Res);
// Open the source and destination files
- FileFd From(Path,FileFd::ReadOnly);
+ FileFd From(Path,FileFd::ReadOnlyGzip);
// if the file is empty, just rename it and return
if(From.Size() == 0)
@@ -59,40 +55,12 @@ bool GzipMethod::Fetch(FetchItem *Itm)
return true;
}
- int GzOut[2];
- if (pipe(GzOut) < 0)
- return _error->Errno("pipe",_("Couldn't open pipe for %s"),Prog);
-
- // Fork gzip
- pid_t Process = ExecFork();
- if (Process == 0)
- {
- close(GzOut[0]);
- dup2(From.Fd(),STDIN_FILENO);
- dup2(GzOut[1],STDOUT_FILENO);
- From.Close();
- close(GzOut[1]);
- SetCloseExec(STDIN_FILENO,false);
- SetCloseExec(STDOUT_FILENO,false);
-
- const char *Args[3];
- string Tmp = _config->Find(GzPathOption,Prog);
- Args[0] = Tmp.c_str();
- Args[1] = "-d";
- Args[2] = 0;
- execvp(Args[0],(char **)Args);
- _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
+ // Read data from source, generate checksums and write
Hashes Hash;
bool Failed = false;
while (1)
@@ -100,36 +68,23 @@ bool GzipMethod::Fetch(FetchItem *Itm)
unsigned char Buffer[4*1024];
unsigned long Count;
- Count = read(GzOut[0],Buffer,sizeof(Buffer));
- if (Count < 0 && errno == EINTR)
- continue;
-
- if (Count < 0)
+ if (!From.Read(Buffer,sizeof(Buffer),&Count))
{
- _error->Errno("read", _("Read error from %s process"),Prog);
- Failed = true;
- break;
+ To.OpFail();
+ return false;
}
-
if (Count == 0)
break;
-
+
Hash.Add(Buffer,Count);
if (To.Write(Buffer,Count) == false)
{
Failed = true;
- FromGz.Close();
break;
}
}
- // Wait for gzip to finish
- if (ExecWait(Process,_config->Find(GzPathOption,Prog).c_str(),false) == false)
- {
- To.OpFail();
- return false;
- }
-
+ From.Close();
To.Close();
if (Failed == true)
@@ -165,9 +120,5 @@ int main(int argc, char *argv[])
setlocale(LC_ALL, "");
GzipMethod Mth;
-
- Prog = strrchr(argv[0],'/');
- Prog++;
-
return Mth.Run();
}