blob: 518d18f59e7964e40fdb0415db1769870226317b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
|
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
// $Id: dpkginit.cc,v 1.2 1999/04/18 06:36:36 jgg Exp $
/* ######################################################################
DPKG init - Initialize the dpkg stuff
##################################################################### */
/*}}}*/
// Includes /*{{{*/
#ifdef __GNUG__
#pragma implementation "apt-pkg/dpkginit.h"
#endif
#include <apt-pkg/dpkginit.h>
#include <apt-pkg/error.h>
#include <apt-pkg/configuration.h>
#include <apt-pkg/fileutl.h>
#include <sys/types.h>
#include <unistd.h>
#include <dirent.h>
/*}}}*/
// DpkgLock::pkgDpkgLock - Constructor /*{{{*/
// ---------------------------------------------------------------------
/* */
pkgDpkgLock::pkgDpkgLock()
{
LockFD = -1;
GetLock();
}
/*}}}*/
// DpkgLock::~pkgDpkgLock - Destructor /*{{{*/
// ---------------------------------------------------------------------
/* */
pkgDpkgLock::~pkgDpkgLock()
{
Close();
}
/*}}}*/
// DpkgLock::GetLock - Get the lock /*{{{*/
// ---------------------------------------------------------------------
/* This mirrors the operations dpkg does when it starts up. Note the
checking of the updates directory. */
bool pkgDpkgLock::GetLock()
{
// Disable file locking
if (_config->FindB("Debug::NoLocking",false) == true)
return true;
Close();
// Create the lockfile
string AdminDir = flNotFile(_config->Find("Dir::State::status"));
LockFD = ::GetLock(AdminDir + "lock");
if (LockFD == -1)
return _error->Error("Unable to lock the administration directory, "
"are you root?");
// Check for updates.. (dirty)
string File = AdminDir + "updates/";
DIR *DirP = opendir(File.c_str());
if (DirP != 0)
{
/* We ignore any files that are not all digits, this skips .,.. and
some tmp files dpkg will leave behind.. */
bool Damaged = false;
for (struct dirent *Ent = readdir(DirP); Ent != 0; Ent = readdir(DirP))
{
Damaged = true;
for (unsigned int I = 0; Ent->d_name[I] != 0; I++)
{
// Check if its not a digit..
if (isdigit(Ent->d_name[I]) == 0)
{
Damaged = false;
break;
}
}
if (Damaged == true)
break;
}
closedir(DirP);
// Woops, we have to run dpkg to rewrite the status file
if (Damaged == true)
{
Close();
return _error->Error("dpkg was interrupted, you must manually "
"run 'dpkg --configure -a' to correct the problem. ");
}
}
return true;
}
/*}}}*/
// DpkgLock::Close - Close the lock /*{{{*/
// ---------------------------------------------------------------------
/* */
void pkgDpkgLock::Close()
{
close(LockFD);
LockFD = -1;
}
/*}}}*/
|