summaryrefslogtreecommitdiff
path: root/apt-pkg/deb
diff options
context:
space:
mode:
authorMichael Vogt <michael.vogt@ubuntu.com>2011-06-08 12:17:49 +0200
committerMichael Vogt <michael.vogt@ubuntu.com>2011-06-08 12:17:49 +0200
commit36b8ebbb4a5db4909c3cf739d8ea472f70703662 (patch)
tree1f61af2b972794c17cc926e8b6746db71d9f744a /apt-pkg/deb
parent12cd178d6eb61306cc99e5e07c463c800d406771 (diff)
parentff72bd0dc7bd4d3bb6979e70d7bca9a07d28af28 (diff)
* [ABI-Break] Implement EDSP in libapt-pkg so that all front-ends which
* [ABI-Break] merge lp:~mvo/apt/sha512-template to add support for sha512 * [ABI-Break] merge lp:~mvo/apt/dpointer to support easier extending without breaking the ABI
Diffstat (limited to 'apt-pkg/deb')
-rw-r--r--apt-pkg/deb/debindexfile.h16
-rw-r--r--apt-pkg/deb/deblistparser.h6
-rw-r--r--apt-pkg/deb/debmetaindex.h4
-rw-r--r--apt-pkg/deb/debrecords.h4
-rw-r--r--apt-pkg/deb/debsrcrecords.h5
-rw-r--r--apt-pkg/deb/debsystem.cc62
-rw-r--r--apt-pkg/deb/debsystem.h13
-rw-r--r--apt-pkg/deb/dpkgpm.cc108
-rw-r--r--apt-pkg/deb/dpkgpm.h11
9 files changed, 138 insertions, 91 deletions
diff --git a/apt-pkg/deb/debindexfile.h b/apt-pkg/deb/debindexfile.h
index 6697c5f26..678c22473 100644
--- a/apt-pkg/deb/debindexfile.h
+++ b/apt-pkg/deb/debindexfile.h
@@ -22,6 +22,9 @@
class debStatusIndex : public pkgIndexFile
{
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
protected:
string File;
@@ -41,10 +44,14 @@ class debStatusIndex : public pkgIndexFile
virtual pkgCache::PkgFileIterator FindInCache(pkgCache &Cache) const;
debStatusIndex(string File);
+ virtual ~debStatusIndex() {};
};
class debPackagesIndex : public pkgIndexFile
{
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
string URI;
string Dist;
string Section;
@@ -74,10 +81,14 @@ class debPackagesIndex : public pkgIndexFile
debPackagesIndex(string const &URI, string const &Dist, string const &Section,
bool const &Trusted, string const &Arch = "native");
+ virtual ~debPackagesIndex() {};
};
class debTranslationsIndex : public pkgIndexFile
{
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
string URI;
string Dist;
string Section;
@@ -105,10 +116,14 @@ class debTranslationsIndex : public pkgIndexFile
virtual pkgCache::PkgFileIterator FindInCache(pkgCache &Cache) const;
debTranslationsIndex(string URI,string Dist,string Section, char const * const Language);
+ virtual ~debTranslationsIndex() {};
};
class debSourcesIndex : public pkgIndexFile
{
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
string URI;
string Dist;
string Section;
@@ -138,6 +153,7 @@ class debSourcesIndex : public pkgIndexFile
virtual unsigned long Size() const;
debSourcesIndex(string URI,string Dist,string Section,bool Trusted);
+ virtual ~debSourcesIndex() {};
};
#endif
diff --git a/apt-pkg/deb/deblistparser.h b/apt-pkg/deb/deblistparser.h
index 8b8aff788..41d712fbf 100644
--- a/apt-pkg/deb/deblistparser.h
+++ b/apt-pkg/deb/deblistparser.h
@@ -26,8 +26,11 @@ class debListParser : public pkgCacheGenerator::ListParser
unsigned char Val;
};
- protected:
+ private:
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+ protected:
pkgTagFile Tags;
pkgTagSection Section;
unsigned long iOffset;
@@ -74,6 +77,7 @@ class debListParser : public pkgCacheGenerator::ListParser
static const char *ConvertRelation(const char *I,unsigned int &Op);
debListParser(FileFd *File, string const &Arch = "");
+ virtual ~debListParser() {};
};
#endif
diff --git a/apt-pkg/deb/debmetaindex.h b/apt-pkg/deb/debmetaindex.h
index 1561c6e00..0aaf7f14a 100644
--- a/apt-pkg/deb/debmetaindex.h
+++ b/apt-pkg/deb/debmetaindex.h
@@ -19,12 +19,14 @@ class debReleaseIndex : public metaIndex {
};
private:
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
std::map<string, vector<debSectionEntry const*> > ArchEntries;
public:
debReleaseIndex(string const &URI, string const &Dist);
- ~debReleaseIndex();
+ virtual ~debReleaseIndex();
virtual string ArchiveURI(string const &File) const {return URI + File;};
virtual bool GetIndexes(pkgAcquire *Owner, bool const &GetAll=false) const;
diff --git a/apt-pkg/deb/debrecords.h b/apt-pkg/deb/debrecords.h
index 05159ea1e..9692ac94c 100644
--- a/apt-pkg/deb/debrecords.h
+++ b/apt-pkg/deb/debrecords.h
@@ -20,6 +20,9 @@
class debRecordParser : public pkgRecords::Parser
{
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
FileFd File;
pkgTagFile Tags;
pkgTagSection Section;
@@ -50,6 +53,7 @@ class debRecordParser : public pkgRecords::Parser
virtual void GetRec(const char *&Start,const char *&Stop);
debRecordParser(string FileName,pkgCache &Cache);
+ virtual ~debRecordParser() {};
};
#endif
diff --git a/apt-pkg/deb/debsrcrecords.h b/apt-pkg/deb/debsrcrecords.h
index 905264daa..aa859b0e6 100644
--- a/apt-pkg/deb/debsrcrecords.h
+++ b/apt-pkg/deb/debsrcrecords.h
@@ -18,6 +18,9 @@
class debSrcRecordParser : public pkgSrcRecords::Parser
{
+ /** \brief dpointer placeholder (for later in case we need it) */
+ void *d;
+
FileFd Fd;
pkgTagFile Tags;
pkgTagSection Sect;
@@ -50,7 +53,7 @@ class debSrcRecordParser : public pkgSrcRecords::Parser
debSrcRecordParser(string const &File,pkgIndexFile const *Index)
: Parser(Index), Fd(File,FileFd::ReadOnlyGzip), Tags(&Fd,102400),
Buffer(0), BufSize(0) {}
- ~debSrcRecordParser();
+ virtual ~debSrcRecordParser();
};
#endif
diff --git a/apt-pkg/deb/debsystem.cc b/apt-pkg/deb/debsystem.cc
index 8619822df..7644bc66b 100644
--- a/apt-pkg/deb/debsystem.cc
+++ b/apt-pkg/deb/debsystem.cc
@@ -26,15 +26,24 @@
debSystem debSys;
+class debSystemPrivate {
+public:
+ debSystemPrivate() : LockFD(-1), LockCount(0), StatusFile(0)
+ {
+ }
+ // For locking support
+ int LockFD;
+ unsigned LockCount;
+
+ debStatusIndex *StatusFile;
+};
+
// System::debSystem - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* */
debSystem::debSystem()
{
- LockFD = -1;
- LockCount = 0;
- StatusFile = 0;
-
+ d = new debSystemPrivate();
Label = "Debian dpkg interface";
VS = &debVS;
}
@@ -44,7 +53,8 @@ debSystem::debSystem()
/* */
debSystem::~debSystem()
{
- delete StatusFile;
+ delete d->StatusFile;
+ delete d;
}
/*}}}*/
// System::Lock - Get the lock /*{{{*/
@@ -54,16 +64,16 @@ debSystem::~debSystem()
bool debSystem::Lock()
{
// Disable file locking
- if (_config->FindB("Debug::NoLocking",false) == true || LockCount > 1)
+ if (_config->FindB("Debug::NoLocking",false) == true || d->LockCount > 1)
{
- LockCount++;
+ d->LockCount++;
return true;
}
// Create the lockfile
string AdminDir = flNotFile(_config->Find("Dir::State::status"));
- LockFD = GetLock(AdminDir + "lock");
- if (LockFD == -1)
+ d->LockFD = GetLock(AdminDir + "lock");
+ if (d->LockFD == -1)
{
if (errno == EACCES || errno == EAGAIN)
return _error->Error(_("Unable to lock the administration directory (%s), "
@@ -76,8 +86,8 @@ bool debSystem::Lock()
// See if we need to abort with a dirty journal
if (CheckUpdates() == true)
{
- close(LockFD);
- LockFD = -1;
+ close(d->LockFD);
+ d->LockFD = -1;
const char *cmd;
if (getenv("SUDO_USER") != NULL)
cmd = "sudo dpkg --configure -a";
@@ -89,7 +99,7 @@ bool debSystem::Lock()
"run '%s' to correct the problem. "), cmd);
}
- LockCount++;
+ d->LockCount++;
return true;
}
@@ -99,15 +109,15 @@ bool debSystem::Lock()
/* */
bool debSystem::UnLock(bool NoErrors)
{
- if (LockCount == 0 && NoErrors == true)
+ if (d->LockCount == 0 && NoErrors == true)
return false;
- if (LockCount < 1)
+ if (d->LockCount < 1)
return _error->Error(_("Not locked"));
- if (--LockCount == 0)
+ if (--d->LockCount == 0)
{
- close(LockFD);
- LockCount = 0;
+ close(d->LockFD);
+ d->LockCount = 0;
}
return true;
@@ -168,9 +178,9 @@ bool debSystem::Initialize(Configuration &Cnf)
Cnf.CndSet("Dir::State::status","/var/lib/dpkg/status");
Cnf.CndSet("Dir::Bin::dpkg","/usr/bin/dpkg");
- if (StatusFile) {
- delete StatusFile;
- StatusFile = 0;
+ if (d->StatusFile) {
+ delete d->StatusFile;
+ d->StatusFile = 0;
}
return true;
@@ -208,9 +218,9 @@ signed debSystem::Score(Configuration const &Cnf)
/* */
bool debSystem::AddStatusFiles(vector<pkgIndexFile *> &List)
{
- if (StatusFile == 0)
- StatusFile = new debStatusIndex(_config->FindFile("Dir::State::status"));
- List.push_back(StatusFile);
+ if (d->StatusFile == 0)
+ d->StatusFile = new debStatusIndex(_config->FindFile("Dir::State::status"));
+ List.push_back(d->StatusFile);
return true;
}
/*}}}*/
@@ -220,11 +230,11 @@ bool debSystem::AddStatusFiles(vector<pkgIndexFile *> &List)
bool debSystem::FindIndex(pkgCache::PkgFileIterator File,
pkgIndexFile *&Found) const
{
- if (StatusFile == 0)
+ if (d->StatusFile == 0)
return false;
- if (StatusFile->FindInCache(*File.Cache()) == File)
+ if (d->StatusFile->FindInCache(*File.Cache()) == File)
{
- Found = StatusFile;
+ Found = d->StatusFile;
return true;
}
diff --git a/apt-pkg/deb/debsystem.h b/apt-pkg/deb/debsystem.h
index 5f9995e5d..232155256 100644
--- a/apt-pkg/deb/debsystem.h
+++ b/apt-pkg/deb/debsystem.h
@@ -12,16 +12,15 @@
#include <apt-pkg/pkgsystem.h>
+class debSystemPrivate;
+
class debStatusIndex;
class debSystem : public pkgSystem
{
- // For locking support
- int LockFD;
- unsigned LockCount;
+ // private d-pointer
+ debSystemPrivate *d;
bool CheckUpdates();
-
- debStatusIndex *StatusFile;
-
+
public:
virtual bool Lock();
@@ -35,7 +34,7 @@ class debSystem : public pkgSystem
pkgIndexFile *&Found) const;
debSystem();
- ~debSystem();
+ virtual ~debSystem();
};
extern debSystem debSys;
diff --git a/apt-pkg/deb/dpkgpm.cc b/apt-pkg/deb/dpkgpm.cc
index b37980b7e..cd7c4e5d5 100644
--- a/apt-pkg/deb/dpkgpm.cc
+++ b/apt-pkg/deb/dpkgpm.cc
@@ -44,6 +44,21 @@
using namespace std;
+class pkgDPkgPMPrivate
+{
+public:
+ pkgDPkgPMPrivate() : dpkgbuf_pos(0), term_out(NULL), history_out(NULL)
+ {
+ }
+ bool stdin_is_dev_null;
+ // the buffer we use for the dpkg status-fd reading
+ char dpkgbuf[1024];
+ int dpkgbuf_pos;
+ FILE *term_out;
+ FILE *history_out;
+ string dpkg_error;
+};
+
namespace
{
// Maps the dpkg "processing" info to human readable names. Entry 0
@@ -108,9 +123,9 @@ ionice(int PID)
// ---------------------------------------------------------------------
/* */
pkgDPkgPM::pkgDPkgPM(pkgDepCache *Cache)
- : pkgPackageManager(Cache), dpkgbuf_pos(0),
- term_out(NULL), history_out(NULL), PackagesDone(0), PackagesTotal(0)
+ : pkgPackageManager(Cache), PackagesDone(0), PackagesTotal(0)
{
+ d = new pkgDPkgPMPrivate();
}
/*}}}*/
// DPkgPM::pkgDPkgPM - Destructor /*{{{*/
@@ -118,6 +133,7 @@ pkgDPkgPM::pkgDPkgPM(pkgDepCache *Cache)
/* */
pkgDPkgPM::~pkgDPkgPM()
{
+ delete d;
}
/*}}}*/
// DPkgPM::Install - Install a package /*{{{*/
@@ -374,7 +390,7 @@ void pkgDPkgPM::DoStdin(int master)
if (len)
write(master, input_buf, len);
else
- stdin_is_dev_null = true;
+ d->stdin_is_dev_null = true;
}
/*}}}*/
// DPkgPM::DoTerminalPty - Read the terminal pty and write log /*{{{*/
@@ -399,8 +415,8 @@ void pkgDPkgPM::DoTerminalPty(int master)
if(len <= 0)
return;
write(1, term_buf, len);
- if(term_out)
- fwrite(term_buf, len, sizeof(char), term_out);
+ if(d->term_out)
+ fwrite(term_buf, len, sizeof(char), d->term_out);
}
/*}}}*/
// DPkgPM::ProcessDpkgStatusBuf /*{{{*/
@@ -604,14 +620,14 @@ void pkgDPkgPM::DoDpkgStatusFd(int statusfd, int OutStatusFd)
char *p, *q;
int len;
- len=read(statusfd, &dpkgbuf[dpkgbuf_pos], sizeof(dpkgbuf)-dpkgbuf_pos);
- dpkgbuf_pos += len;
+ len=read(statusfd, &d->dpkgbuf[d->dpkgbuf_pos], sizeof(d->dpkgbuf)-d->dpkgbuf_pos);
+ d->dpkgbuf_pos += len;
if(len <= 0)
return;
// process line by line if we have a buffer
- p = q = dpkgbuf;
- while((q=(char*)memchr(p, '\n', dpkgbuf+dpkgbuf_pos-p)) != NULL)
+ p = q = d->dpkgbuf;
+ while((q=(char*)memchr(p, '\n', d->dpkgbuf+d->dpkgbuf_pos-p)) != NULL)
{
*q = 0;
ProcessDpkgStatusLine(OutStatusFd, p);
@@ -619,8 +635,8 @@ void pkgDPkgPM::DoDpkgStatusFd(int statusfd, int OutStatusFd)
}
// now move the unprocessed bits (after the final \n that is now a 0x0)
- // to the start and update dpkgbuf_pos
- p = (char*)memrchr(dpkgbuf, 0, dpkgbuf_pos);
+ // to the start and update d->dpkgbuf_pos
+ p = (char*)memrchr(d->dpkgbuf, 0, d->dpkgbuf_pos);
if(p == NULL)
return;
@@ -628,8 +644,8 @@ void pkgDPkgPM::DoDpkgStatusFd(int statusfd, int OutStatusFd)
p++;
// move the unprocessed tail to the start and update pos
- memmove(dpkgbuf, p, p-dpkgbuf);
- dpkgbuf_pos = dpkgbuf+dpkgbuf_pos-p;
+ memmove(d->dpkgbuf, p, p-d->dpkgbuf);
+ d->dpkgbuf_pos = d->dpkgbuf+d->dpkgbuf_pos-p;
}
/*}}}*/
// DPkgPM::WriteHistoryTag /*{{{*/
@@ -641,7 +657,7 @@ void pkgDPkgPM::WriteHistoryTag(string const &tag, string value)
// poor mans rstrip(", ")
if (value[length-2] == ',' && value[length-1] == ' ')
value.erase(length - 2, 2);
- fprintf(history_out, "%s: %s\n", tag.c_str(), value.c_str());
+ fprintf(d->history_out, "%s: %s\n", tag.c_str(), value.c_str());
} /*}}}*/
// DPkgPM::OpenLog /*{{{*/
bool pkgDPkgPM::OpenLog()
@@ -662,13 +678,13 @@ bool pkgDPkgPM::OpenLog()
_config->Find("Dir::Log::Terminal"));
if (!logfile_name.empty())
{
- term_out = fopen(logfile_name.c_str(),"a");
- if (term_out == NULL)
+ d->term_out = fopen(logfile_name.c_str(),"a");
+ if (d->term_out == NULL)
return _error->WarningE("OpenLog", _("Could not open file '%s'"), logfile_name.c_str());
- setvbuf(term_out, NULL, _IONBF, 0);
- SetCloseExec(fileno(term_out), true);
+ setvbuf(d->term_out, NULL, _IONBF, 0);
+ SetCloseExec(fileno(d->term_out), true);
chmod(logfile_name.c_str(), 0600);
- fprintf(term_out, "\nLog started: %s\n", timestr);
+ fprintf(d->term_out, "\nLog started: %s\n", timestr);
}
// write your history
@@ -676,11 +692,11 @@ bool pkgDPkgPM::OpenLog()
_config->Find("Dir::Log::History"));
if (!history_name.empty())
{
- history_out = fopen(history_name.c_str(),"a");
- if (history_out == NULL)
+ d->history_out = fopen(history_name.c_str(),"a");
+ if (d->history_out == NULL)
return _error->WarningE("OpenLog", _("Could not open file '%s'"), history_name.c_str());
chmod(history_name.c_str(), 0644);
- fprintf(history_out, "\nStart-Date: %s\n", timestr);
+ fprintf(d->history_out, "\nStart-Date: %s\n", timestr);
string remove, purge, install, upgrade, downgrade;
for (pkgCache::PkgIterator I = Cache.PkgBegin(); I.end() == false; I++)
{
@@ -710,7 +726,7 @@ bool pkgDPkgPM::OpenLog()
WriteHistoryTag("Downgrade",downgrade);
WriteHistoryTag("Remove",remove);
WriteHistoryTag("Purge",purge);
- fflush(history_out);
+ fflush(d->history_out);
}
return true;
@@ -724,16 +740,16 @@ bool pkgDPkgPM::CloseLog()
struct tm *tmp = localtime(&t);
strftime(timestr, sizeof(timestr), "%F %T", tmp);
- if(term_out)
+ if(d->term_out)
{
- fprintf(term_out, "Log ended: ");
- fprintf(term_out, "%s", timestr);
- fprintf(term_out, "\n");
- fclose(term_out);
+ fprintf(d->term_out, "Log ended: ");
+ fprintf(d->term_out, "%s", timestr);
+ fprintf(d->term_out, "\n");
+ fclose(d->term_out);
}
- term_out = NULL;
+ d->term_out = NULL;
- if(history_out)
+ if(d->history_out)
{
if (disappearedPkgs.empty() == false)
{
@@ -750,12 +766,12 @@ bool pkgDPkgPM::CloseLog()
}
WriteHistoryTag("Disappeared", disappear);
}
- if (dpkg_error.empty() == false)
- fprintf(history_out, "Error: %s\n", dpkg_error.c_str());
- fprintf(history_out, "End-Date: %s\n", timestr);
- fclose(history_out);
+ if (d->dpkg_error.empty() == false)
+ fprintf(d->history_out, "Error: %s\n", d->dpkg_error.c_str());
+ fprintf(d->history_out, "End-Date: %s\n", timestr);
+ fclose(d->history_out);
}
- history_out = NULL;
+ d->history_out = NULL;
return true;
}
@@ -863,7 +879,7 @@ bool pkgDPkgPM::Go(int OutStatusFd)
}
}
- stdin_is_dev_null = false;
+ d->stdin_is_dev_null = false;
// create log
OpenLog();
@@ -1063,8 +1079,8 @@ bool pkgDPkgPM::Go(int OutStatusFd)
const char *s = _("Can not write log, openpty() "
"failed (/dev/pts not mounted?)\n");
fprintf(stderr, "%s",s);
- if(term_out)
- fprintf(term_out, "%s",s);
+ if(d->term_out)
+ fprintf(d->term_out, "%s",s);
master = slave = -1;
} else {
struct termios rtt;
@@ -1194,7 +1210,7 @@ bool pkgDPkgPM::Go(int OutStatusFd)
// wait for input or output here
FD_ZERO(&rfds);
- if (master >= 0 && !stdin_is_dev_null)
+ if (master >= 0 && !d->stdin_is_dev_null)
FD_SET(0, &rfds);
FD_SET(_dpkgin, &rfds);
if(master >= 0)
@@ -1248,14 +1264,14 @@ bool pkgDPkgPM::Go(int OutStatusFd)
RunScripts("DPkg::Post-Invoke");
if (WIFSIGNALED(Status) != 0 && WTERMSIG(Status) == SIGSEGV)
- strprintf(dpkg_error, "Sub-process %s received a segmentation fault.",Args[0]);
+ strprintf(d->dpkg_error, "Sub-process %s received a segmentation fault.",Args[0]);
else if (WIFEXITED(Status) != 0)
- strprintf(dpkg_error, "Sub-process %s returned an error code (%u)",Args[0],WEXITSTATUS(Status));
+ strprintf(d->dpkg_error, "Sub-process %s returned an error code (%u)",Args[0],WEXITSTATUS(Status));
else
- strprintf(dpkg_error, "Sub-process %s exited unexpectedly",Args[0]);
+ strprintf(d->dpkg_error, "Sub-process %s exited unexpectedly",Args[0]);
- if(dpkg_error.size() > 0)
- _error->Error("%s", dpkg_error.c_str());
+ if(d->dpkg_error.size() > 0)
+ _error->Error("%s", d->dpkg_error.c_str());
if(stopOnError)
{
@@ -1402,8 +1418,8 @@ void pkgDPkgPM::WriteApportReport(const char *pkgpath, const char *errormsg)
fprintf(report, "ErrorMessage:\n %s\n", errormsg);
// ensure that the log is flushed
- if(term_out)
- fflush(term_out);
+ if(d->term_out)
+ fflush(d->term_out);
// attach terminal log it if we have it
string logfile_name = _config->FindFile("Dir::Log::Terminal");
diff --git a/apt-pkg/deb/dpkgpm.h b/apt-pkg/deb/dpkgpm.h
index b7b5a6def..ddf9485c7 100644
--- a/apt-pkg/deb/dpkgpm.h
+++ b/apt-pkg/deb/dpkgpm.h
@@ -18,19 +18,12 @@
using std::vector;
using std::map;
+class pkgDPkgPMPrivate;
class pkgDPkgPM : public pkgPackageManager
{
private:
-
- bool stdin_is_dev_null;
-
- // the buffer we use for the dpkg status-fd reading
- char dpkgbuf[1024];
- int dpkgbuf_pos;
- FILE *term_out;
- FILE *history_out;
- string dpkg_error;
+ pkgDPkgPMPrivate *d;
/** \brief record the disappear action and handle accordingly