summaryrefslogtreecommitdiff
path: root/apt-pkg
diff options
context:
space:
mode:
authorDavid Kalnischkies <david@kalnischkies.de>2020-06-28 20:52:09 +0200
committerDavid Kalnischkies <david@kalnischkies.de>2021-02-04 11:00:00 +0100
commit96dc40b19623621a9cc2c5541fb3adbbceb553b1 (patch)
tree405ed81b2c23d21b52324b393c25301056011162 /apt-pkg
parent35af71bc026d85aef4af979aa247e837d91dfc1c (diff)
Replace PrintStatus with SendMessage usage
varg API is a nightmare as the symbols seems different on ever other arch, but more importantly SendMessage does a few checks on the content of the message and it is all outputted via C++ iostreams and not mixed in FILE* which is handy for overriding the streams.
Diffstat (limited to 'apt-pkg')
-rw-r--r--apt-pkg/acquire-method.cc44
-rw-r--r--apt-pkg/acquire-method.h2
-rw-r--r--apt-pkg/contrib/gpgv.cc15
-rw-r--r--apt-pkg/contrib/strutl.cc11
-rw-r--r--apt-pkg/contrib/strutl.h2
5 files changed, 46 insertions, 28 deletions
diff --git a/apt-pkg/acquire-method.cc b/apt-pkg/acquire-method.cc
index 6e1674f7f..089582561 100644
--- a/apt-pkg/acquire-method.cc
+++ b/apt-pkg/acquire-method.cc
@@ -482,9 +482,25 @@ void pkgAcqMethod::PrintStatus(char const * const header, const char* Format,
void pkgAcqMethod::Log(const char *Format,...)
{
va_list args;
- va_start(args,Format);
- PrintStatus("101 Log", Format, args);
- va_end(args);
+ ssize_t size = 400;
+ std::ostringstream outstr;
+ while (true) {
+ bool ret;
+ va_start(args,Format);
+ ret = iovprintf(outstr, Format, args, size);
+ va_end(args);
+ if (ret == true)
+ break;
+ }
+ std::unordered_map<std::string, std::string> fields;
+ if (Queue != 0)
+ try_emplace(fields, "URI", Queue->Uri);
+ else
+ try_emplace(fields, "URI", "<UNKNOWN>");
+ if (not UsedMirror.empty())
+ try_emplace(fields, "UsedMirror", UsedMirror);
+ try_emplace(fields, "Message", outstr.str());
+ SendMessage("101 Log", std::move(fields));
}
/*}}}*/
// AcqMethod::Status - Send a status message /*{{{*/
@@ -493,9 +509,25 @@ void pkgAcqMethod::Log(const char *Format,...)
void pkgAcqMethod::Status(const char *Format,...)
{
va_list args;
- va_start(args,Format);
- PrintStatus("102 Status", Format, args);
- va_end(args);
+ ssize_t size = 400;
+ std::ostringstream outstr;
+ while (true) {
+ bool ret;
+ va_start(args,Format);
+ ret = iovprintf(outstr, Format, args, size);
+ va_end(args);
+ if (ret == true)
+ break;
+ }
+ std::unordered_map<std::string, std::string> fields;
+ if (Queue != 0)
+ try_emplace(fields, "URI", Queue->Uri);
+ else
+ try_emplace(fields, "URI", "<UNKNOWN>");
+ if (not UsedMirror.empty())
+ try_emplace(fields, "UsedMirror", UsedMirror);
+ try_emplace(fields, "Message", outstr.str());
+ SendMessage("102 Status", std::move(fields));
}
/*}}}*/
// AcqMethod::Redirect - Send a redirect message /*{{{*/
diff --git a/apt-pkg/acquire-method.h b/apt-pkg/acquire-method.h
index e854f5ff1..b4b238c4c 100644
--- a/apt-pkg/acquire-method.h
+++ b/apt-pkg/acquire-method.h
@@ -101,7 +101,7 @@ class APT_PUBLIC pkgAcqMethod
bool MediaFail(std::string Required,std::string Drive);
virtual void Exit() {};
- void PrintStatus(char const * const header, const char* Format, va_list &args) const;
+ APT_DEPRECATED_MSG("Use SendMessage instead") void PrintStatus(char const * const header, const char* Format, va_list &args) const;
public:
enum CnfFlags
diff --git a/apt-pkg/contrib/gpgv.cc b/apt-pkg/contrib/gpgv.cc
index 28f3150c3..3368ece84 100644
--- a/apt-pkg/contrib/gpgv.cc
+++ b/apt-pkg/contrib/gpgv.cc
@@ -121,21 +121,6 @@ static bool operator!=(LineBuffer const &buf, APT::StringView const exp) noexcep
And as a cherry on the cake, we use our apt-key wrapper to do part
of the lifting in regards to merging keyrings. Fun for the whole family.
*/
-static bool iovprintf(std::ostream &out, const char *format,
- va_list &args, ssize_t &size) {
- auto S = make_unique_char(malloc(size));
- ssize_t const n = vsnprintf(S.get(), size, format, args);
- if (n > -1 && n < size) {
- out << S.get();
- return true;
- } else {
- if (n > -1)
- size = n + 1;
- else
- size *= 2;
- }
- return false;
-}
static void APT_PRINTF(4) apt_error(std::ostream &outterm, int const statusfd, int fd[2], const char *format, ...)
{
std::ostringstream outstr;
diff --git a/apt-pkg/contrib/strutl.cc b/apt-pkg/contrib/strutl.cc
index 84e79122e..3a0a6eaa3 100644
--- a/apt-pkg/contrib/strutl.cc
+++ b/apt-pkg/contrib/strutl.cc
@@ -26,6 +26,7 @@
#include <limits>
#include <locale>
#include <sstream>
+#include <memory>
#include <sstream>
#include <string>
#include <vector>
@@ -1414,13 +1415,12 @@ unsigned long RegexChoice(RxChoiceList *Rxs,const char **ListBegin,
// ---------------------------------------------------------------------
/* This is used to make the internationalization strings easier to translate
and to allow reordering of parameters */
-static bool iovprintf(ostream &out, const char *format,
+bool iovprintf(std::ostream &out, const char *format,
va_list &args, ssize_t &size) {
- char *S = (char*)malloc(size);
- ssize_t const n = vsnprintf(S, size, format, args);
+ auto S = std::unique_ptr<char,decltype(&free)>{static_cast<char*>(malloc(size)), &free};
+ ssize_t const n = vsnprintf(S.get(), size, format, args);
if (n > -1 && n < size) {
- out << S;
- free(S);
+ out << S.get();
return true;
} else {
if (n > -1)
@@ -1428,7 +1428,6 @@ static bool iovprintf(ostream &out, const char *format,
else
size *= 2;
}
- free(S);
return false;
}
void ioprintf(ostream &out,const char *format,...)
diff --git a/apt-pkg/contrib/strutl.h b/apt-pkg/contrib/strutl.h
index 8669c97a5..b6e6bfdce 100644
--- a/apt-pkg/contrib/strutl.h
+++ b/apt-pkg/contrib/strutl.h
@@ -117,6 +117,8 @@ APT_PUBLIC std::vector<std::string> StringSplit(std::string const &input,
std::string const &sep,
unsigned int maxsplit=std::numeric_limits<unsigned int>::max()) APT_PURE;
+
+APT_HIDDEN bool iovprintf(std::ostream &out, const char *format, va_list &args, ssize_t &size);
APT_PUBLIC void ioprintf(std::ostream &out,const char *format,...) APT_PRINTF(2);
APT_PUBLIC void strprintf(std::string &out,const char *format,...) APT_PRINTF(2);
APT_PUBLIC char *safe_snprintf(char *Buffer,char *End,const char *Format,...) APT_PRINTF(3);