From ad7e0941b376d792911f240377094a2e78ca8756 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Sat, 8 Nov 2014 18:14:46 +0100 Subject: streamline display of --help in all tools By convention, if I run a tool with --help or --version I expect it to exit successfully with the usage, while if I do call it wrong (like without any parameters) I expect the usage message shown with a non-zero exit. --- ftparchive/apt-ftparchive.cc | 19 ++++--------------- ftparchive/makefile | 4 ++-- 2 files changed, 6 insertions(+), 17 deletions(-) (limited to 'ftparchive') diff --git a/ftparchive/apt-ftparchive.cc b/ftparchive/apt-ftparchive.cc index ebf99a8f8..7d9af4178 100644 --- a/ftparchive/apt-ftparchive.cc +++ b/ftparchive/apt-ftparchive.cc @@ -19,6 +19,8 @@ #include #include +#include + #include #include #include @@ -1060,21 +1062,8 @@ int main(int argc, const char *argv[]) // Parse the command line and initialize the package library CommandLine CmdL(Args,_config); - if (pkgInitConfig(*_config) == false || CmdL.Parse(argc,argv) == false) - { - _error->DumpErrors(); - return 100; - } - - // See if the help should be shown - if (_config->FindB("help") == true || - _config->FindB("version") == true || - CmdL.FileSize() == 0) - { - ShowHelp(CmdL); - return 0; - } - + ParseCommandLine(CmdL, Cmds, Args, &_config, NULL, argc, argv, ShowHelp); + // Setup the output streams c0out.rdbuf(clog.rdbuf()); c1out.rdbuf(clog.rdbuf()); diff --git a/ftparchive/makefile b/ftparchive/makefile index d1ffe182a..e67272e1e 100644 --- a/ftparchive/makefile +++ b/ftparchive/makefile @@ -9,8 +9,8 @@ include ../buildlib/defaults.mak ifdef BDBLIB APT_DOMAIN:=apt-utils PROGRAM=apt-ftparchive -SLIBS = -lapt-pkg -lapt-inst $(BDBLIB) $(INTLLIBS) -LIB_MAKES = apt-pkg/makefile apt-inst/makefile +SLIBS = -lapt-pkg -lapt-inst -lapt-private $(BDBLIB) $(INTLLIBS) +LIB_MAKES = apt-pkg/makefile apt-inst/makefile apt-private/makefile SOURCE = apt-ftparchive.cc cachedb.cc writer.cc contents.cc override.cc \ multicompress.cc sources.cc include $(PROGRAM_H) -- cgit v1.2.3 From d9e518c6f7dc0ad464495b586d1b8e115d54d41a Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Sat, 8 Nov 2014 20:44:44 +0100 Subject: use the same code to detect quiet setting in all tools Git-Dch: Ignore --- ftparchive/apt-ftparchive.cc | 19 +++++-------------- 1 file changed, 5 insertions(+), 14 deletions(-) (limited to 'ftparchive') diff --git a/ftparchive/apt-ftparchive.cc b/ftparchive/apt-ftparchive.cc index 7d9af4178..adf1b6d73 100644 --- a/ftparchive/apt-ftparchive.cc +++ b/ftparchive/apt-ftparchive.cc @@ -20,6 +20,7 @@ #include #include +#include #include #include @@ -42,11 +43,7 @@ #include /*}}}*/ -using namespace std; -ostream c0out(0); -ostream c1out(0); -ostream c2out(0); -ofstream devnull("/dev/null"); +using namespace std; unsigned Quiet = 0; // struct PackageMap - List of all package files in the config file /*{{{*/ @@ -1064,16 +1061,10 @@ int main(int argc, const char *argv[]) CommandLine CmdL(Args,_config); ParseCommandLine(CmdL, Cmds, Args, &_config, NULL, argc, argv, ShowHelp); - // Setup the output streams - c0out.rdbuf(clog.rdbuf()); - c1out.rdbuf(clog.rdbuf()); - c2out.rdbuf(clog.rdbuf()); + _config->CndSet("quiet",0); Quiet = _config->FindI("quiet",0); - if (Quiet > 0) - c0out.rdbuf(devnull.rdbuf()); - if (Quiet > 1) - c1out.rdbuf(devnull.rdbuf()); - + InitOutput(clog.rdbuf()); + // Match the operation CmdL.DispatchArg(Cmds); -- cgit v1.2.3 From 31be38d205406d4c756684e20b93d62c4701e091 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Fri, 9 Jan 2015 01:03:31 +0100 Subject: 128 KiB DSC files ought to be enough for everyone Your mileage may vary, but don't worry: There is more than one way to do it, but our one size fits all is not a bigger hammer, but an entire roundhouse kick! So brace yourself for the tl;dr: The limit is gone.* Beware: This fixes also the problem that a double newline is unconditionally added 'later' which is an overcommitment in case the dsc filesize is limit-2 <= x <= limit. * limited to numbers fitting into an unsigned long long. Closes: 774893 --- ftparchive/cachedb.cc | 6 +++--- ftparchive/sources.cc | 41 +++++++++++++++++++++++++++-------------- ftparchive/sources.h | 26 +++++++++----------------- ftparchive/writer.cc | 12 ++---------- 4 files changed, 41 insertions(+), 44 deletions(-) (limited to 'ftparchive') diff --git a/ftparchive/cachedb.cc b/ftparchive/cachedb.cc index 0901492f7..c73a64fb7 100644 --- a/ftparchive/cachedb.cc +++ b/ftparchive/cachedb.cc @@ -328,12 +328,12 @@ bool CacheDB::LoadSource() if (Dsc.Read(FileName) == false) return false; - if (Dsc.Data == 0) + if (Dsc.Length == 0) return _error->Error(_("Failed to read .dsc")); - + // Write back the control information InitQuerySource(); - if (Put(Dsc.Data, Dsc.Length) == true) + if (Put(Dsc.Data.c_str(), Dsc.Length) == true) CurStat.Flags |= FlSource; return true; diff --git a/ftparchive/sources.cc b/ftparchive/sources.cc index d0878a70a..ab976b490 100644 --- a/ftparchive/sources.cc +++ b/ftparchive/sources.cc @@ -1,5 +1,5 @@ #include -#include +#include // for memcpy #include @@ -9,17 +9,19 @@ #include "sources.h" -bool DscExtract::TakeDsc(const void *newData, unsigned long newSize) +bool DscExtract::TakeDsc(const void *newData, unsigned long long newSize) { - if(newSize > maxSize) - return _error->Error("DSC data is too large %lu!", newSize); - if (newSize == 0) { + // adding two newlines 'off record' for pkgTagSection.Scan() calls + Data = "\n\n"; Length = 0; return true; } - memcpy(Data, newData, newSize); + + Data = std::string((const char*)newData, newSize); + // adding two newlines 'off record' for pkgTagSection.Scan() calls + Data.append("\n\n"); Length = newSize; return true; @@ -27,20 +29,31 @@ bool DscExtract::TakeDsc(const void *newData, unsigned long newSize) bool DscExtract::Read(std::string FileName) { + Data.clear(); + Length = 0; + FileFd F; if (OpenMaybeClearSignedFile(FileName, F) == false) return false; - - unsigned long long const FSize = F.FileSize(); - if(FSize > maxSize) - return _error->Error("DSC file '%s' is too large!",FileName.c_str()); - - if (F.Read(Data, FSize) == false) - return false; - Length = FSize; IsClearSigned = (FileName != F.Name()); + std::ostringstream data; + char buffer[1024]; + do { + unsigned long long actual = 0; + if (F.Read(buffer, sizeof(buffer)-1, &actual) == false) + return _error->Errno("read", "Failed to read dsc file %s", FileName.c_str()); + if (actual == 0) + break; + Length += actual; + buffer[actual] = '\0'; + data << buffer; + } while(true); + + // adding two newlines 'off record' for pkgTagSection.Scan() calls + data << "\n\n"; + Data = data.str(); return true; } diff --git a/ftparchive/sources.h b/ftparchive/sources.h index 91e0b1376..a125ec6a4 100644 --- a/ftparchive/sources.h +++ b/ftparchive/sources.h @@ -3,29 +3,21 @@ #include -class DscExtract +#include + +class DscExtract { public: - //FIXME: do we really need to enforce a maximum size of the dsc file? - static const int maxSize = 128*1024; - - char *Data; + std::string Data; pkgTagSection Section; - unsigned long Length; + unsigned long long Length; bool IsClearSigned; - bool TakeDsc(const void *Data, unsigned long Size); + bool TakeDsc(const void *Data, unsigned long long Size); bool Read(std::string FileName); - - DscExtract() : Data(0), Length(0) { - Data = new char[maxSize]; - }; - ~DscExtract() { - if(Data != NULL) { - delete [] Data; - Data = NULL; - } - }; + + DscExtract() : Length(0), IsClearSigned(false) {}; + ~DscExtract() {}; }; diff --git a/ftparchive/writer.cc b/ftparchive/writer.cc index 7c1c9cc03..0f6cc177b 100644 --- a/ftparchive/writer.cc +++ b/ftparchive/writer.cc @@ -634,18 +634,10 @@ bool SourcesWriter::DoPackage(string FileName) // the "db cursor" Db.Finish(); - // read stuff - char *Start = Db.Dsc.Data; - char *BlkEnd = Db.Dsc.Data + Db.Dsc.Length; - - // Add extra \n to the end, just in case (as in clearsigned they are missing) - *BlkEnd++ = '\n'; - *BlkEnd++ = '\n'; - pkgTagSection Tags; - if (Tags.Scan(Start,BlkEnd - Start) == false) + if (Tags.Scan(Db.Dsc.Data.c_str(), Db.Dsc.Data.length()) == false) return _error->Error("Could not find a record in the DSC '%s'",FileName.c_str()); - + if (Tags.Exists("Source") == false) return _error->Error("Could not find a Source entry in the DSC '%s'",FileName.c_str()); Tags.Trim(); -- cgit v1.2.3 From 249aec3b7397662a678ea0014f94392085477b09 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=A9my=20Bobbio?= Date: Tue, 10 Mar 2015 10:09:44 +0100 Subject: stop displaying time of build in online help MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit As part of the “reproducible builds” effort [1], we have noticed that apt could not be built reproducibly. One issue is that it uses the __DATE__ and __TIME__ macros of the C preprocessor to display the time of build in the online help. We believe this information not to be really useful to users as they can always look at the package data and metadata to figure it out. The attached patch simply removes this information. All non-documentation packages can then be built reproducibly with our current experimental framework. [David: changed the string slightly to be untranslateable as well] Closes: 774342 --- ftparchive/apt-ftparchive.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'ftparchive') diff --git a/ftparchive/apt-ftparchive.cc b/ftparchive/apt-ftparchive.cc index adf1b6d73..69b936dff 100644 --- a/ftparchive/apt-ftparchive.cc +++ b/ftparchive/apt-ftparchive.cc @@ -616,8 +616,7 @@ static void LoadBinDir(vector &PkgList,Configuration &Setup) /* */ static bool ShowHelp(CommandLine &) { - ioprintf(cout,_("%s %s for %s compiled on %s %s\n"),PACKAGE,PACKAGE_VERSION, - COMMON_ARCH,__DATE__,__TIME__); + ioprintf(cout, "%s %s (%s)\n", PACKAGE, PACKAGE_VERSION, COMMON_ARCH); if (_config->FindB("version") == true) return true; -- cgit v1.2.3 From b8eba208daebe3e3f235983e44da9c398d6f7a57 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Tue, 10 Mar 2015 14:11:54 +0100 Subject: reimplement the last uses of sprintf Working with strings c-style is complicated and error-prune, so by converting to c++ style we gain some simplicity and avoid buffer overflows by later extensions. Git-Dch: Ignore --- ftparchive/writer.cc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'ftparchive') diff --git a/ftparchive/writer.cc b/ftparchive/writer.cc index a63d8846b..db68c21f0 100644 --- a/ftparchive/writer.cc +++ b/ftparchive/writer.cc @@ -440,9 +440,6 @@ bool PackagesWriter::DoPackage(string FileName) OverItem->Priority = Tags.FindS("Priority"); } - char Size[40]; - sprintf(Size,"%llu", (unsigned long long) FileSize); - // Strip the DirStrip prefix from the FileName and add the PathPrefix string NewFileName; if (DirStrip.empty() == false && @@ -466,7 +463,10 @@ bool PackagesWriter::DoPackage(string FileName) // This lists all the changes to the fields we are going to make. std::vector Changes; - Changes.push_back(SetTFRewriteData("Size", Size)); + std::string Size; + strprintf(Size, "%llu", (unsigned long long) FileSize); + Changes.push_back(SetTFRewriteData("Size", Size.c_str())); + for (HashStringList::const_iterator hs = Db.HashesList.begin(); hs != Db.HashesList.end(); ++hs) { if (hs->HashType() == "MD5Sum") -- cgit v1.2.3 From 9224ce3d4d1ea0428a70e75134998e08aa45b1e6 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Mon, 30 Mar 2015 20:47:13 +0200 Subject: calculate only expected hashes in methods Methods get told which hashes are expected by the acquire system, which means we can use this list to restrict what we calculate in the methods as any extra we are calculating is wasted effort as we can't compare it with anything anyway. Adding support for a new hash algorithm is therefore 'free' now and if a algorithm is no longer provided in a repository for a file, we automatically stop calculating it. In practice this results in a speed-up in Debian as we don't have SHA512 here (so far), so we practically stop calculating it. --- ftparchive/cachedb.cc | 4 ++-- ftparchive/writer.cc | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'ftparchive') diff --git a/ftparchive/cachedb.cc b/ftparchive/cachedb.cc index 1dc268594..cc3527ea4 100644 --- a/ftparchive/cachedb.cc +++ b/ftparchive/cachedb.cc @@ -441,8 +441,8 @@ bool CacheDB::GetHashes(bool const GenOnly, unsigned int const DoHashes) if (OpenFile() == false) return false; - Hashes hashes; - if (Fd->Seek(0) == false || hashes.AddFD(*Fd, CurStat.FileSize, FlHashes) == false) + Hashes hashes(FlHashes); + if (Fd->Seek(0) == false || hashes.AddFD(*Fd, CurStat.FileSize) == false) return false; HashStringList hl = hashes.GetHashStringList(); diff --git a/ftparchive/writer.cc b/ftparchive/writer.cc index db68c21f0..593278590 100644 --- a/ftparchive/writer.cc +++ b/ftparchive/writer.cc @@ -1075,8 +1075,8 @@ bool ReleaseWriter::DoPackage(string FileName) CheckSums[NewFileName].size = fd.Size(); - Hashes hs; - hs.AddFD(fd, 0, DoHashes); + Hashes hs(DoHashes); + hs.AddFD(fd); CheckSums[NewFileName].Hashes = hs.GetHashStringList(); fd.Close(); -- cgit v1.2.3 From 5f4fcd88bdabee993dd07244d2f0f8f3658c40f2 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Sun, 10 May 2015 00:44:29 +0200 Subject: fix 'Source' to 'Package' rename in apt-ftparchive MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This rename with value is ordered by the 'old' name 'Source', but should be ordered by the new name… by splitting the operation in a delete and a new field we can easily fix this problem locally for now. --- ftparchive/writer.cc | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'ftparchive') diff --git a/ftparchive/writer.cc b/ftparchive/writer.cc index 593278590..855e0ef79 100644 --- a/ftparchive/writer.cc +++ b/ftparchive/writer.cc @@ -837,7 +837,8 @@ bool SourcesWriter::DoPackage(string FileName) // (5 hardcoded + checksums + maintainer + end marker) std::vector Changes; - Changes.push_back(SetTFRewriteData("Source",Package.c_str(),"Package")); + Changes.push_back(SetTFRewriteData("Source", 0)); + Changes.push_back(SetTFRewriteData("Package",Package.c_str())); if (Files.empty() == false) Changes.push_back(SetTFRewriteData("Files",Files.c_str())); if (ChecksumsSha1.empty() == false) -- cgit v1.2.3 From 88593886a42025d51d76051da5929b044e42efee Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Mon, 11 May 2015 15:08:08 +0200 Subject: rewrite all TFRewrite instances to use the new pkgTagSection::Write MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit While it is mostly busywork to rewrite all instances it actually fixes bugs as the data storage used by the new method is std::string rather than a char*, the later mostly created by c_str() from a std::string which the caller has to ensure keeps in scope – something apt-ftparchive actually didn't ensure and relied on copy-on-write behavior instead which c++11 forbids and hence the new default gcc abi doesn't use it. --- ftparchive/apt-ftparchive.cc | 51 +++++------ ftparchive/contents.cc | 34 ++++---- ftparchive/contents.h | 7 +- ftparchive/multicompress.cc | 19 ++-- ftparchive/multicompress.h | 2 +- ftparchive/writer.cc | 204 ++++++++++++++++++++----------------------- ftparchive/writer.h | 45 +++++----- 7 files changed, 170 insertions(+), 192 deletions(-) (limited to 'ftparchive') diff --git a/ftparchive/apt-ftparchive.cc b/ftparchive/apt-ftparchive.cc index 69b936dff..62108f7ca 100644 --- a/ftparchive/apt-ftparchive.cc +++ b/ftparchive/apt-ftparchive.cc @@ -178,7 +178,9 @@ bool PackageMap::GenPackages(Configuration &Setup,struct CacheDB::Stats &Stats) PkgDone = true; // Create a package writer object. - PackagesWriter Packages(flCombine(CacheDir,BinCacheDB), + MultiCompress Comp(flCombine(ArchiveDir,PkgFile), + PkgCompress,Permissions); + PackagesWriter Packages(&Comp.Input, flCombine(CacheDir,BinCacheDB), flCombine(OverrideDir,BinOverride), flCombine(OverrideDir,ExtraOverride), Arch); @@ -197,10 +199,6 @@ bool PackageMap::GenPackages(Configuration &Setup,struct CacheDB::Stats &Stats) Packages.Stats.DeLinkBytes = Stats.DeLinkBytes; Packages.DeLinkLimit = DeLinkLimit; - // Create a compressor object - MultiCompress Comp(flCombine(ArchiveDir,PkgFile), - PkgCompress,Permissions); - Packages.Output = Comp.Input; if (_error->PendingError() == true) return _error->Error(_("Error processing directory %s"),BaseDir.c_str()); @@ -272,7 +270,9 @@ bool PackageMap::GenSources(Configuration &Setup,struct CacheDB::Stats &Stats) SrcDone = true; // Create a package writer object. - SourcesWriter Sources(flCombine(CacheDir, SrcCacheDB), + MultiCompress Comp(flCombine(ArchiveDir,SrcFile), + SrcCompress,Permissions); + SourcesWriter Sources(&Comp.Input, flCombine(CacheDir, SrcCacheDB), flCombine(OverrideDir,BinOverride), flCombine(OverrideDir,SrcOverride), flCombine(OverrideDir,SrcExtraOverride)); @@ -287,11 +287,7 @@ bool PackageMap::GenSources(Configuration &Setup,struct CacheDB::Stats &Stats) Sources.DeLinkLimit = DeLinkLimit; Sources.Stats.DeLinkBytes = Stats.DeLinkBytes; - - // Create a compressor object - MultiCompress Comp(flCombine(ArchiveDir,SrcFile), - SrcCompress,Permissions); - Sources.Output = Comp.Input; + if (_error->PendingError() == true) return _error->Error(_("Error processing directory %s"),BaseDir.c_str()); @@ -365,16 +361,15 @@ bool PackageMap::GenContents(Configuration &Setup, gettimeofday(&StartTime,0); // Create a package writer object. - ContentsWriter Contents("", Arch); + MultiCompress Comp(flCombine(ArchiveDir,this->Contents), + CntCompress,Permissions); + Comp.UpdateMTime = Setup.FindI("Default::ContentsAge",10)*24*60*60; + ContentsWriter Contents(&Comp.Input, "", Arch); if (PkgExt.empty() == false && Contents.SetExts(PkgExt) == false) return _error->Error(_("Package extension list is too long")); if (_error->PendingError() == true) return false; - MultiCompress Comp(flCombine(ArchiveDir,this->Contents), - CntCompress,Permissions); - Comp.UpdateMTime = Setup.FindI("Default::ContentsAge",10)*24*60*60; - Contents.Output = Comp.Input; if (_error->PendingError() == true) return false; @@ -384,7 +379,7 @@ bool PackageMap::GenContents(Configuration &Setup, FileFd Head(flCombine(OverrideDir,ContentsHead),FileFd::ReadOnly); if (_error->PendingError() == true) return false; - + unsigned long long Size = Head.Size(); unsigned char Buf[4096]; while (Size != 0) @@ -392,17 +387,17 @@ bool PackageMap::GenContents(Configuration &Setup, unsigned long long ToRead = Size; if (Size > sizeof(Buf)) ToRead = sizeof(Buf); - + if (Head.Read(Buf,ToRead) == false) return false; - - if (fwrite(Buf,1,ToRead,Comp.Input) != ToRead) + + if (Comp.Input.Write(Buf, ToRead) == false) return _error->Errno("fwrite",_("Error writing header to contents file")); - + Size -= ToRead; - } - } - + } + } + /* Go over all the package file records and parse all the package files associated with this contents file into one great big honking memory structure, then dump the sorted version */ @@ -676,7 +671,7 @@ static bool SimpleGenPackages(CommandLine &CmdL) Override = CmdL.FileList[2]; // Create a package writer object. - PackagesWriter Packages(_config->Find("APT::FTPArchive::DB"), + PackagesWriter Packages(NULL, _config->Find("APT::FTPArchive::DB"), Override, "", _config->Find("APT::FTPArchive::Architecture")); if (_error->PendingError() == true) return false; @@ -704,7 +699,7 @@ static bool SimpleGenContents(CommandLine &CmdL) return ShowHelp(CmdL); // Create a package writer object. - ContentsWriter Contents(_config->Find("APT::FTPArchive::DB"), _config->Find("APT::FTPArchive::Architecture")); + ContentsWriter Contents(NULL, _config->Find("APT::FTPArchive::DB"), _config->Find("APT::FTPArchive::Architecture")); if (_error->PendingError() == true) return false; @@ -737,7 +732,7 @@ static bool SimpleGenSources(CommandLine &CmdL) SOverride.c_str()); // Create a package writer object. - SourcesWriter Sources(_config->Find("APT::FTPArchive::DB"),Override,SOverride); + SourcesWriter Sources(NULL, _config->Find("APT::FTPArchive::DB"),Override,SOverride); if (_error->PendingError() == true) return false; @@ -764,7 +759,7 @@ static bool SimpleGenRelease(CommandLine &CmdL) string Dir = CmdL.FileList[1]; - ReleaseWriter Release(""); + ReleaseWriter Release(NULL, ""); Release.DirStrip = Dir; if (_error->PendingError() == true) diff --git a/ftparchive/contents.cc b/ftparchive/contents.cc index 8c4181eda..145f3910e 100644 --- a/ftparchive/contents.cc +++ b/ftparchive/contents.cc @@ -38,6 +38,7 @@ #include #include #include +#include #include #include @@ -238,19 +239,19 @@ void GenContents::Add(const char *Dir,const char *Package) // GenContents::WriteSpace - Write a given number of white space chars /*{{{*/ // --------------------------------------------------------------------- /* We mod 8 it and write tabs where possible. */ -void GenContents::WriteSpace(FILE *Out,unsigned int Current,unsigned int Target) +void GenContents::WriteSpace(std::string &out, size_t Current, size_t Target) { if (Target <= Current) Target = Current + 1; - + /* Now we write tabs so long as the next tab stop would not pass the target */ for (; (Current/8 + 1)*8 < Target; Current = (Current/8 + 1)*8) - fputc('\t',Out); + out.append("\t"); // Fill the last bit with spaces for (; Current < Target; Current++) - fputc(' ',Out); + out.append(" "); } /*}}}*/ // GenContents::Print - Display the tree /*{{{*/ @@ -259,13 +260,13 @@ void GenContents::WriteSpace(FILE *Out,unsigned int Current,unsigned int Target) calls itself and runs over each section of the tree printing out the pathname and the hit packages. We use Buf to build the pathname summed over all the directory parents of this node. */ -void GenContents::Print(FILE *Out) +void GenContents::Print(FileFd &Out) { char Buffer[1024]; Buffer[0] = 0; DoPrint(Out,&Root,Buffer); } -void GenContents::DoPrint(FILE *Out,GenContents::Node *Top, char *Buf) +void GenContents::DoPrint(FileFd &Out,GenContents::Node *Top, char *Buf) { if (Top == 0) return; @@ -278,26 +279,27 @@ void GenContents::DoPrint(FILE *Out,GenContents::Node *Top, char *Buf) if (Top->Path != 0) { strcat(Buf,Top->Path); - + // Do not show the item if it is a directory with dups if (Top->Path[strlen(Top->Path)-1] != '/' /*|| Top->Dups == 0*/) { - fputs(Buf,Out); - WriteSpace(Out,strlen(Buf),60); + std::string out = Buf; + WriteSpace(out, out.length(), 60); for (Node *I = Top; I != 0; I = I->Dups) { if (I != Top) - fputc(',',Out); - fputs(I->Package,Out); + out.append(","); + out.append(I->Package); } - fputc('\n',Out); - } - } - + out.append("\n"); + Out.Write(out.c_str(), out.length()); + } + } + // Go along the directory link DoPrint(Out,Top->DirDown,Buf); *OldEnd = 0; - + // Go right DoPrint(Out,Top->BTreeRight,Buf); } diff --git a/ftparchive/contents.h b/ftparchive/contents.h index f58e3278e..953d0d54b 100644 --- a/ftparchive/contents.h +++ b/ftparchive/contents.h @@ -17,6 +17,7 @@ #include class debDebFile; +class FileFd; class GenContents { @@ -54,14 +55,14 @@ class GenContents unsigned long NodeLeft; Node *Grab(Node *Top,const char *Name,const char *Package); - void WriteSpace(FILE *Out,unsigned int Current,unsigned int Target); - void DoPrint(FILE *Out,Node *Top, char *Buf); + void WriteSpace(std::string &out, size_t Current, size_t Target); + void DoPrint(FileFd &Out,Node *Top, char *Buf); public: char *Mystrdup(const char *From); void Add(const char *Dir,const char *Package); - void Print(FILE *Out); + void Print(FileFd &Out); GenContents() : BlockList(0), StrPool(0), StrLeft(0), NodePool(0), NodeLeft(0) {}; diff --git a/ftparchive/multicompress.cc b/ftparchive/multicompress.cc index f35d5304a..08a3cff5a 100644 --- a/ftparchive/multicompress.cc +++ b/ftparchive/multicompress.cc @@ -46,7 +46,6 @@ MultiCompress::MultiCompress(string const &Output,string const &Compress, { Outputs = 0; Outputter = -1; - Input = 0; UpdateMTime = 0; /* Parse the compression string, a space separated lists of compresison @@ -187,12 +186,11 @@ bool MultiCompress::Start() }; close(Pipe[0]); - Input = fdopen(Pipe[1],"w"); - if (Input == 0) - return _error->Errno("fdopen",_("Failed to create FILE*")); - + if (Input.OpenDescriptor(Pipe[1], FileFd::WriteOnly, true) == false) + return false; + if (Outputter == -1) - return _error->Errno("fork",_("Failed to fork")); + return _error->Errno("fork",_("Failed to fork")); return true; } /*}}}*/ @@ -201,11 +199,10 @@ bool MultiCompress::Start() /* */ bool MultiCompress::Die() { - if (Input == 0) + if (Input.IsOpen() == false) return true; - - fclose(Input); - Input = 0; + + Input.Close(); bool Res = ExecWait(Outputter,_("Compress child"),false); Outputter = -1; return Res; @@ -217,7 +214,7 @@ bool MultiCompress::Die() bool MultiCompress::Finalize(unsigned long long &OutSize) { OutSize = 0; - if (Input == 0 || Die() == false) + if (Input.IsOpen() == false || Die() == false) return false; time_t Now; diff --git a/ftparchive/multicompress.h b/ftparchive/multicompress.h index ddd1815a3..161716b86 100644 --- a/ftparchive/multicompress.h +++ b/ftparchive/multicompress.h @@ -48,7 +48,7 @@ class MultiCompress public: // The FD to write to for compression. - FILE *Input; + FileFd Input; unsigned long UpdateMTime; bool Finalize(unsigned long long &OutSize); diff --git a/ftparchive/writer.cc b/ftparchive/writer.cc index 855e0ef79..7cf7e6efc 100644 --- a/ftparchive/writer.cc +++ b/ftparchive/writer.cc @@ -51,20 +51,6 @@ using namespace std; FTWScanner *FTWScanner::Owner; -// SetTFRewriteData - Helper for setting rewrite lists /*{{{*/ -// --------------------------------------------------------------------- -/* */ -static inline TFRewriteData SetTFRewriteData(const char *tag, - const char *rewrite, - const char *newtag = 0) -{ - TFRewriteData tfrd; - tfrd.Tag = tag; - tfrd.Rewrite = rewrite; - tfrd.NewTag = newtag; - return tfrd; -} - /*}}}*/ // ConfigToDoHashes - which hashes to generate /*{{{*/ static void SingleConfigToDoHashes(unsigned int &DoHashes, std::string const &Conf, unsigned int const Flag) { @@ -85,8 +71,15 @@ static void ConfigToDoHashes(unsigned int &DoHashes, std::string const &Conf) // FTWScanner::FTWScanner - Constructor /*{{{*/ // --------------------------------------------------------------------- /* */ -FTWScanner::FTWScanner(string const &Arch): Arch(Arch), DoHashes(~0) +FTWScanner::FTWScanner(FileFd * const GivenOutput, string const &Arch): Arch(Arch), DoHashes(~0) { + if (GivenOutput == NULL) + { + Output = new FileFd; + Output->OpenDescriptor(STDOUT_FILENO, FileFd::WriteOnly, false); + } + else + Output = GivenOutput; ErrorPrinted = false; NoLinkAct = !_config->FindB("APT::FTPArchive::DeLinkAct",true); ConfigToDoHashes(DoHashes, "APT::FTPArchive"); @@ -331,11 +324,10 @@ bool FTWScanner::Delink(string &FileName,const char *OriginalPath, // PackagesWriter::PackagesWriter - Constructor /*{{{*/ // --------------------------------------------------------------------- /* */ -PackagesWriter::PackagesWriter(string const &DB,string const &Overrides,string const &ExtOverrides, +PackagesWriter::PackagesWriter(FileFd * const GivenOutput, string const &DB,string const &Overrides,string const &ExtOverrides, string const &Arch) : - FTWScanner(Arch), Db(DB), Stats(Db.Stats), TransWriter(NULL) + FTWScanner(GivenOutput, Arch), Db(DB), Stats(Db.Stats), TransWriter(NULL) { - Output = stdout; SetExts(".deb .udeb"); DeLinkLimit = 0; @@ -461,32 +453,32 @@ bool PackagesWriter::DoPackage(string FileName) } // This lists all the changes to the fields we are going to make. - std::vector Changes; + std::vector Changes; std::string Size; strprintf(Size, "%llu", (unsigned long long) FileSize); - Changes.push_back(SetTFRewriteData("Size", Size.c_str())); + Changes.push_back(pkgTagSection::Tag::Rewrite("Size", Size)); for (HashStringList::const_iterator hs = Db.HashesList.begin(); hs != Db.HashesList.end(); ++hs) { if (hs->HashType() == "MD5Sum") - Changes.push_back(SetTFRewriteData("MD5sum", hs->HashValue().c_str())); + Changes.push_back(pkgTagSection::Tag::Rewrite("MD5sum", hs->HashValue())); else if (hs->HashType() == "Checksum-FileSize") continue; else - Changes.push_back(SetTFRewriteData(hs->HashType().c_str(), hs->HashValue().c_str())); + Changes.push_back(pkgTagSection::Tag::Rewrite(hs->HashType(), hs->HashValue())); } - Changes.push_back(SetTFRewriteData("Filename", NewFileName.c_str())); - Changes.push_back(SetTFRewriteData("Priority", OverItem->Priority.c_str())); - Changes.push_back(SetTFRewriteData("Status", 0)); - Changes.push_back(SetTFRewriteData("Optional", 0)); + Changes.push_back(pkgTagSection::Tag::Rewrite("Filename", NewFileName)); + Changes.push_back(pkgTagSection::Tag::Rewrite("Priority", OverItem->Priority)); + Changes.push_back(pkgTagSection::Tag::Remove("Status")); + Changes.push_back(pkgTagSection::Tag::Remove("Optional")); string DescriptionMd5; if (LongDescription == false) { MD5Summation descmd5; descmd5.Add(desc.c_str()); DescriptionMd5 = descmd5.Result().Value(); - Changes.push_back(SetTFRewriteData("Description-md5", DescriptionMd5.c_str())); + Changes.push_back(pkgTagSection::Tag::Rewrite("Description-md5", DescriptionMd5)); if (TransWriter != NULL) TransWriter->DoPackage(Package, desc, DescriptionMd5); } @@ -505,7 +497,7 @@ bool PackagesWriter::DoPackage(string FileName) } if (NewMaint.empty() == false) - Changes.push_back(SetTFRewriteData("Maintainer", NewMaint.c_str())); + Changes.push_back(pkgTagSection::Tag::Rewrite("Maintainer", NewMaint)); /* Get rid of the Optional tag. This is an ugly, ugly, ugly hack that dpkg-scanpackages does. Well sort of. dpkg-scanpackages just does renaming @@ -517,19 +509,17 @@ bool PackagesWriter::DoPackage(string FileName) { if (Tags.FindS("Suggests").empty() == false) OptionalStr = Tags.FindS("Suggests") + ", " + OptionalStr; - Changes.push_back(SetTFRewriteData("Suggests", OptionalStr.c_str())); + Changes.push_back(pkgTagSection::Tag::Rewrite("Suggests", OptionalStr)); } for (map::const_iterator I = OverItem->FieldOverride.begin(); I != OverItem->FieldOverride.end(); ++I) - Changes.push_back(SetTFRewriteData(I->first.c_str(),I->second.c_str())); - - Changes.push_back(SetTFRewriteData( 0, 0)); + Changes.push_back(pkgTagSection::Tag::Rewrite(I->first, I->second)); // Rewrite and store the fields. - if (TFRewrite(Output,Tags,TFRewritePackageOrder,Changes.data()) == false) + if (Tags.Write(*Output, TFRewritePackageOrder, Changes) == false || + Output->Write("\n", 1) == false) return false; - fprintf(Output,"\n"); return Db.Finish(); } @@ -539,14 +529,13 @@ bool PackagesWriter::DoPackage(string FileName) // --------------------------------------------------------------------- /* Create a Translation-Master file for this Packages file */ TranslationWriter::TranslationWriter(string const &File, string const &TransCompress, - mode_t const &Permissions) : Output(NULL), - RefCounter(0) + mode_t const &Permissions) : RefCounter(0) { if (File.empty() == true) return; Comp = new MultiCompress(File, TransCompress, Permissions); - Output = Comp->Input; + Output = &Comp->Input; } /*}}}*/ // TranslationWriter::DoPackage - Process a single package /*{{{*/ @@ -565,8 +554,10 @@ bool TranslationWriter::DoPackage(string const &Pkg, string const &Desc, if (Included.find(Record) != Included.end()) return true; - fprintf(Output, "Package: %s\nDescription-md5: %s\nDescription-en: %s\n", + std::string out; + strprintf(out, "Package: %s\nDescription-md5: %s\nDescription-en: %s\n", Pkg.c_str(), MD5.c_str(), Desc.c_str()); + Output->Write(out.c_str(), out.length()); Included.insert(Record); return true; @@ -587,11 +578,10 @@ TranslationWriter::~TranslationWriter() // SourcesWriter::SourcesWriter - Constructor /*{{{*/ // --------------------------------------------------------------------- /* */ -SourcesWriter::SourcesWriter(string const &DB, string const &BOverrides,string const &SOverrides, +SourcesWriter::SourcesWriter(FileFd * const GivenOutput, string const &DB, string const &BOverrides,string const &SOverrides, string const &ExtOverrides) : - Db(DB), Stats(Db.Stats) + FTWScanner(GivenOutput), Db(DB), Stats(Db.Stats) { - Output = stdout; AddPattern("*.dsc"); DeLinkLimit = 0; Buffer = 0; @@ -620,15 +610,16 @@ SourcesWriter::SourcesWriter(string const &DB, string const &BOverrides,string c } /*}}}*/ // SourcesWriter::DoPackage - Process a single package /*{{{*/ -static std::ostream& addDscHash(std::ostream &out, unsigned int const DoHashes, +static std::string getDscHash(unsigned int const DoHashes, Hashes::SupportedHashes const DoIt, pkgTagSection &Tags, char const * const FieldName, HashString const * const Hash, unsigned long long Size, std::string FileName) { if ((DoHashes & DoIt) != DoIt || Tags.Exists(FieldName) == false || Hash == NULL) - return out; + return ""; + std::ostringstream out; out << "\n " << Hash->HashValue() << " " << Size << " " << FileName << "\n " << Tags.FindS(FieldName); - return out; + return out.str(); } bool SourcesWriter::DoPackage(string FileName) { @@ -721,16 +712,10 @@ bool SourcesWriter::DoPackage(string FileName) // Add the dsc to the files hash list string const strippedName = flNotDir(FileName); - std::ostringstream ostreamFiles; - addDscHash(ostreamFiles, DoHashes, Hashes::MD5SUM, Tags, "Files", Db.HashesList.find("MD5Sum"), St.st_size, strippedName); - string const Files = ostreamFiles.str(); - - std::ostringstream ostreamSha1; - addDscHash(ostreamSha1, DoHashes, Hashes::SHA1SUM, Tags, "Checksums-Sha1", Db.HashesList.find("SHA1"), St.st_size, strippedName); - std::ostringstream ostreamSha256; - addDscHash(ostreamSha256, DoHashes, Hashes::SHA256SUM, Tags, "Checksums-Sha256", Db.HashesList.find("SHA256"), St.st_size, strippedName); - std::ostringstream ostreamSha512; - addDscHash(ostreamSha512, DoHashes, Hashes::SHA512SUM, Tags, "Checksums-Sha512", Db.HashesList.find("SHA512"), St.st_size, strippedName); + std::string const Files = getDscHash(DoHashes, Hashes::MD5SUM, Tags, "Files", Db.HashesList.find("MD5Sum"), St.st_size, strippedName); + std::string ChecksumsSha1 = getDscHash(DoHashes, Hashes::SHA1SUM, Tags, "Checksums-Sha1", Db.HashesList.find("SHA1"), St.st_size, strippedName); + std::string ChecksumsSha256 = getDscHash(DoHashes, Hashes::SHA256SUM, Tags, "Checksums-Sha256", Db.HashesList.find("SHA256"), St.st_size, strippedName); + std::string ChecksumsSha512 = getDscHash(DoHashes, Hashes::SHA512SUM, Tags, "Checksums-Sha512", Db.HashesList.find("SHA512"), St.st_size, strippedName); // Strip the DirStrip prefix from the FileName and add the PathPrefix string NewFileName; @@ -752,7 +737,7 @@ bool SourcesWriter::DoPackage(string FileName) char *RealPath = NULL; for (;isspace(*C); C++); while (*C != 0) - { + { // Parse each of the elements if (ParseQuoteWord(C,ParseJnk) == false || ParseQuoteWord(C,ParseJnk) == false || @@ -782,21 +767,21 @@ bool SourcesWriter::DoPackage(string FileName) if (hs->HashType() == "MD5Sum" || hs->HashType() == "Checksum-FileSize") continue; char const * fieldname; - std::ostream * out; + std::string * out; if (hs->HashType() == "SHA1") { fieldname = "Checksums-Sha1"; - out = &ostreamSha1; + out = &ChecksumsSha1; } else if (hs->HashType() == "SHA256") { fieldname = "Checksums-Sha256"; - out = &ostreamSha256; + out = &ChecksumsSha256; } else if (hs->HashType() == "SHA512") { fieldname = "Checksums-Sha512"; - out = &ostreamSha512; + out = &ChecksumsSha512; } else { @@ -805,10 +790,12 @@ bool SourcesWriter::DoPackage(string FileName) } if (Tags.Exists(fieldname) == true) continue; - (*out) << "\n " << hs->HashValue() << " " << Db.GetFileSize() << " " << ParseJnk; + std::ostringstream streamout; + streamout << "\n " << hs->HashValue() << " " << Db.GetFileSize() << " " << ParseJnk; + out->append(streamout.str()); } - // write back the GetFileInfo() stats data + // write back the GetFileInfo() stats data Db.Finish(); } @@ -829,54 +816,48 @@ bool SourcesWriter::DoPackage(string FileName) if (Directory.length() > 2) Directory.erase(Directory.end()-1); - string const ChecksumsSha1 = ostreamSha1.str(); - string const ChecksumsSha256 = ostreamSha256.str(); - string const ChecksumsSha512 = ostreamSha512.str(); - // This lists all the changes to the fields we are going to make. // (5 hardcoded + checksums + maintainer + end marker) - std::vector Changes; + std::vector Changes; - Changes.push_back(SetTFRewriteData("Source", 0)); - Changes.push_back(SetTFRewriteData("Package",Package.c_str())); + Changes.push_back(pkgTagSection::Tag::Remove("Source")); + Changes.push_back(pkgTagSection::Tag::Rewrite("Package", Package)); if (Files.empty() == false) - Changes.push_back(SetTFRewriteData("Files",Files.c_str())); + Changes.push_back(pkgTagSection::Tag::Rewrite("Files", Files)); if (ChecksumsSha1.empty() == false) - Changes.push_back(SetTFRewriteData("Checksums-Sha1",ChecksumsSha1.c_str())); + Changes.push_back(pkgTagSection::Tag::Rewrite("Checksums-Sha1", ChecksumsSha1)); if (ChecksumsSha256.empty() == false) - Changes.push_back(SetTFRewriteData("Checksums-Sha256",ChecksumsSha256.c_str())); + Changes.push_back(pkgTagSection::Tag::Rewrite("Checksums-Sha256", ChecksumsSha256)); if (ChecksumsSha512.empty() == false) - Changes.push_back(SetTFRewriteData("Checksums-Sha512",ChecksumsSha512.c_str())); + Changes.push_back(pkgTagSection::Tag::Rewrite("Checksums-Sha512", ChecksumsSha512)); if (Directory != "./") - Changes.push_back(SetTFRewriteData("Directory",Directory.c_str())); - Changes.push_back(SetTFRewriteData("Priority",BestPrio.c_str())); - Changes.push_back(SetTFRewriteData("Status",0)); + Changes.push_back(pkgTagSection::Tag::Rewrite("Directory", Directory)); + Changes.push_back(pkgTagSection::Tag::Rewrite("Priority", BestPrio)); + Changes.push_back(pkgTagSection::Tag::Remove("Status")); // Rewrite the maintainer field if necessary bool MaintFailed; - string NewMaint = OverItem->SwapMaint(Tags.FindS("Maintainer"),MaintFailed); + string NewMaint = OverItem->SwapMaint(Tags.FindS("Maintainer"), MaintFailed); if (MaintFailed == true) { if (NoOverride == false) { - NewLine(1); + NewLine(1); ioprintf(c1out, _(" %s maintainer is %s not %s\n"), Package.c_str(), Tags.FindS("Maintainer").c_str(), OverItem->OldMaint.c_str()); - } + } } if (NewMaint.empty() == false) - Changes.push_back(SetTFRewriteData("Maintainer", NewMaint.c_str())); - - for (map::const_iterator I = SOverItem->FieldOverride.begin(); + Changes.push_back(pkgTagSection::Tag::Rewrite("Maintainer", NewMaint.c_str())); + + for (map::const_iterator I = SOverItem->FieldOverride.begin(); I != SOverItem->FieldOverride.end(); ++I) - Changes.push_back(SetTFRewriteData(I->first.c_str(),I->second.c_str())); + Changes.push_back(pkgTagSection::Tag::Rewrite(I->first, I->second)); - Changes.push_back(SetTFRewriteData(0, 0)); - // Rewrite and store the fields. - if (TFRewrite(Output,Tags,TFRewriteSourceOrder,Changes.data()) == false) + if (Tags.Write(*Output, TFRewriteSourceOrder, Changes) == false || + Output->Write("\n", 1) == false) return false; - fprintf(Output,"\n"); Stats.Packages++; @@ -887,12 +868,11 @@ bool SourcesWriter::DoPackage(string FileName) // ContentsWriter::ContentsWriter - Constructor /*{{{*/ // --------------------------------------------------------------------- /* */ -ContentsWriter::ContentsWriter(string const &DB, string const &Arch) : - FTWScanner(Arch), Db(DB), Stats(Db.Stats) +ContentsWriter::ContentsWriter(FileFd * const GivenOutput, string const &DB, string const &Arch) : + FTWScanner(GivenOutput, Arch), Db(DB), Stats(Db.Stats) { SetExts(".deb"); - Output = stdout; } /*}}}*/ // ContentsWriter::DoPackage - Process a single package /*{{{*/ @@ -974,7 +954,7 @@ bool ContentsWriter::ReadFromPkgs(string const &PkgFile,string const &PkgCompres // ReleaseWriter::ReleaseWriter - Constructor /*{{{*/ // --------------------------------------------------------------------- /* */ -ReleaseWriter::ReleaseWriter(string const &/*DB*/) +ReleaseWriter::ReleaseWriter(FileFd * const GivenOutput, string const &/*DB*/) : FTWScanner(GivenOutput) { if (_config->FindB("APT::FTPArchive::Release::Default-Patterns", true) == true) { @@ -996,7 +976,6 @@ ReleaseWriter::ReleaseWriter(string const &/*DB*/) } AddPatterns(_config->FindVector("APT::FTPArchive::Release::Patterns")); - Output = stdout; time_t const now = time(NULL); setlocale(LC_TIME, "C"); @@ -1040,7 +1019,8 @@ ReleaseWriter::ReleaseWriter(string const &/*DB*/) if (Value == "") continue; - fprintf(Output, "%s: %s\n", (*I).first.c_str(), Value.c_str()); + std::string const out = I->first + ": " + Value + "\n"; + Output->Write(out.c_str(), out.length()); } ConfigToDoHashes(DoHashes, "APT::FTPArchive::Release"); @@ -1087,29 +1067,35 @@ bool ReleaseWriter::DoPackage(string FileName) /*}}}*/ // ReleaseWriter::Finish - Output the checksums /*{{{*/ // --------------------------------------------------------------------- -static void printChecksumTypeRecord(FILE * const Output, char const * const Type, map const &CheckSums) +static void printChecksumTypeRecord(FileFd &Output, char const * const Type, map const &CheckSums) { - fprintf(Output, "%s:\n", Type); - for(map::const_iterator I = CheckSums.begin(); - I != CheckSums.end(); ++I) - { - HashString const * const hs = I->second.Hashes.find(Type); - if (hs == NULL) - continue; - fprintf(Output, " %s %16llu %s\n", - hs->HashValue().c_str(), - (*I).second.size, - (*I).first.c_str()); - } + { + std::string out; + strprintf(out, "%s:\n", Type); + Output.Write(out.c_str(), out.length()); + } + for(map::const_iterator I = CheckSums.begin(); + I != CheckSums.end(); ++I) + { + HashString const * const hs = I->second.Hashes.find(Type); + if (hs == NULL) + continue; + std::string out; + strprintf(out, " %s %16llu %s\n", + hs->HashValue().c_str(), + (*I).second.size, + (*I).first.c_str()); + Output.Write(out.c_str(), out.length()); + } } void ReleaseWriter::Finish() { if ((DoHashes & Hashes::MD5SUM) == Hashes::MD5SUM) - printChecksumTypeRecord(Output, "MD5Sum", CheckSums); + printChecksumTypeRecord(*Output, "MD5Sum", CheckSums); if ((DoHashes & Hashes::SHA1SUM) == Hashes::SHA1SUM) - printChecksumTypeRecord(Output, "SHA1", CheckSums); + printChecksumTypeRecord(*Output, "SHA1", CheckSums); if ((DoHashes & Hashes::SHA256SUM) == Hashes::SHA256SUM) - printChecksumTypeRecord(Output, "SHA256", CheckSums); + printChecksumTypeRecord(*Output, "SHA256", CheckSums); if ((DoHashes & Hashes::SHA512SUM) == Hashes::SHA512SUM) - printChecksumTypeRecord(Output, "SHA512", CheckSums); + printChecksumTypeRecord(*Output, "SHA512", CheckSums); } diff --git a/ftparchive/writer.h b/ftparchive/writer.h index 226996475..0ba60db5e 100644 --- a/ftparchive/writer.h +++ b/ftparchive/writer.h @@ -42,10 +42,10 @@ class FTWScanner string Arch; const char *OriginalPath; bool ErrorPrinted; - + // Stuff for the delinker bool NoLinkAct; - + static FTWScanner *Owner; static int ScannerFTW(const char *File,const struct stat *sb,int Flag); static int ScannerFile(const char *File, bool const &ReadLink); @@ -59,10 +59,11 @@ class FTWScanner { c1out << endl; ErrorPrinted = true; - } + } } - + public: + FileFd *Output; unsigned int DoHashes; unsigned long DeLinkLimit; @@ -76,8 +77,8 @@ class FTWScanner void AddPattern(char const *Pattern) { Patterns.push_back(Pattern); }; void AddPatterns(std::vector const &patterns) { Patterns.insert(Patterns.end(), patterns.begin(), patterns.end()); }; bool SetExts(string const &Vals); - - FTWScanner(string const &Arch = string()); + + FTWScanner(FileFd * const Output, string const &Arch = string()); virtual ~FTWScanner() {}; }; @@ -86,9 +87,9 @@ class MultiCompress; class TranslationWriter { MultiCompress *Comp; - FILE *Output; std::set Included; unsigned short RefCounter; + FileFd *Output; public: void IncreaseRefCounter() { ++RefCounter; }; @@ -97,7 +98,7 @@ class TranslationWriter bool DoPackage(string const &Pkg, string const &Desc, string const &MD5); TranslationWriter(string const &File, string const &TransCompress, mode_t const &Permissions); - TranslationWriter() : Comp(NULL), Output(NULL), RefCounter(0) {}; + TranslationWriter() : Comp(NULL), RefCounter(0) {}; ~TranslationWriter(); }; @@ -105,7 +106,7 @@ class PackagesWriter : public FTWScanner { Override Over; CacheDB Db; - + public: // Some flags @@ -117,7 +118,6 @@ class PackagesWriter : public FTWScanner // General options string PathPrefix; string DirStrip; - FILE *Output; struct CacheDB::Stats &Stats; TranslationWriter *TransWriter; @@ -126,7 +126,7 @@ class PackagesWriter : public FTWScanner {return Over.ReadExtraOverride(File);}; virtual bool DoPackage(string FileName); - PackagesWriter(string const &DB, + PackagesWriter(FileFd * const Output, string const &DB, string const &Overrides, string const &ExtOverrides = "", string const &Arch = ""); @@ -136,25 +136,24 @@ class PackagesWriter : public FTWScanner class ContentsWriter : public FTWScanner { CacheDB Db; - + GenContents Gen; - + public: // General options - FILE *Output; struct CacheDB::Stats &Stats; string Prefix; - + bool DoPackage(string FileName,string Package); virtual bool DoPackage(string FileName) {return DoPackage(FileName,string());}; bool ReadFromPkgs(string const &PkgFile,string const &PkgCompress); - void Finish() {Gen.Print(Output);}; + void Finish() {Gen.Print(*Output);}; inline bool ReadyDB(string const &DB) {return Db.ReadyDB(DB);}; - - ContentsWriter(string const &DB, string const &Arch = string()); + + ContentsWriter(FileFd * const Output, string const &DB, string const &Arch = string()); virtual ~ContentsWriter() {}; }; @@ -165,21 +164,20 @@ class SourcesWriter : public FTWScanner Override SOver; char *Buffer; unsigned long long BufSize; - + public: bool NoOverride; bool DoAlwaysStat; - + // General options string PathPrefix; string DirStrip; - FILE *Output; struct CacheDB::Stats &Stats; virtual bool DoPackage(string FileName); - SourcesWriter(string const &DB,string const &BOverrides,string const &SOverrides, + SourcesWriter(FileFd * const Output, string const &DB,string const &BOverrides,string const &SOverrides, string const &ExtOverrides=string()); virtual ~SourcesWriter() {free(Buffer);}; }; @@ -187,11 +185,10 @@ class SourcesWriter : public FTWScanner class ReleaseWriter : public FTWScanner { public: - ReleaseWriter(string const &DB); + ReleaseWriter(FileFd * const Output, string const &DB); virtual bool DoPackage(string FileName); void Finish(); - FILE *Output; // General options string PathPrefix; string DirStrip; -- cgit v1.2.3