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
|
#ifndef REPREPRO_PACKAGE_H
#define REPREPRO_PACKAGE_H
#include "atoms.h"
struct package {
/*@temp@*/ struct target *target;
const char *name;
const char *control;
size_t controllen;
/* for the following NULL means not yet extracted: */
const char *version;
const char *source;
const char *sourceversion;
architecture_t architecture;
/* used to keep the memory that might be needed for the above,
* only to be used to free once this struct is abandoned */
char *pkgchunk, *pkgname, *pkgversion, *pkgsource, *pkgsrcversion;
};
struct distribution;
struct target;
struct atomlist;
struct logger;
struct trackingdata;
typedef retvalue action_each_target(struct target *, void *);
typedef retvalue action_each_package(struct package *, void *);
/* call <action> for each package of <distribution> */
retvalue package_foreach(struct distribution *, /*@null@*/const struct atomlist *, /*@null@*/const struct atomlist *, /*@null@*/const struct atomlist *, action_each_package, /*@null@*/action_each_target, void *);
/* same but different ways to restrict it */
retvalue package_foreach_c(struct distribution *, /*@null@*/const struct atomlist *, architecture_t, packagetype_t, action_each_package, void *);
/* delete every package decider returns RET_OK for */
retvalue package_remove_each(struct distribution *, const struct atomlist *, const struct atomlist *, const struct atomlist *, action_each_package /*decider*/, struct trackingdata *, void *);
retvalue package_get(struct target *, const char * /*name*/, /*@null@*/ const char */*version*/, /*@out@*/ struct package *);
static inline void package_done(struct package *pkg) {
free(pkg->pkgname);
free(pkg->pkgchunk);
free(pkg->pkgversion);
free(pkg->pkgsource);
free(pkg->pkgsrcversion);
memset(pkg, 0, sizeof(*pkg));
}
retvalue package_getversion(struct package *);
retvalue package_getsource(struct package *);
retvalue package_getarchitecture(struct package *);
static inline char *package_dupversion(struct package *package) {
assert (package->version != NULL);
if (package->pkgversion == NULL)
return strdup(package->version);
else {
// steal version from package
// (caller must ensure it is not freed while still needed)
char *v = package->pkgversion;
package->pkgversion = NULL;
return v;
}
}
struct package_cursor {
/*@temp@*/struct target *target;
struct cursor *cursor;
struct package current;
bool close_database;
};
retvalue package_openiterator(struct target *, bool /*readonly*/, bool /*duplicate*/, /*@out@*/struct package_cursor *);
retvalue package_openduplicateiterator(struct target *t, const char *name, long long, /*@out@*/struct package_cursor *tc);
bool package_next(struct package_cursor *);
retvalue package_closeiterator(struct package_cursor *);
retvalue package_remove(struct package *, /*@null@*/struct logger *, /*@null@*/struct trackingdata *);
retvalue package_remove_by_cursor(struct package_cursor *, /*@null@*/struct logger *, /*@null@*/struct trackingdata *);
retvalue package_newcontrol_by_cursor(struct package_cursor *, const char *, size_t);
retvalue package_check(struct package *, void *);
retvalue package_referenceforsnapshot(struct package *, void *);
retvalue package_rerunnotifiers(struct package *, void *);
#endif
|