summaryrefslogtreecommitdiff
path: root/meta.h
blob: cc8c0e4c5b6c48f3a16f63386cb58182afb4fc27 (plain)
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
/*
 * meta.h - package metadata (groups, services, permissions, capabilities)
 * https://rawnix.org
 *
 * Copyright (c) 2025 zorz@gmx.com
 * SPDX-License-Identifier: BSD-2-Clause
 */

#ifndef META_H
#define META_H

#include "util.h"
#include "db.h"

/* meta file lives at PKG_METADIR/<pkgname> inside the package archive */

typedef struct {
    strarray_t *groups;
    strarray_t *services;
    strarray_t *permissions;
    strarray_t *capabilities;
} pkg_meta_t;

/* read meta file from path (missing file returns empty meta, never NULL) */
pkg_meta_t *meta_read(const char *path);

/* extract meta file from archive into a temp dir and read it */
pkg_meta_t *meta_extract(const char *archive, const char *pkgname);

void meta_free(pkg_meta_t *m);

/* called after archive extraction */
void meta_add_groups(pkg_meta_t *m, const char *root);
void meta_add_services(pkg_meta_t *m, const char *root);
void meta_apply_permissions(pkg_meta_t *m, const char *root);
void meta_apply_capabilities(pkg_meta_t *m, const char *root);

/* called before file removal */
void meta_del_services(pkg_meta_t *m, const char *root);
void meta_prune_service_dirs(pkg_meta_t *m, const char *root);

/* called after file removal — removes groups no longer used by any package */
void meta_del_groups(pkg_meta_t *m, const char *root, const char *pkgname);

/* post-install / post-remove triggers (fc-cache, glib schemas, etc.) */
void run_triggers(const char *root, strarray_t *files, int upgrade);

/* run ldconfig if /etc/ld.so.conf exists (no-op on musl) */
void run_ldconfig(const char *root);

/*
 * Remove files owned by a package from the filesystem.
 * Skips files shared with other packages and files in keep list.
 * Removes deepest entries first (reverse sorted order).
 */
void remove_pkg_files(const char *root, strarray_t *files, pkgdb_t *db,
                      const char *skip_pkg, strarray_t *keep);

#endif /* META_H */