39#include "xbps_api_impl.h"
43 xbps_array_t obsoletes,
const char *pkgver, uid_t euid)
51 for (
unsigned int i = 0; i < xbps_array_count(obsoletes); i++) {
52 const char *file = NULL;
53 xbps_array_get_cstring_nocopy(obsoletes, i, &file);
61 if (lstat(file, &st) == 0) {
62 if (euid == st.st_uid)
66 if (errno != ENOENT) {
72 xbps_set_cb_state(xhp, XBPS_STATE_REMOVE_FILE_FAIL,
73 errno, pkgver,
"%s: cannot remove `%s': %s", pkgver,
74 file, strerror(errno));
82 xbps_array_t obsoletes,
87 for (
unsigned int i = 0; i < xbps_array_count(obsoletes); i++) {
88 const char *file = NULL;
89 xbps_array_get_cstring_nocopy(obsoletes, i, &file);
93 if (remove(file) == -1) {
94 xbps_set_cb_state(xhp, XBPS_STATE_REMOVE_FILE_FAIL,
96 "%s: failed to remove `%s': %s", pkgver,
97 file, strerror(errno));
100 xbps_set_cb_state(xhp, XBPS_STATE_REMOVE_FILE,
101 0, pkgver,
"Removed `%s'", file);
109xbps_remove_pkg(
struct xbps_handle *xhp,
const char *pkgver,
bool update)
111 xbps_dictionary_t pkgd = NULL, obsd = NULL;
112 xbps_array_t obsoletes = NULL;
113 char pkgname[XBPS_NAME_SIZE], metafile[PATH_MAX];
130 pkgver, strerror(rv));
135 pkgver, strerror(rv));
141 xbps_set_cb_state(xhp, XBPS_STATE_REMOVE, 0, pkgver, NULL);
143 if (chdir(xhp->
rootdir) == -1) {
145 xbps_set_cb_state(xhp, XBPS_STATE_REMOVE_FAIL,
147 "%s: [remove] failed to chdir to rootdir `%s': %s",
148 pkgver, xhp->
rootdir, strerror(rv));
153 if (state == XBPS_PKG_STATE_HALF_REMOVED)
158 xbps_dictionary_set_bool(pkgd,
"alternatives-update",
true);
172 if (xbps_dictionary_get_dict(xhp->
transd,
"obsolete_files", &obsd))
173 obsoletes = xbps_dictionary_get(obsd, pkgname);
175 if (xbps_array_count(obsoletes) > 0) {
181 if (check_remove_pkg_files(xhp, obsoletes, pkgver, euid)) {
186 if ((rv = remove_pkg_files(xhp, obsoletes, pkgver)) != 0)
194 XBPS_PKG_STATE_HALF_REMOVED);
196 xbps_set_cb_state(xhp, XBPS_STATE_REMOVE_FAIL,
198 "%s: [remove] failed to set state to half-removed: %s",
199 pkgver, strerror(rv));
208 snprintf(metafile,
sizeof(metafile),
"%s/.%s-files.plist", xhp->
metadir, pkgname);
209 if (remove(metafile) == -1) {
210 if (errno != ENOENT) {
211 xbps_set_cb_state(xhp, XBPS_STATE_REMOVE_FAIL,
213 "%s: failed to remove metadata file: %s",
214 pkgver, strerror(errno));
221 xbps_set_cb_state(xhp, XBPS_STATE_REMOVE_DONE, 0, pkgver, NULL);
222 xbps_dictionary_remove(xhp->
pkgdb, pkgname);
225 xbps_set_cb_state(xhp, XBPS_STATE_REMOVE_FAIL, rv, pkgver,
226 "%s: failed to remove package: %s", pkgver, strerror(rv));
int xbps_alternatives_unregister(struct xbps_handle *xhp, xbps_dictionary_t pkgd)
char rootdir[XBPS_MAXPATH]
char metadir[XBPS_MAXPATH]
Generic XBPS structure handler for initialization.
void xbps_dbg_printf(const char *fmt,...)
Prints debug messages to stderr.
xbps_dictionary_t xbps_pkgdb_get_pkg(struct xbps_handle *xhp, const char *pkg)
int xbps_set_pkg_state_dictionary(xbps_dictionary_t dict, pkg_state_t state)
int xbps_pkg_state_dictionary(xbps_dictionary_t dict, pkg_state_t *state)
bool xbps_pkg_name(char *dst, size_t len, const char *pkg)