Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/pkg
Path: blob/main/libpkg/pkg_attributes.c
2645 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
free(file->path);
67
free(file->uname);
68
free(file->gname);
69
free(file->symlink_target);
70
free(file->sum);
71
free(file->temppath);
72
free(file);
73
}
74
75
void
76
pkg_dir_free(struct pkg_dir *dir)
77
{
78
free(dir->path);
79
free(dir->uname);
80
free(dir->gname);
81
free(dir);
82
}
83
84
/*
85
* Script
86
*/
87
88
const char *
89
pkg_script_get(struct pkg const * const p, pkg_script i)
90
{
91
if (p->scripts[i] == NULL)
92
return (NULL);
93
94
fflush(p->scripts[i]->fp);
95
return (p->scripts[i]->buf);
96
}
97
98
/*
99
* Option
100
*/
101
void
102
pkg_option_free(struct pkg_option *option)
103
{
104
if (option == NULL)
105
return;
106
107
free(option->key);
108
free(option->value);
109
free(option->default_value);
110
free(option->description);
111
free(option);
112
}
113
114
/*
115
* Conflicts
116
*/
117
void
118
pkg_conflict_free(struct pkg_conflict *c)
119
{
120
if (c == NULL)
121
return;
122
123
free(c->uid);
124
free(c->digest);
125
free(c);
126
}
127
128
/*
129
* Config files
130
*/
131
void
132
pkg_config_file_free(struct pkg_config_file *c)
133
{
134
if (c == NULL)
135
return;
136
137
free(c->path);
138
free(c->content);
139
free(c);
140
}
141
142
143
/*
144
* kv
145
*/
146
147
struct pkg_kv *
148
pkg_kv_new(const char *key, const char *val)
149
{
150
struct pkg_kv *c;
151
152
c = xcalloc(1, sizeof(struct pkg_kv));
153
c->key = xstrdup(key);
154
c->value = xstrdup(val);
155
156
return (c);
157
}
158
159
void
160
pkg_kv_free(struct pkg_kv *c)
161
{
162
if (c == NULL)
163
return;
164
165
free(c->key);
166
free(c->value);
167
free(c);
168
}
169
170
static int
171
kv_cmp(const void *a, const void *b) {
172
struct pkg_kv *ka = *(struct pkg_kv **)a;
173
struct pkg_kv *kb = *(struct pkg_kv **)b;
174
175
return (strcmp(ka->key, kb->key));
176
}
177
178
struct pkg_kv *
179
pkg_kv_search(kvlist_t *kv, char *el)
180
{
181
struct pkg_kv target = { .key = el, .value = NULL };
182
struct pkg_kv *tgt = &target;
183
if (kv->len == 0)
184
return (NULL);
185
struct pkg_kv **res = bsearch(&tgt, kv->d, kv->len, sizeof(kv->d[0]), kv_cmp);
186
if (res == NULL)
187
return (NULL);
188
return (*res);
189
}
190
191
DEFINE_VEC_INSERT_SORTED_FUNC(kvlist_t, pkg_kv, struct pkg_kv *, kv_cmp)
192
193
void
194
pkg_kv_sort(kvlist_t *kv)
195
{
196
if (kv->len == 0)
197
return;
198
qsort(kv->d, kv->len, sizeof(kv->d[0]), kv_cmp);
199
}
200
201
struct pkg_kvlist_iterator *
202
pkg_kvlist_iterator(struct pkg_kvlist *l)
203
{
204
struct pkg_kvlist_iterator *it = xcalloc(1, sizeof(struct pkg_kvlist_iterator));
205
it->list = l->list;
206
return (it);
207
};
208
209
struct pkg_kv *
210
pkg_kvlist_next(struct pkg_kvlist_iterator *it)
211
{
212
if (it->pos >= it->list->len)
213
return (NULL);
214
return (it->list->d[it->pos++]);
215
}
216
217
struct pkg_stringlist_iterator *
218
pkg_stringlist_iterator(struct pkg_stringlist *l)
219
{
220
struct pkg_stringlist_iterator *it = xcalloc(1, sizeof(struct pkg_stringlist_iterator));
221
it->list = l->list;
222
return (it);
223
};
224
225
const char *
226
pkg_stringlist_next(struct pkg_stringlist_iterator *it)
227
{
228
if (it->pos >= it->list->len)
229
return (NULL);
230
return (it->list->d[it->pos++]);
231
}
232
233
struct pkg_el *
234
pkg_get_element(struct pkg *p, pkg_attr a)
235
{
236
struct pkg_el *e = xcalloc(1, sizeof(*e));
237
238
switch (a) {
239
case PKG_ATTR_NAME:
240
e->string = p->name;
241
e->type = PKG_STR;
242
break;
243
case PKG_ATTR_MAINTAINER:
244
e->string = p->maintainer;
245
e->type = PKG_STR;
246
break;
247
case PKG_ATTR_PREFIX:
248
e->string = p->prefix;
249
e->type = PKG_STR;
250
break;
251
case PKG_ATTR_DESC:
252
e->string = p->desc;
253
e->type = PKG_STR;
254
break;
255
case PKG_ATTR_WWW:
256
e->string = p->www;
257
e->type = PKG_STR;
258
break;
259
case PKG_ATTR_ABI:
260
e->string = p->abi;
261
e->type = PKG_STR;
262
break;
263
case PKG_ATTR_ARCH:
264
e->string = p->altabi;
265
e->type = PKG_STR;
266
break;
267
case PKG_ATTR_VERSION:
268
e->string = p->version;
269
e->type = PKG_STR;
270
break;
271
case PKG_ATTR_ORIGIN:
272
e->string = p->origin;
273
e->type = PKG_STR;
274
break;
275
case PKG_ATTR_UNIQUEID:
276
e->string = p->uid;
277
e->type = PKG_STR;
278
break;
279
case PKG_ATTR_CKSUM:
280
e->string = p->sum;
281
e->type = PKG_STR;
282
break;
283
case PKG_ATTR_REPONAME:
284
e->string = p->reponame;
285
e->type = PKG_STR;
286
break;
287
case PKG_ATTR_REPOPATH:
288
e->string = p->repopath;
289
e->type = PKG_STR;
290
break;
291
case PKG_ATTR_REPOURL:
292
e->string = p->repourl;
293
e->type = PKG_STR;
294
break;
295
case PKG_ATTR_REASON:
296
e->string = p->reason;
297
e->type = PKG_STR;
298
break;
299
case PKG_ATTR_AUTOMATIC:
300
e->boolean = p->automatic;
301
e->type = PKG_BOOLEAN;
302
break;
303
case PKG_ATTR_LOCKED:
304
e->boolean = p->locked;
305
e->type = PKG_BOOLEAN;
306
break;
307
case PKG_ATTR_VITAL:
308
e->boolean = p->vital;
309
e->type = PKG_BOOLEAN;
310
break;
311
case PKG_ATTR_FLATSIZE:
312
e->integer = p->flatsize;
313
e->type = PKG_INTEGER;
314
break;
315
case PKG_ATTR_OLD_FLATSIZE:
316
e->integer = p->old_flatsize;
317
e->type = PKG_INTEGER;
318
break;
319
case PKG_ATTR_PKGSIZE:
320
e->integer = p->pkgsize;
321
e->type = PKG_INTEGER;
322
break;
323
case PKG_ATTR_CATEGORIES:
324
e->stringlist = xcalloc(1, sizeof(struct pkg_stringlist *));
325
e->stringlist->list = &p->categories;
326
e->type = PKG_STRINGLIST;
327
break;
328
case PKG_ATTR_ANNOTATIONS:
329
e->kvlist = xcalloc(1, sizeof(struct pkg_kvlist *));
330
e->kvlist->list = &p->annotations;
331
e->type = PKG_KVLIST;
332
break;
333
case PKG_ATTR_SHLIBS_REQUIRED:
334
e->stringlist = xcalloc(1, sizeof(struct pkg_stringlist *));
335
e->stringlist->list = &p->shlibs_required;
336
e->type = PKG_STRINGLIST;
337
break;
338
case PKG_ATTR_SHLIBS_REQUIRED_IGNORE:
339
e->stringlist = xcalloc(1, sizeof(struct pkg_stringlist *));
340
e->stringlist->list = &p->shlibs_required_ignore;
341
e->type = PKG_STRINGLIST;
342
break;
343
case PKG_ATTR_SHLIBS_PROVIDED:
344
e->stringlist = xcalloc(1, sizeof(struct pkg_stringlist *));
345
e->stringlist->list = &p->shlibs_provided;
346
e->type = PKG_STRINGLIST;
347
break;
348
case PKG_ATTR_SHLIBS_PROVIDED_IGNORE:
349
e->stringlist = xcalloc(1, sizeof(struct pkg_stringlist *));
350
e->stringlist->list = &p->shlibs_provided;
351
e->type = PKG_STRINGLIST;
352
break;
353
case PKG_ATTR_PROVIDES:
354
e->stringlist = xcalloc(1, sizeof(struct pkg_stringlist *));
355
e->stringlist->list = &p->provides;
356
e->type = PKG_STRINGLIST;
357
break;
358
case PKG_ATTR_REQUIRES:
359
e->stringlist = xcalloc(1, sizeof(struct pkg_stringlist *));
360
e->stringlist->list = &p->requires;
361
e->type = PKG_STRINGLIST;
362
break;
363
case PKG_ATTR_USERS:
364
e->stringlist = xcalloc(1, sizeof(struct pkg_stringlist *));
365
e->stringlist->list = &p->users;
366
e->type = PKG_STRINGLIST;
367
break;
368
case PKG_ATTR_GROUPS:
369
e->stringlist = xcalloc(1, sizeof(struct pkg_stringlist *));
370
e->stringlist->list = &p->groups;
371
e->type = PKG_STRINGLIST;
372
break;
373
case PKG_ATTR_LICENSES:
374
e->stringlist = xcalloc(1, sizeof(struct pkg_stringlist *));
375
e->stringlist->list = &p->licenses;
376
e->type = PKG_STRINGLIST;
377
break;
378
}
379
380
return (e);
381
}
382
383