|
|
@@ -19,6 +19,7 @@
|
|
|
#include <apt-pkg/configuration.h>
|
|
|
#include <apt-pkg/error.h>
|
|
|
#include <apt-pkg/strutl.h>
|
|
|
+#include <apt-pkg/fileutl.h>
|
|
|
|
|
|
#include <apti18n.h>
|
|
|
|
|
|
@@ -29,7 +30,6 @@
|
|
|
#include <dirent.h>
|
|
|
#include <sys/time.h>
|
|
|
#include <errno.h>
|
|
|
-#include <sys/stat.h>
|
|
|
/*}}}*/
|
|
|
|
|
|
using namespace std;
|
|
|
@@ -37,32 +37,72 @@ using namespace std;
|
|
|
// Acquire::pkgAcquire - Constructor /*{{{*/
|
|
|
// ---------------------------------------------------------------------
|
|
|
/* We grab some runtime state from the configuration space */
|
|
|
-pkgAcquire::pkgAcquire(pkgAcquireStatus *Log) : Log(Log)
|
|
|
+pkgAcquire::pkgAcquire() : Queues(0), Workers(0), Configs(0), Log(NULL), ToFetch(0),
|
|
|
+ Debug(_config->FindB("Debug::pkgAcquire",false)),
|
|
|
+ Running(false), LockFD(-1)
|
|
|
{
|
|
|
- Queues = 0;
|
|
|
- Configs = 0;
|
|
|
- Workers = 0;
|
|
|
- ToFetch = 0;
|
|
|
- Running = false;
|
|
|
-
|
|
|
- string Mode = _config->Find("Acquire::Queue-Mode","host");
|
|
|
+ string const Mode = _config->Find("Acquire::Queue-Mode","host");
|
|
|
+ if (strcasecmp(Mode.c_str(),"host") == 0)
|
|
|
+ QueueMode = QueueHost;
|
|
|
+ if (strcasecmp(Mode.c_str(),"access") == 0)
|
|
|
+ QueueMode = QueueAccess;
|
|
|
+}
|
|
|
+pkgAcquire::pkgAcquire(pkgAcquireStatus *Progress) : Queues(0), Workers(0),
|
|
|
+ Configs(0), Log(Progress), ToFetch(0),
|
|
|
+ Debug(_config->FindB("Debug::pkgAcquire",false)),
|
|
|
+ Running(false), LockFD(-1)
|
|
|
+{
|
|
|
+ string const Mode = _config->Find("Acquire::Queue-Mode","host");
|
|
|
if (strcasecmp(Mode.c_str(),"host") == 0)
|
|
|
QueueMode = QueueHost;
|
|
|
if (strcasecmp(Mode.c_str(),"access") == 0)
|
|
|
- QueueMode = QueueAccess;
|
|
|
+ QueueMode = QueueAccess;
|
|
|
+ Setup(Progress, "");
|
|
|
+}
|
|
|
+ /*}}}*/
|
|
|
+// Acquire::Setup - Delayed Constructor /*{{{*/
|
|
|
+// ---------------------------------------------------------------------
|
|
|
+/* Do everything needed to be a complete Acquire object and report the
|
|
|
+ success (or failure) back so the user knows that something is wrong… */
|
|
|
+bool pkgAcquire::Setup(pkgAcquireStatus *Progress, string const &Lock)
|
|
|
+{
|
|
|
+ Log = Progress;
|
|
|
|
|
|
- Debug = _config->FindB("Debug::pkgAcquire",false);
|
|
|
-
|
|
|
- // This is really a stupid place for this
|
|
|
- struct stat St;
|
|
|
- if (stat((_config->FindDir("Dir::State::lists") + "partial/").c_str(),&St) != 0 ||
|
|
|
- S_ISDIR(St.st_mode) == 0)
|
|
|
- _error->Error(_("Lists directory %spartial is missing."),
|
|
|
- _config->FindDir("Dir::State::lists").c_str());
|
|
|
- if (stat((_config->FindDir("Dir::Cache::Archives") + "partial/").c_str(),&St) != 0 ||
|
|
|
- S_ISDIR(St.st_mode) == 0)
|
|
|
- _error->Error(_("Archive directory %spartial is missing."),
|
|
|
- _config->FindDir("Dir::Cache::Archives").c_str());
|
|
|
+ // check for existence and possibly create auxiliary directories
|
|
|
+ if (CheckDirectory(_config->FindDir("Dir::State"), _config->FindDir("Dir::State::lists") + "partial/") == false ||
|
|
|
+ CheckDirectory(_config->FindDir("Dir::Cache"), _config->FindDir("Dir::Cache::Archives") + "partial/") == false)
|
|
|
+ return false;
|
|
|
+
|
|
|
+ if (Lock.empty() == true || _config->FindB("Debug::NoLocking", false) == true)
|
|
|
+ return true;
|
|
|
+
|
|
|
+ // Lock the directory this acquire object will work in
|
|
|
+ LockFD = GetLock(flCombine(Lock, "lock"));
|
|
|
+ if (LockFD == -1)
|
|
|
+ return _error->Error(_("Unable to lock directory %s"), Lock.c_str());
|
|
|
+
|
|
|
+ return true;
|
|
|
+}
|
|
|
+ /*}}}*/
|
|
|
+// Acquire::CheckDirectory - ensure that the given directory exists /*{{{*/
|
|
|
+// ---------------------------------------------------------------------
|
|
|
+/* a small wrapper around CreateDirectory to check if it exists and to
|
|
|
+ remove the trailing "/apt/" from the parent directory if needed */
|
|
|
+bool pkgAcquire::CheckDirectory(string const &Parent, string const &Path) const
|
|
|
+{
|
|
|
+ if (DirectoryExists(Path) == true)
|
|
|
+ return true;
|
|
|
+
|
|
|
+ size_t const len = Parent.size();
|
|
|
+ if (len > 5 && Parent.find("/apt/", len - 6, 5) != len - 5)
|
|
|
+ {
|
|
|
+ if (CreateDirectory(Parent.substr(0,len-5), Path) == true)
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ else if (CreateDirectory(Parent, Path) == true)
|
|
|
+ return true;
|
|
|
+
|
|
|
+ return _error->Errno("Acquire", _("Directory %s can't be created."), Path.c_str());
|
|
|
}
|
|
|
/*}}}*/
|
|
|
// Acquire::~pkgAcquire - Destructor /*{{{*/
|
|
|
@@ -71,7 +111,10 @@ pkgAcquire::pkgAcquire(pkgAcquireStatus *Log) : Log(Log)
|
|
|
pkgAcquire::~pkgAcquire()
|
|
|
{
|
|
|
Shutdown();
|
|
|
-
|
|
|
+
|
|
|
+ if (LockFD != -1)
|
|
|
+ close(LockFD);
|
|
|
+
|
|
|
while (Configs != 0)
|
|
|
{
|
|
|
MethodConfig *Jnk = Configs;
|