Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/pkg
Path: blob/main/libpkg/pkg_attributes.c
2065 views
1
/*-
2
* Copyright (c) 2011-2025 Baptiste Daroussin <[email protected]>
3
* Copyright (c) 2011-2012 Julien Laffaye <[email protected]>
4
* Copyright (c) 2013 Matthew Seaman <[email protected]>
5
*
6
* SPDX-License-Identifier: BSD-2-Clause
7
*/
8
9
#include <assert.h>
10
11
#include "pkg.h"
12
#include "private/event.h"
13
#include "private/pkg.h"
14
15
/*
16
* Dep
17
*/
18
void
19
pkg_dep_free(struct pkg_dep *d)
20
{
21
if (d == NULL)
22
return;
23
24
free(d->origin);
25
free(d->name);
26
free(d->version);
27
free(d->uid);
28
free(d);
29
}
30
31
const char *
32
pkg_dep_get(struct pkg_dep const * const d, const pkg_dep_attr attr)
33
{
34
assert(d != NULL);
35
36
switch (attr) {
37
case PKG_DEP_NAME:
38
return (d->name);
39
break;
40
case PKG_DEP_ORIGIN:
41
return (d->origin);
42
break;
43
case PKG_DEP_VERSION:
44
return (d->version);
45
break;
46
default:
47
return (NULL);
48
break;
49
}
50
}
51
52
bool
53
pkg_dep_is_locked(struct pkg_dep const * const d)
54
{
55
assert(d != NULL);
56
57
return d->locked;
58
}
59
60
/*
61
* File
62
*/
63
void
64
pkg_file_free(struct pkg_file *file)
65
{
66
67
free(file->sum);
68
free(file);
69
}
70
71
/*
72
* Script
73
*/
74
75
const char *
76
pkg_script_get(struct pkg const * const p, pkg_script i)
77
{
78
if (p->scripts[i] == NULL)
79
return (NULL);
80
81
fflush(p->scripts[i]->fp);
82
return (p->scripts[i]->buf);
83
}
84
85
/*
86
* Option
87
*/
88
void
89
pkg_option_free(struct pkg_option *option)
90
{
91
if (option == NULL)
92
return;
93
94
free(option->key);
95
free(option->value);
96
free(option->default_value);
97
free(option->description);
98
free(option);
99
}
100
101
/*
102
* Conflicts
103
*/
104
void
105
pkg_conflict_free(struct pkg_conflict *c)
106
{
107
if (c == NULL)
108
return;
109
110
free(c->uid);
111
free(c->digest);
112
free(c);
113
}
114
115
/*
116
* Config files
117
*/
118
void
119
pkg_config_file_free(struct pkg_config_file *c)
120
{
121
if (c == NULL)
122
return;
123
124
free(c->content);
125
free(c);
126
}
127
128
129
/*
130
* kv
131
*/
132
133
struct pkg_kv *
134
pkg_kv_new(const char *key, const char *val)
135
{
136
struct pkg_kv *c;
137
138
c = xcalloc(1, sizeof(struct pkg_kv));
139
c->key = xstrdup(key);
140
c->value = xstrdup(val);
141
142
return (c);
143
}
144
145
void
146
pkg_kv_free(struct pkg_kv *c)
147
{
148
if (c == NULL)
149
return;
150
151
free(c->key);
152
free(c->value);
153
free(c);
154
}
155
156
static int
157
kv_cmp(const void *a, const void *b) {
158
struct pkg_kv *ka = *(struct pkg_kv **)a;
159
struct pkg_kv *kb = *(struct pkg_kv **)b;
160
161
return (strcmp(ka->key, kb->key));
162
}
163
164
struct pkg_kv *
165
pkg_kv_search(kvlist_t *kv, char *el)
166
{
167
struct pkg_kv target = { .key = el, .value = NULL };
168
struct pkg_kv *tgt = &target;
169
if (kv->len == 0)
170
return (NULL);
171
struct pkg_kv **res = bsearch(&tgt, kv->d, kv->len, sizeof(kv->d[0]), kv_cmp);
172
if (res == NULL)
173
return (NULL);
174
return (*res);
175
}
176
177
DEFINE_VEC_INSERT_SORTED_FUNC(kvlist_t, pkg_kv, struct pkg_kv *, kv_cmp)
178
179
void
180
pkg_kv_sort(kvlist_t *kv)
181
{
182
if (kv->len == 0)
183
return;
184
qsort(kv->d, kv->len, sizeof(kv->d[0]), kv_cmp);
185
}
186
187
struct pkg_kvlist_iterator *
188
pkg_kvlist_iterator(struct pkg_kvlist *l)
189
{
190
struct pkg_kvlist_iterator *it = xcalloc(1, sizeof(struct pkg_kvlist_iterator));
191
it->list = l->list;
192
return (it);
193
};
194
195
struct pkg_kv *
196
pkg_kvlist_next(struct pkg_kvlist_iterator *it)
197
{
198
if (it->pos >= it->list->len)
199
return (NULL);
200
return (it->list->d[it->pos++]);
201
}
202
203
struct pkg_stringlist_iterator *
204
pkg_stringlist_iterator(struct pkg_stringlist *l)
205
{
206
struct pkg_stringlist_iterator *it = xcalloc(1, sizeof(struct pkg_stringlist_iterator));
207
it->list = l->list;
208
return (it);
209
};
210
211
const char *
212
pkg_stringlist_next(struct pkg_stringlist_iterator *it)
213
{
214
if (it->pos >= it->list->len)
215
return (NULL);
216
return (it->list->d[it->pos++]);
217
}
218
219
struct pkg_el *
220
pkg_get_element(struct pkg *p, pkg_attr a)
221
{
222
struct pkg_el *e = xcalloc(1, sizeof(*e));
223
224
switch (a) {
225
case PKG_ATTR_NAME:
226
e->string = p->name;
227
e->type = PKG_STR;
228
break;
229
case PKG_ATTR_MAINTAINER:
230
e->string = p->maintainer;
231
e->type = PKG_STR;
232
break;
233
case PKG_ATTR_PREFIX:
234
e->string = p->prefix;
235
e->type = PKG_STR;
236
break;
237
case PKG_ATTR_DESC:
238
e->string = p->desc;
239
e->type = PKG_STR;
240
break;
241
case PKG_ATTR_WWW:
242
e->string = p->www;
243
e->type = PKG_STR;
244
break;
245
case PKG_ATTR_ABI:
246
e->string = p->abi;
247
e->type = PKG_STR;
248
break;
249
case PKG_ATTR_ARCH:
250
e->string = p->altabi;
251
e->type = PKG_STR;
252
break;
253
case PKG_ATTR_VERSION:
254
e->string = p->version;
255
e->type = PKG_STR;
256
break;
257
case PKG_ATTR_ORIGIN:
258
e->string = p->origin;
259
e->type = PKG_STR;
260
break;
261
case PKG_ATTR_UNIQUEID:
262
e->string = p->uid;
263
e->type = PKG_STR;
264
break;
265
case PKG_ATTR_CKSUM:
266
e->string = p->sum;
267
e->type = PKG_STR;
268
break;
269
case PKG_ATTR_REPONAME:
270
e->string = p->reponame;
271
e->type = PKG_STR;
272
break;
273
case PKG_ATTR_REPOPATH:
274
e->string = p->repopath;
275
e->type = PKG_STR;
276
break;
277
case PKG_ATTR_REPOURL:
278
e->string = p->repourl;
279
e->type = PKG_STR;
280
break;
281
case PKG_ATTR_REASON:
282
e->string = p->reason;
283
e->type = PKG_STR;
284
break;
285
case PKG_ATTR_AUTOMATIC:
286
e->boolean = p->automatic;
287
e->type = PKG_BOOLEAN;
288
break;
289
case PKG_ATTR_LOCKED:
290
e->boolean = p->locked;
291
e->type = PKG_BOOLEAN;
292
break;
293
case PKG_ATTR_VITAL:
294
e->boolean = p->vital;
295
e->type = PKG_BOOLEAN;
296
break;
297
case PKG_ATTR_FLATSIZE:
298
e->integer = p->flatsize;
299
e->type = PKG_INTEGER;
300
break;
301
case PKG_ATTR_OLD_FLATSIZE:
302
e->integer = p->old_flatsize;
303
e->type = PKG_INTEGER;
304
break;
305
case PKG_ATTR_PKGSIZE:
306
e->integer = p->pkgsize;
307
e->type = PKG_INTEGER;
308
break;
309
case PKG_ATTR_CATEGORIES:
310
e->stringlist = xcalloc(1, sizeof(struct pkg_stringlist *));
311
e->stringlist->list = &p->categories;
312
e->type = PKG_STRINGLIST;
313
break;
314
case PKG_ATTR_ANNOTATIONS:
315
e->kvlist = xcalloc(1, sizeof(struct pkg_kvlist *));
316
e->kvlist->list = &p->annotations;
317
e->type = PKG_KVLIST;
318
break;
319
case PKG_ATTR_SHLIBS_REQUIRED:
320
e->stringlist = xcalloc(1, sizeof(struct pkg_stringlist *));
321
e->stringlist->list = &p->shlibs_required;
322
e->type = PKG_STRINGLIST;
323
break;
324
case PKG_ATTR_SHLIBS_PROVIDED:
325
e->stringlist = xcalloc(1, sizeof(struct pkg_stringlist *));
326
e->stringlist->list = &p->shlibs_provided;
327
e->type = PKG_STRINGLIST;
328
break;
329
case PKG_ATTR_PROVIDES:
330
e->stringlist = xcalloc(1, sizeof(struct pkg_stringlist *));
331
e->stringlist->list = &p->provides;
332
e->type = PKG_STRINGLIST;
333
break;
334
case PKG_ATTR_REQUIRES:
335
e->stringlist = xcalloc(1, sizeof(struct pkg_stringlist *));
336
e->stringlist->list = &p->requires;
337
e->type = PKG_STRINGLIST;
338
break;
339
case PKG_ATTR_USERS:
340
e->stringlist = xcalloc(1, sizeof(struct pkg_stringlist *));
341
e->stringlist->list = &p->users;
342
e->type = PKG_STRINGLIST;
343
break;
344
case PKG_ATTR_GROUPS:
345
e->stringlist = xcalloc(1, sizeof(struct pkg_stringlist *));
346
e->stringlist->list = &p->groups;
347
e->type = PKG_STRINGLIST;
348
break;
349
case PKG_ATTR_LICENSES:
350
e->stringlist = xcalloc(1, sizeof(struct pkg_stringlist *));
351
e->stringlist->list = &p->licenses;
352
e->type = PKG_STRINGLIST;
353
break;
354
}
355
356
return (e);
357
}
358
359