/ libpkg / pkg_attributes.c
pkg_attributes.c
  1  /*-
  2   * Copyright (c) 2011-2025 Baptiste Daroussin <bapt@FreeBSD.org>
  3   * Copyright (c) 2011-2012 Julien Laffaye <jlaffaye@FreeBSD.org>
  4   * Copyright (c) 2013 Matthew Seaman <matthew@FreeBSD.org>
  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  	case PKG_ATTR_COMMENT:
379  	case PKG_ATTR_MTREE:
380  	case PKG_ATTR_MESSAGE:
381  	case PKG_ATTR_OLD_VERSION:
382  	case PKG_ATTR_DIGEST:
383  	case PKG_ATTR_LICENSE_LOGIC:
384  	case PKG_ATTR_ROWID:
385  	case PKG_ATTR_TIME:
386  	case PKG_ATTR_OLD_DIGEST:
387  	case PKG_ATTR_DEP_FORMULA:
388  	case PKG_ATTR_CONFLICTS:
389  	case PKG_ATTR_NUM_FIELDS:
390  		break;
391  	}
392  
393  	return (e);
394  }