From 9f81a8dd0ee585a360ae0ae7786959630a8d0be0 Mon Sep 17 00:00:00 2001 From: наб Date: Mon, 11 Nov 2024 16:17:35 +0100 Subject: dpkgpm: lift out CopyIndented() and make_unique_*() for FILEs; use getline() for reading lines instead of 1k buffer --- apt-pkg/deb/dpkgpm.cc | 74 ++++++++++++++++++--------------------------------- 1 file changed, 26 insertions(+), 48 deletions(-) (limited to 'apt-pkg/deb') diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc index 82035ee65..31f81af7c 100644 --- a/apt-pkg/deb/dpkgpm.cc +++ b/apt-pkg/deb/dpkgpm.cc @@ -33,6 +33,7 @@ #include #include #include +#include #include #include #include @@ -2233,6 +2234,27 @@ void pkgDPkgPM::Reset() { List.erase(List.begin(),List.end()); } + +template +struct AptScopeWrapper { + F func; + ~AptScopeWrapper() { func(); } +}; +template +AptScopeWrapper(F) -> AptScopeWrapper; + +static void CopyIndented(const char *header, FILE *from, FILE *to) +{ + if (!from) + return; + + fputs(header, to); + char *line{}; + size_t linelen; + AptScopeWrapper line_deleter{[&] { free(line); }}; + while (getline(&line, &linelen, from) != -1) + fprintf(to, " %s", line); +} /*}}}*/ // pkgDpkgPM::WriteApportReport - write out error report pkg failure /*{{{*/ // --------------------------------------------------------------------- @@ -2406,35 +2428,12 @@ void pkgDPkgPM::WriteApportReport(const char *pkgpath, const char *errormsg) // attach terminal log it if we have it string logfile_name = _config->FindFile("Dir::Log::Terminal", "/dev/null"); if (logfile_name != "/dev/null") - { - FILE *log = NULL; - - fprintf(report, "DpkgTerminalLog:\n"); - log = fopen(logfile_name.c_str(),"r"); - if(log != NULL) - { - char buf[1024]; - while( fgets(buf, sizeof(buf), log) != NULL) - fprintf(report, " %s", buf); - fprintf(report, " \n"); - fclose(log); - } - } + CopyIndented("DpkgTerminalLog:\n", make_unique_FILE(logfile_name, "r").get(), report); // attach history log it if we have it string histfile_name = _config->FindFile("Dir::Log::History", "/dev/null"); if (histfile_name != "/dev/null") - { - fprintf(report, "DpkgHistoryLog:\n"); - FILE* log = fopen(histfile_name.c_str(),"r"); - if(log != NULL) - { - char buf[1024]; - while( fgets(buf, sizeof(buf), log) != NULL) - fprintf(report, " %s", buf); - fclose(log); - } - } + CopyIndented("DpkgHistoryLog:\n", make_unique_FILE(histfile_name, "r").get(), report); // log the ordering, see dpkgpm.h and the "Ops" enum there fprintf(report, "AptOrdering:\n"); @@ -2458,32 +2457,11 @@ void pkgDPkgPM::WriteApportReport(const char *pkgpath, const char *errormsg) // attach dmesg log (to learn about segfaults) if (FileExists("/bin/dmesg")) - { - fprintf(report, "Dmesg:\n"); - FILE *log = popen("/bin/dmesg","r"); - if(log != NULL) - { - char buf[1024]; - while( fgets(buf, sizeof(buf), log) != NULL) - fprintf(report, " %s", buf); - pclose(log); - } - } + CopyIndented("Dmesg:\n", make_unique_popen("/bin/dmesg","r").get(), report); // attach df -l log (to learn about filesystem status) if (FileExists("/bin/df")) - { - - fprintf(report, "Df:\n"); - FILE *log = popen("/bin/df -l -x squashfs","r"); - if(log != NULL) - { - char buf[1024]; - while( fgets(buf, sizeof(buf), log) != NULL) - fprintf(report, " %s", buf); - pclose(log); - } - } + CopyIndented("Df:\n", make_unique_popen("/bin/df -l -x squashfs","r").get(), report); fclose(report); -- cgit v1.2.3-70-g09d2