1 /* 2 * Copyright (c) 2007, Novell Inc. 3 * 4 * This program is licensed under the BSD license, read LICENSE.BSD 5 * for further information 6 */ 7 8 /* 9 * pool.h 10 * 11 */ 12 13 #ifndef LIBSOLV_POOL_H 14 #define LIBSOLV_POOL_H 15 16 #include <stdio.h> 17 18 #include "solvversion.h" 19 #include "pooltypes.h" 20 #include "poolid.h" 21 #include "solvable.h" 22 #include "bitmap.h" 23 #include "queue.h" 24 #include "strpool.h" 25 26 /* well known ids */ 27 #include "knownid.h" 28 29 #ifdef __cplusplus 30 extern "C" { 31 #endif 32 33 /* well known solvable */ 34 #define SYSTEMSOLVABLE 1 35 36 37 /* how many strings to maintain (round robin) */ 38 #define POOL_TMPSPACEBUF 16 39 40 /*----------------------------------------------- */ 41 42 struct _Repo; 43 struct _Repodata; 44 struct _Repokey; 45 struct _KeyValue; 46 47 typedef struct _Datapos { 48 struct _Repo *repo; 49 Id solvid; 50 Id repodataid; 51 Id schema; 52 Id dp; 53 } Datapos; 54 55 struct _Pool_tmpspace { 56 char *buf[POOL_TMPSPACEBUF]; 57 int len[POOL_TMPSPACEBUF]; 58 int n; 59 }; 60 61 struct _Pool { 62 void *appdata; /* application private pointer */ 63 64 struct _Stringpool ss; 65 66 Reldep *rels; /* table of rels: Id -> Reldep */ 67 int nrels; /* number of unique rels */ 68 69 struct _Repo **repos; 70 int nrepos; /* repos allocated */ 71 int urepos; /* repos in use */ 72 73 struct _Repo *installed; /* packages considered installed */ 74 75 Solvable *solvables; 76 int nsolvables; /* solvables allocated */ 77 78 const char **languages; 79 int nlanguages; 80 81 /* package manager type, deb/rpm */ 82 int disttype; 83 84 Id *id2arch; /* map arch ids to scores */ 85 unsigned char *id2color; /* map arch ids to colors */ 86 Id lastarch; /* last valid entry in id2arch/id2color */ 87 88 Queue vendormap; /* map vendor to vendorclasses mask */ 89 const char **vendorclasses; /* vendor equivalence classes */ 90 91 /* providers data, as two-step indirect list 92 * whatprovides[Id] -> Offset into whatprovidesdata for name 93 * whatprovidesdata[Offset] -> 0-terminated list of solvables providing Id 94 */ 95 Offset *whatprovides; /* Offset to providers of a specific name, Id -> Offset */ 96 Offset *whatprovides_rel; /* Offset to providers of a specific relation, Id -> Offset */ 97 98 Id *whatprovidesdata; /* Ids of solvable providing Id */ 99 Offset whatprovidesdataoff; /* next free slot within whatprovidesdata */ 100 int whatprovidesdataleft; /* number of 'free slots' within whatprovidesdata */ 101 102 /* If nonzero, then consider only the solvables with Ids set in this 103 bitmap for solving. If zero, consider all solvables. */ 104 Map *considered; 105 106 /* callback for REL_NAMESPACE dependencies handled by the application */ 107 Id (*nscallback)(struct _Pool *, void *data, Id name, Id evr); 108 void *nscallbackdata; 109 110 /* debug mask and callback */ 111 int debugmask; 112 void (*debugcallback)(struct _Pool *, void *data, int type, const char *str); 113 void *debugcallbackdata; 114 115 /* load callback */ 116 int (*loadcallback)(struct _Pool *, struct _Repodata *, void *); 117 void *loadcallbackdata; 118 119 /* search position */ 120 Datapos pos; 121 122 Queue pooljobs; /* fixed jobs, like USERINSTALLED/MULTIVERSION */ 123 124 #ifdef LIBSOLV_INTERNAL 125 /* flags to tell the library how the installed package manager works */ 126 int promoteepoch; /* true: missing epoch is replaced by epoch of dependency */ 127 int havedistepoch; /* true: thr release part in the evr may contain a distepoch suffix */ 128 int obsoleteusesprovides; /* true: obsoletes are matched against provides, not names */ 129 int implicitobsoleteusesprovides; /* true: implicit obsoletes due to same name are matched against provides, not names */ 130 int obsoleteusescolors; /* true: obsoletes check arch color */ 131 int noinstalledobsoletes; /* true: ignore obsoletes of installed packages */ 132 int forbidselfconflicts; /* true: packages which conflict with itself are not installable */ 133 134 Id noarchid; /* ARCH_NOARCH, ARCH_ALL, ARCH_ANY, ... */ 135 136 /* hash for rel unification */ 137 Hashtable relhashtbl; /* hashtable: (name,evr,op)Hash -> Id */ 138 Hashval relhashmask; 139 140 Id *languagecache; 141 int languagecacheother; 142 143 /* our tmp space string space */ 144 struct _Pool_tmpspace tmpspace; 145 146 char *errstr; /* last error string */ 147 int errstra; /* allocated space for errstr */ 148 149 char *rootdir; 150 151 int (*custom_vendorcheck)(struct _Pool *, Solvable *, Solvable *); 152 #endif 153 }; 154 155 #define DISTTYPE_RPM 0 156 #define DISTTYPE_DEB 1 157 #define DISTTYPE_ARCH 2 158 #define DISTTYPE_HAIKU 3 159 160 #define SOLV_FATAL (1<<0) 161 #define SOLV_ERROR (1<<1) 162 #define SOLV_WARN (1<<2) 163 #define SOLV_DEBUG_STATS (1<<3) 164 #define SOLV_DEBUG_RULE_CREATION (1<<4) 165 #define SOLV_DEBUG_PROPAGATE (1<<5) 166 #define SOLV_DEBUG_ANALYZE (1<<6) 167 #define SOLV_DEBUG_UNSOLVABLE (1<<7) 168 #define SOLV_DEBUG_SOLUTIONS (1<<8) 169 #define SOLV_DEBUG_POLICY (1<<9) 170 #define SOLV_DEBUG_RESULT (1<<10) 171 #define SOLV_DEBUG_JOB (1<<11) 172 #define SOLV_DEBUG_SOLVER (1<<12) 173 #define SOLV_DEBUG_TRANSACTION (1<<13) 174 175 #define SOLV_DEBUG_TO_STDERR (1<<30) 176 177 #define POOL_FLAG_PROMOTEEPOCH 1 178 #define POOL_FLAG_FORBIDSELFCONFLICTS 2 179 #define POOL_FLAG_OBSOLETEUSESPROVIDES 3 180 #define POOL_FLAG_IMPLICITOBSOLETEUSESPROVIDES 4 181 #define POOL_FLAG_OBSOLETEUSESCOLORS 5 182 #define POOL_FLAG_NOINSTALLEDOBSOLETES 6 183 #define POOL_FLAG_HAVEDISTEPOCH 7 184 185 /* ----------------------------------------------- */ 186 187 188 /* mark dependencies with relation by setting bit31 */ 189 190 #define MAKERELDEP(id) ((id) | 0x80000000) 191 #define ISRELDEP(id) (((id) & 0x80000000) != 0) 192 #define GETRELID(id) ((id) ^ 0x80000000) /* returns Id */ 193 #define GETRELDEP(pool, id) ((pool)->rels + ((id) ^ 0x80000000)) /* returns Reldep* */ 194 195 #define REL_GT 1 196 #define REL_EQ 2 197 #define REL_LT 4 198 199 #define REL_AND 16 200 #define REL_OR 17 201 #define REL_WITH 18 202 #define REL_NAMESPACE 19 203 #define REL_ARCH 20 204 #define REL_FILECONFLICT 21 205 #define REL_COND 22 206 #define REL_COMPAT 23 207 208 #if !defined(__GNUC__) && !defined(__attribute__) 209 # define __attribute__(x) 210 #endif 211 212 extern Pool *pool_create(void); 213 extern void pool_free(Pool *pool); 214 extern void pool_freeallrepos(Pool *pool, int reuseids); 215 216 extern void pool_setdebuglevel(Pool *pool, int level); 217 #ifdef MULTI_SEMANTICS 218 extern void pool_setdisttype(Pool *pool, int disttype); 219 #endif 220 extern int pool_set_flag(Pool *pool, int flag, int value); 221 extern int pool_get_flag(Pool *pool, int flag); 222 extern void pool_setvendorclasses(Pool *pool, const char **vendorclasses); 223 224 extern void pool_debug(Pool *pool, int type, const char *format, ...) __attribute__((format(printf, 3, 4))); 225 extern void pool_setdebugcallback(Pool *pool, void (*debugcallback)(struct _Pool *, void *data, int type, const char *str), void *debugcallbackdata); 226 extern void pool_setdebugmask(Pool *pool, int mask); 227 extern void pool_setloadcallback(Pool *pool, int (*cb)(struct _Pool *, struct _Repodata *, void *), void *loadcbdata); 228 extern void pool_set_custom_vendorcheck(Pool *pool, int (*vendorcheck)(struct _Pool *, Solvable *, Solvable *)); 229 230 231 extern char *pool_alloctmpspace(Pool *pool, int len); 232 extern void pool_freetmpspace(Pool *pool, const char *space); 233 extern char *pool_tmpjoin(Pool *pool, const char *str1, const char *str2, const char *str3); 234 extern char *pool_tmpappend(Pool *pool, const char *str1, const char *str2, const char *str3); 235 extern const char *pool_bin2hex(Pool *pool, const unsigned char *buf, int len); 236 237 extern void pool_set_installed(Pool *pool, struct _Repo *repo); 238 239 extern int pool_error(Pool *pool, int ret, const char *format, ...) __attribute__((format(printf, 3, 4))); 240 extern char *pool_errstr(Pool *pool); 241 242 extern void pool_set_rootdir(Pool *pool, const char *rootdir); 243 extern const char *pool_get_rootdir(Pool *pool); 244 extern char *pool_prepend_rootdir(Pool *pool, const char *dir); 245 extern const char *pool_prepend_rootdir_tmp(Pool *pool, const char *dir); 246 247 /** 248 * Solvable management 249 */ 250 extern Id pool_add_solvable(Pool *pool); 251 extern Id pool_add_solvable_block(Pool *pool, int count); 252 253 extern void pool_free_solvable_block(Pool *pool, Id start, int count, int reuseids); 254 static inline Solvable *pool_id2solvable(const Pool *pool, Id p) 255 { 256 return pool->solvables + p; 257 } 258 259 extern const char *pool_solvable2str(Pool *pool, Solvable *s); 260 static inline const char *pool_solvid2str(Pool *pool, Id p) 261 { 262 return pool_solvable2str(pool, pool->solvables + p); 263 } 264 265 void pool_set_languages(Pool *pool, const char **languages, int nlanguages); 266 Id pool_id2langid(Pool *pool, Id id, const char *lang, int create); 267 268 int solvable_trivial_installable_map(Solvable *s, Map *installedmap, Map *conflictsmap, Map *multiversionmap); 269 int solvable_trivial_installable_repo(Solvable *s, struct _Repo *installed, Map *multiversionmap); 270 int solvable_trivial_installable_queue(Solvable *s, Queue *installed, Map *multiversionmap); 271 int solvable_is_irrelevant_patch(Solvable *s, Map *installedmap); 272 273 void pool_create_state_maps(Pool *pool, Queue *installed, Map *installedmap, Map *conflictsmap); 274 275 int pool_match_nevr_rel(Pool *pool, Solvable *s, Id d); 276 int pool_match_dep(Pool *pool, Id d1, Id d2); 277 278 static inline int pool_match_nevr(Pool *pool, Solvable *s, Id d) 279 { 280 if (!ISRELDEP(d)) 281 return d == s->name; 282 else 283 return pool_match_nevr_rel(pool, s, d); 284 } 285 286 287 /** 288 * Prepares a pool for solving 289 */ 290 extern void pool_createwhatprovides(Pool *pool); 291 extern void pool_addfileprovides(Pool *pool); 292 extern void pool_addfileprovides_queue(Pool *pool, Queue *idq, Queue *idqinst); 293 extern void pool_freewhatprovides(Pool *pool); 294 extern Id pool_queuetowhatprovides(Pool *pool, Queue *q); 295 296 extern Id pool_addrelproviders(Pool *pool, Id d); 297 298 static inline Id pool_whatprovides(Pool *pool, Id d) 299 { 300 Id v; 301 if (!ISRELDEP(d)) 302 return pool->whatprovides[d]; 303 v = GETRELID(d); 304 if (pool->whatprovides_rel[v]) 305 return pool->whatprovides_rel[v]; 306 return pool_addrelproviders(pool, d); 307 } 308 309 static inline Id *pool_whatprovides_ptr(Pool *pool, Id d) 310 { 311 Id off = pool_whatprovides(pool, d); 312 return pool->whatprovidesdata + off; 313 } 314 315 /* search the pool. the following filters are available: 316 * p - search just this solvable 317 * key - search only this key 318 * match - key must match this string 319 */ 320 void pool_search(Pool *pool, Id p, Id key, const char *match, int flags, int (*callback)(void *cbdata, Solvable *s, struct _Repodata *data, struct _Repokey *key, struct _KeyValue *kv), void *cbdata); 321 322 void pool_clear_pos(Pool *pool); 323 324 325 typedef struct _DUChanges { 326 const char *path; 327 int kbytes; 328 int files; 329 } DUChanges; 330 331 void pool_calc_duchanges(Pool *pool, Map *installedmap, DUChanges *mps, int nmps); 332 int pool_calc_installsizechange(Pool *pool, Map *installedmap); 333 void pool_trivial_installable(Pool *pool, Map *installedmap, Queue *pkgs, Queue *res); 334 void pool_trivial_installable_multiversionmap(Pool *pool, Map *installedmap, Queue *pkgs, Queue *res, Map *multiversionmap); 335 336 const char *pool_lookup_str(Pool *pool, Id entry, Id keyname); 337 Id pool_lookup_id(Pool *pool, Id entry, Id keyname); 338 unsigned long long pool_lookup_num(Pool *pool, Id entry, Id keyname, unsigned long long notfound); 339 int pool_lookup_void(Pool *pool, Id entry, Id keyname); 340 const unsigned char *pool_lookup_bin_checksum(Pool *pool, Id entry, Id keyname, Id *typep); 341 const char *pool_lookup_checksum(Pool *pool, Id entry, Id keyname, Id *typep); 342 const char *pool_lookup_deltalocation(Pool *pool, Id entry, unsigned int *medianrp); 343 344 void pool_add_fileconflicts_deps(Pool *pool, Queue *conflicts); 345 346 347 348 /* loop over all providers of d */ 349 #define FOR_PROVIDES(v, vp, d) \ 350 for (vp = pool_whatprovides(pool, d) ; (v = pool->whatprovidesdata[vp++]) != 0; ) 351 352 /* loop over all repositories */ 353 #define FOR_REPOS(repoid, r) \ 354 for (repoid = 1; repoid < pool->nrepos; repoid++) \ 355 if ((r = pool->repos[repoid]) == 0) \ 356 continue; \ 357 else 358 359 #define FOR_POOL_SOLVABLES(p) \ 360 for (p = 2; p < pool->nsolvables; p++) \ 361 if (pool->solvables[p].repo == 0) \ 362 continue; \ 363 else 364 365 #ifdef ENABLE_COMPS 366 #define ISCONDDEP(id) (ISRELDEP(id) && (GETRELDEP(pool, id))->flags == REL_COND) 367 #define MODIFYCONDDEP(id, tst) do { Reldep *condrd = GETRELDEP(pool, id); Id condp, condpp; FOR_PROVIDES(condrd->evr, condp, condpp) if (tst) break; id = condp ? condrd->name : 0;} while(0) 368 #endif 369 370 #define POOL_DEBUG(type, ...) do {if ((pool->debugmask & (type)) != 0) pool_debug(pool, (type), __VA_ARGS__);} while (0) 371 #define IF_POOLDEBUG(type) if ((pool->debugmask & (type)) != 0) 372 373 #ifdef __cplusplus 374 } 375 #endif 376 377 378 #endif /* LIBSOLV_POOL_H */ 379