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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
|
// -*- mode: cpp; mode: fold -*-
// Description /*{{{*/
// $Id: pkgcache.h,v 1.20 1999/05/23 22:55:54 jgg Exp $
/* ######################################################################
Cache - Structure definitions for the cache file
Please see doc/apt-pkg/cache.sgml for a more detailed description of
this format. Also be sure to keep that file up-to-date!!
Clients should always use the CacheIterators classes for access to the
cache. They provide a simple STL-like method for traversing the links
of the datastructure.
See pkgcachegen.h for information about generating cache structures.
##################################################################### */
/*}}}*/
// Header section: pkglib
#ifndef PKGLIB_PKGCACHE_H
#define PKGLIB_PKGCACHE_H
#ifdef __GNUG__
#pragma interface "apt-pkg/pkgcache.h"
#endif
#include <string>
#include <time.h>
#include <apt-pkg/mmap.h>
/* This should be a 32 bit type, larger tyes use too much ram and smaller
types are too small. Where ever possible 'unsigned long' should be used
instead of this internal type */
typedef unsigned int __apt_ptrloc;
class pkgCache
{
public:
// Cache element predeclarations
struct Header;
struct Package;
struct PackageFile;
struct Version;
struct Provides;
struct Dependency;
struct StringItem;
struct VerFile;
// Iterators
class PkgIterator;
class VerIterator;
class DepIterator;
class PrvIterator;
class PkgFileIterator;
class VerFileIterator;
friend PkgIterator;
friend VerIterator;
friend DepIterator;
friend PrvIterator;
friend PkgFileIterator;
friend VerFileIterator;
// These are all the constants used in the cache structures
struct Dep
{
enum DepType {Depends=1,PreDepends=2,Suggests=3,Recommends=4,
Conflicts=5,Replaces=6};
enum DepCompareOp {Or=0x10,NoOp=0,LessEq=0x1,GreaterEq=0x2,Less=0x3,
Greater=0x4,Equals=0x5,NotEquals=0x6};
};
struct State
{
enum VerPriority {Important=1,Required=2,Standard=3,Optional=4,Extra=5};
enum PkgSelectedState {Unknown=0,Install=1,Hold=2,DeInstall=3,Purge=4};
enum PkgInstState {Ok=0,ReInstReq=1,HoldInst=2,HoldReInstReq=3};
enum PkgCurrentState {NotInstalled=0,UnPacked=1,HalfConfigured=2,
UnInstalled=3,HalfInstalled=4,ConfigFiles=5,Installed=6};
};
struct Flag
{
enum PkgFlags {Auto=(1<<0),Essential=(1<<3),Important=(1<<4)};
enum PkgFFlags {NotSource=(1<<0),NotAutomatic=(1<<1)};
};
protected:
// Memory mapped cache file
string CacheFile;
MMap ⤅
unsigned long sHash(string S) const;
unsigned long sHash(const char *S) const;
public:
// Pointers to the arrays of items
Header *HeaderP;
Package *PkgP;
VerFile *VerFileP;
PackageFile *PkgFileP;
Version *VerP;
Provides *ProvideP;
Dependency *DepP;
StringItem *StringItemP;
char *StrP;
virtual bool ReMap();
inline bool Sync() {return Map.Sync();};
inline MMap &GetMap() {return Map;};
// String hashing function (512 range)
inline unsigned long Hash(string S) const {return sHash(S);};
inline unsigned long Hash(const char *S) const {return sHash(S);};
// Usefull transformation things
const char *Priority(unsigned char Priority);
// Accessors
PkgIterator FindPkg(string Name);
Header &Head() {return *HeaderP;};
inline PkgIterator PkgBegin();
inline PkgIterator PkgEnd();
inline PkgFileIterator FileBegin();
inline PkgFileIterator FileEnd();
VerIterator GetCandidateVer(PkgIterator Pkg,bool AllowCurrent = true);
pkgCache(MMap &Map);
virtual ~pkgCache() {};
};
// Header structure
struct pkgCache::Header
{
// Signature information
unsigned long Signature;
short MajorVersion;
short MinorVersion;
bool Dirty;
// Size of structure values
unsigned short HeaderSz;
unsigned short PackageSz;
unsigned short PackageFileSz;
unsigned short VersionSz;
unsigned short DependencySz;
unsigned short ProvidesSz;
unsigned short VerFileSz;
// Structure counts
unsigned long PackageCount;
unsigned long VersionCount;
unsigned long DependsCount;
unsigned long PackageFileCount;
unsigned long VerFileCount;
unsigned long ProvidesCount;
// Offsets
__apt_ptrloc FileList; // struct PackageFile
__apt_ptrloc StringList; // struct StringItem
unsigned long MaxVerFileSize;
/* Allocation pools, there should be one of these for each structure
excluding the header */
DynamicMMap::Pool Pools[7];
// Rapid package name lookup
__apt_ptrloc HashTable[2*1048];
bool CheckSizes(Header &Against) const;
Header();
};
struct pkgCache::Package
{
// Pointers
__apt_ptrloc Name; // Stringtable
__apt_ptrloc VersionList; // Version
__apt_ptrloc TargetVer; // Version
__apt_ptrloc CurrentVer; // Version
__apt_ptrloc TargetDist; // StringTable (StringItem)
__apt_ptrloc Section; // StringTable (StringItem)
// Linked list
__apt_ptrloc NextPackage; // Package
__apt_ptrloc RevDepends; // Dependency
__apt_ptrloc ProvidesList; // Provides
// Install/Remove/Purge etc
unsigned char SelectedState; // What
unsigned char InstState; // Flags
unsigned char CurrentState; // State
unsigned short ID;
unsigned long Flags;
};
struct pkgCache::PackageFile
{
// Names
__apt_ptrloc FileName; // Stringtable
__apt_ptrloc Archive; // Stringtable
__apt_ptrloc Component; // Stringtable
__apt_ptrloc Version; // Stringtable
__apt_ptrloc Origin; // Stringtable
__apt_ptrloc Label; // Stringtable
__apt_ptrloc Architecture; // Stringtable
unsigned long Size;
unsigned long Flags;
// Linked list
__apt_ptrloc NextFile; // PackageFile
unsigned short ID;
time_t mtime; // Modification time for the file
};
struct pkgCache::VerFile
{
__apt_ptrloc File; // PackageFile
__apt_ptrloc NextFile; // PkgVerFile
__apt_ptrloc Offset; // File offset
unsigned short Size;
};
struct pkgCache::Version
{
__apt_ptrloc VerStr; // Stringtable
__apt_ptrloc Section; // StringTable (StringItem)
__apt_ptrloc Arch; // StringTable
// Lists
__apt_ptrloc FileList; // VerFile
__apt_ptrloc NextVer; // Version
__apt_ptrloc DependsList; // Dependency
__apt_ptrloc ParentPkg; // Package
__apt_ptrloc ProvidesList; // Provides
__apt_ptrloc Size; // These are the .deb size
__apt_ptrloc InstalledSize;
unsigned short Hash;
unsigned short ID;
unsigned char Priority;
};
struct pkgCache::Dependency
{
__apt_ptrloc Version; // Stringtable
__apt_ptrloc Package; // Package
__apt_ptrloc NextDepends; // Dependency
__apt_ptrloc NextRevDepends; // Dependency
__apt_ptrloc ParentVer; // Version
// Specific types of depends
unsigned char Type;
unsigned char CompareOp;
unsigned short ID;
};
struct pkgCache::Provides
{
__apt_ptrloc ParentPkg; // Pacakge
__apt_ptrloc Version; // Version
__apt_ptrloc ProvideVersion; // Stringtable
__apt_ptrloc NextProvides; // Provides
__apt_ptrloc NextPkgProv; // Provides
};
struct pkgCache::StringItem
{
__apt_ptrloc String; // Stringtable
__apt_ptrloc NextItem; // StringItem
};
#include <apt-pkg/cacheiterators.h>
inline pkgCache::PkgIterator pkgCache::PkgBegin()
{return PkgIterator(*this);};
inline pkgCache::PkgIterator pkgCache::PkgEnd()
{return PkgIterator(*this,PkgP);};
inline pkgCache::PkgFileIterator pkgCache::FileBegin()
{return PkgFileIterator(*this);};
inline pkgCache::PkgFileIterator pkgCache::FileEnd()
{return PkgFileIterator(*this,PkgFileP);};
#endif
|