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 = ⌖ 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 }