/* Aha! We found some package files. We assume that everything under
this dir is controlled by those package files so we don't look down
anymore */
- std::vector<std::string> types = APT::Configuration::getCompressionTypes();
- types.push_back("");
- for (std::vector<std::string>::const_iterator t = types.begin();
- t != types.end(); ++t)
- {
- std::string filename = std::string("Packages");
- if ((*t).size() > 0)
- filename.append("."+*t);
- if (stat(filename.c_str(), &Buf) == 0)
- {
- List.push_back(CD);
-
- // Continue down if thorough is given
- if (_config->FindB("APT::CDROM::Thorough",false) == false)
- return true;
- break;
- }
- }
- for (std::vector<std::string>::const_iterator t = types.begin();
- t != types.end(); ++t)
- {
- std::string filename = std::string("Sources");
- if ((*t).size() > 0)
- filename.append("."+*t);
- {
- SList.push_back(CD);
-
- // Continue down if thorough is given
- if (_config->FindB("APT::CDROM::Thorough",false) == false)
- return true;
- break;
- }
- }
+ std::vector<APT::Configuration::Compressor> const compressor = APT::Configuration::getCompressors();
+ for (std::vector<APT::Configuration::Compressor>::const_iterator c = compressor.begin();
+ c != compressor.end(); ++c)
+ {
+ if (stat(std::string("Packages").append(c->Extension).c_str(), &Buf) != 0)
+ continue;
+
+ if (_config->FindB("Debug::aptcdrom",false) == true)
+ std::clog << "Found Packages in " << CD << std::endl;
+ List.push_back(CD);
+
+ // Continue down if thorough is given
+ if (_config->FindB("APT::CDROM::Thorough",false) == false)
+ return true;
+ break;
+ }
+ for (std::vector<APT::Configuration::Compressor>::const_iterator c = compressor.begin();
+ c != compressor.end(); ++c)
+ {
+ if (stat(std::string("Sources").append(c->Extension).c_str(), &Buf) != 0)
+ continue;
+
+ if (_config->FindB("Debug::aptcdrom",false) == true)
+ std::clog << "Found Sources in " << CD << std::endl;
+ SList.push_back(CD);
+
+ // Continue down if thorough is given
+ if (_config->FindB("APT::CDROM::Thorough",false) == false)
+ return true;
+ break;
+ }
// see if we find translation indices
- if (stat("i18n",&Buf) == 0)
+ if (DirectoryExists("i18n") == true)
{
D = opendir("i18n");
for (struct dirent *Dir = readdir(D); Dir != 0; Dir = readdir(D))
{
- if(strstr(Dir->d_name,"Translation") != NULL)
+ if(strncmp(Dir->d_name, "Translation-", strlen("Translation-")) != 0)
+ continue;
+ string file = Dir->d_name;
+ for (std::vector<APT::Configuration::Compressor>::const_iterator c = compressor.begin();
+ c != compressor.end(); ++c)
{
- if (_config->FindB("Debug::aptcdrom",false) == true)
- std::clog << "found translations: " << Dir->d_name << "\n";
- string file = Dir->d_name;
- for (std::vector<std::string>::const_iterator t = types.begin();
- t != types.end(); ++t)
- {
- std::string needle = "." + *t;
- if(file.substr(file.size()-needle.size()) == needle)
- file = file.substr(0, file.size()-needle.size());
- TransList.push_back(CD+"i18n/"+ file);
- break;
- }
+ string fileext = flExtension(file);
+ if (file == fileext)
+ fileext.clear();
+ else if (fileext.empty() == false)
+ fileext = "." + fileext;
+
+ if (c->Extension == fileext)
+ {
+ if (_config->FindB("Debug::aptcdrom",false) == true)
+ std::clog << "Found translation " << Dir->d_name << " in " << CD << "i18n/" << std::endl;
+ TransList.push_back(CD + "i18n/" + file);
+ break;
+ }
}
}
closedir(D);
}
-
D = opendir(".");
if (D == 0)
return _error->Errno("opendir","Unable to read %s",CD.c_str());
{
// Get a list of all the inodes
ino_t *Inodes = new ino_t[List.size()];
- for (unsigned int I = 0; I != List.size(); I++)
+ for (unsigned int I = 0; I != List.size(); ++I)
{
struct stat Buf;
- std::vector<std::string> types = APT::Configuration::getCompressionTypes();
- types.push_back("");
- for (std::vector<std::string>::const_iterator t = types.begin();
- t != types.end(); ++t)
+ bool found = false;
+
+ std::vector<APT::Configuration::Compressor> const compressor = APT::Configuration::getCompressors();
+ for (std::vector<APT::Configuration::Compressor>::const_iterator c = compressor.begin();
+ c != compressor.end(); ++c)
{
- std::string filename = List[I] + Name;
- if ((*t).size() > 0)
- filename.append("." + *t);
+ std::string filename = std::string(List[I]).append(Name).append(c->Extension);
if (stat(filename.c_str(), &Buf) != 0)
- _error->Errno("stat","Failed to stat %s%s",List[I].c_str(),
- Name);
- Inodes[I] = Buf.st_ino;
+ continue;
+ Inodes[I] = Buf.st_ino;
+ found = true;
+ break;
}
+
+ if (found == false)
+ _error->Errno("stat","Failed to stat %s%s",List[I].c_str(), Name);
}
-
+
if (_error->PendingError() == true) {
delete[] Inodes;
return false;
#include <apt-pkg/progress.h>
#include <apt-pkg/strutl.h>
#include <apt-pkg/fileutl.h>
+#include <apt-pkg/aptconfiguration.h>
#include <apt-pkg/configuration.h>
#include <apt-pkg/tagfile.h>
#include <apt-pkg/indexrecords.h>
using namespace std;
-// DecompressFile - wrapper for decompressing gzip/bzip2/xz compressed files /*{{{*/
+// DecompressFile - wrapper for decompressing compressed files /*{{{*/
// ---------------------------------------------------------------------
/* */
bool DecompressFile(string Filename, int *fd, off_t *FileSize)
{
- string CompressProg;
- string CompressProgFind;
- FileFd From;
struct stat Buf;
- *fd = -1;
+ *fd = -1;
- if (stat((Filename + ".gz").c_str(), &Buf) == 0)
+ std::vector<APT::Configuration::Compressor> const compressor = APT::Configuration::getCompressors();
+ std::vector<APT::Configuration::Compressor>::const_iterator UnCompress;
+ std::string file = std::string(Filename).append(UnCompress->Extension);
+ for (UnCompress = compressor.begin(); UnCompress != compressor.end(); ++UnCompress)
{
- CompressProg = "gzip";
- CompressProgFind = "Dir::bin::gzip";
- From.Open(Filename + ".gz",FileFd::ReadOnly);
+ if (stat(file.c_str(), &Buf) == 0)
+ break;
}
- else if (stat((Filename + ".bz2").c_str(), &Buf) == 0)
- {
- CompressProg = "bzip2";
- CompressProgFind = "Dir::bin::bzip2";
- From.Open(Filename + ".bz2",FileFd::ReadOnly);
- }
- else if (stat((Filename + ".xz").c_str(), &Buf) == 0)
- {
- CompressProg = "xz";
- CompressProgFind = "Dir::bin::xz";
- From.Open(Filename + ".xz",FileFd::ReadOnly);
- }
- else
- {
+
+ if (UnCompress == compressor.end())
return _error->Errno("decompressor", "Unable to parse file");
- }
- if (_error->PendingError() == true)
- return -1;
-
*FileSize = Buf.st_size;
-
- // Get a temp file
- FILE *tmp = tmpfile();
- if (tmp == 0)
- return _error->Errno("tmpfile","Unable to create a tmp file");
- *fd = dup(fileno(tmp));
- fclose(tmp);
-
- // Fork decompressor
- pid_t Process = fork();
- if (Process < 0)
- return _error->Errno("fork","Couldn't fork to run decompressor");
-
- // The child
- if (Process == 0)
- {
- dup2(From.Fd(),STDIN_FILENO);
- dup2(*fd,STDOUT_FILENO);
- SetCloseExec(STDIN_FILENO,false);
- SetCloseExec(STDOUT_FILENO,false);
-
- const char *Args[3];
- string Tmp = _config->Find(CompressProgFind, CompressProg);
- Args[0] = Tmp.c_str();
- Args[1] = "-d";
- Args[2] = 0;
- if(execvp(Args[0],(char **)Args))
- return(_error->Errno("decompressor","decompress failed"));
- /* Should never get here */
- exit(100);
+
+ // Create a data pipe
+ int Pipe[2] = {-1,-1};
+ if (pipe(Pipe) != 0)
+ return _error->Errno("pipe",_("Failed to create subprocess IPC"));
+ for (int J = 0; J != 2; J++)
+ SetCloseExec(Pipe[J],true);
+
+ *fd = Pipe[1];
+
+ // The child..
+ pid_t Pid = ExecFork();
+ if (Pid == 0)
+ {
+ dup2(Pipe[1],STDOUT_FILENO);
+ SetCloseExec(STDOUT_FILENO, false);
+
+ std::vector<char const*> Args;
+ Args.push_back(UnCompress->Binary.c_str());
+ for (std::vector<std::string>::const_iterator a = UnCompress->UncompressArgs.begin();
+ a != UnCompress->UncompressArgs.end(); ++a)
+ Args.push_back(a->c_str());
+ Args.push_back("--stdout");
+ Args.push_back(file.c_str());
+ Args.push_back(NULL);
+
+ execvp(Args[0],(char **)&Args[0]);
+ cerr << _("Failed to exec compressor ") << Args[0] << endl;
+ _exit(100);
}
// Wait for decompress to finish
- if (ExecWait(Process,CompressProg.c_str(),false) == false)
+ if (ExecWait(Pid, UnCompress->Binary.c_str(), false) == false)
return false;
-
+
return true;
}
/*}}}*/
// Prepare the progress indicator
off_t TotalSize = 0;
+ std::vector<APT::Configuration::Compressor> const compressor = APT::Configuration::getCompressors();
for (vector<string>::iterator I = List.begin(); I != List.end(); ++I)
{
struct stat Buf;
- if (stat(string(*I + GetFileName()).c_str(),&Buf) != 0 &&
- stat(string(*I + GetFileName() + ".gz").c_str(),&Buf) != 0 &&
- stat(string(*I + GetFileName() + ".xz").c_str(),&Buf) != 0 &&
- stat(string(*I + GetFileName() + ".bz2").c_str(),&Buf) != 0)
- return _error->Errno("stat","Stat failed for %s",
- string(*I + GetFileName()).c_str());
+ bool found = false;
+ std::string file = std::string(*I).append(GetFileName());
+ for (std::vector<APT::Configuration::Compressor>::const_iterator c = compressor.begin();
+ c != compressor.end(); ++c)
+ {
+ if (stat(std::string(file + c->Extension).c_str(), &Buf) != 0)
+ continue;
+ found = true;
+ break;
+ }
+
+ if (found == false)
+ return _error->Errno("stat", "Stat failed for %s", file.c_str());
TotalSize += Buf.st_size;
- }
+ }
off_t CurrentSize = 0;
unsigned int NotFound = 0;
// Prepare the progress indicator
off_t TotalSize = 0;
+ std::vector<APT::Configuration::Compressor> const compressor = APT::Configuration::getCompressors();
for (vector<string>::iterator I = List.begin(); I != List.end(); ++I)
{
struct stat Buf;
-
- if (stat(string(*I).c_str(),&Buf) != 0 &&
- stat(string(*I + ".gz").c_str(),&Buf) != 0 &&
- stat(string(*I + ".bz2").c_str(),&Buf) != 0 &&
- stat(string(*I + ".xz").c_str(),&Buf) != 0)
- return _error->Errno("stat","Stat failed for %s",
- string(*I).c_str());
+ bool found = false;
+ std::string file = *I;
+ for (std::vector<APT::Configuration::Compressor>::const_iterator c = compressor.begin();
+ c != compressor.end(); ++c)
+ {
+ if (stat(std::string(file + c->Extension).c_str(), &Buf) != 0)
+ continue;
+ found = true;
+ break;
+ }
+
+ if (found == false)
+ return _error->Errno("stat", "Stat failed for %s", file.c_str());
TotalSize += Buf.st_size;
- }
+ }
off_t CurrentSize = 0;
unsigned int NotFound = 0;