36#include "xbps_api_impl.h"
60run_post_remove_scripts(
struct xbps_handle *xhp, xbps_array_t remove_scripts)
64 for (
unsigned int i = 0; i < xbps_array_count(remove_scripts); i++) {
65 xbps_dictionary_t dict;
66 xbps_data_t script = NULL;
67 const char *pkgver = NULL;
71 dict = xbps_array_get(remove_scripts, i);
74 xbps_dictionary_get_cstring_nocopy(dict,
"pkgver", &pkgver);
77 script = xbps_dictionary_get(dict,
"remove-script");
80 buf = xbps_data_data_nocopy(script);
81 buflen = xbps_data_size(script);
84 xbps_set_cb_state(xhp, XBPS_STATE_TRANS_FAIL, rv, pkgver,
85 "%s: [trans] REMOVE script failed to execute pre ACTION: %s",
86 pkgver, strerror(rv));
91 xbps_set_cb_state(xhp, XBPS_STATE_TRANS_FAIL, rv, pkgver,
92 "%s: [trans] REMOVE script failed to execute pre ACTION: %s",
93 pkgver, strerror(rv));
105 xbps_array_t remove_scripts;
106 xbps_dictionary_t pkgdb_pkgd;
108 xbps_object_iterator_t iter;
110 const char *pkgver = NULL, *pkgname = NULL;
114 setlocale(LC_ALL,
"");
121 remove_scripts = xbps_array_create();
122 if (remove_scripts == NULL)
123 return errno ? errno : ENOMEM;
125 assert(xbps_object_type(xhp->
transd) == XBPS_TYPE_DICTIONARY);
130 if (errno != EEXIST) {
131 xbps_set_cb_state(xhp, XBPS_STATE_TRANS_FAIL,
133 "[trans] cannot create cachedir `%s': %s",
139 xbps_set_cb_state(xhp, XBPS_STATE_TRANS_FAIL,
141 "[trans] failed to change dir to cachedir `%s': %s",
152 if ((rv = xbps_transaction_fetch(xhp, iter)) != 0) {
153 xbps_dbg_printf(
"[trans] failed to fetch and verify binpkgs: "
154 "%s\n", strerror(rv));
157 if (xhp->
flags & XBPS_FLAG_DOWNLOAD_ONLY) {
165 xbps_fetch_unset_cache_connection();
170 if ((rv = xbps_transaction_internalize(xhp, iter)) < 0) {
171 xbps_dbg_printf(
"[trans] failed to internalize transaction binpkgs: "
172 "%s\n", strerror(-rv));
180 xbps_set_cb_state(xhp, XBPS_STATE_TRANS_FILES, 0, NULL, NULL);
181 if ((rv = xbps_transaction_files(xhp, iter)) != 0) {
182 xbps_dbg_printf(
"[trans] failed to verify transaction files: "
183 "%s\n", strerror(rv));
191 xbps_set_cb_state(xhp, XBPS_STATE_TRANS_RUN, 0, NULL, NULL);
199 xbps_set_cb_state(xhp, XBPS_STATE_TRANS_FAIL, errno, xhp->
rootdir,
200 "[trans] failed to create rootdir `%s': %s",
205 if (chdir(xhp->
rootdir) == -1) {
207 xbps_set_cb_state(xhp, XBPS_STATE_UNPACK_FAIL, rv, xhp->
rootdir,
208 "[trans] failed to chdir to rootdir `%s': %s",
209 xhp->
rootdir, strerror(errno));
219 while ((obj = xbps_object_iterator_next(iter)) != NULL) {
220 xbps_dictionary_t dict;
221 xbps_data_t script = NULL;
222 const char *pkgdb_pkgver;
224 xbps_dictionary_get_cstring_nocopy(obj,
"pkgver", &pkgver);
225 xbps_dictionary_get_cstring_nocopy(obj,
"pkgname", &pkgname);
228 if (ttype == XBPS_TRANS_INSTALL || ttype == XBPS_TRANS_HOLD || ttype == XBPS_TRANS_CONFIGURE) {
229 xbps_dbg_printf(
"%s: skipping pre-remove script for "
230 "%s: %d\n", __func__, pkgver, ttype);
236 xbps_dbg_printf(
"[trans] cannot find %s in pkgdb: %s\n",
237 pkgname, strerror(rv));
241 script = xbps_dictionary_get(pkgdb_pkgd,
"remove-script");
245 xbps_dictionary_get_cstring_nocopy(pkgdb_pkgd,
"pkgver", &pkgdb_pkgver);
246 assert(pkgdb_pkgver);
248 update = ttype == XBPS_TRANS_UPDATE;
252 xbps_set_cb_state(xhp, XBPS_STATE_TRANS_FAIL, rv, pkgver,
253 "%s: [trans] REMOVE script failed to execute pre ACTION: %s",
254 pkgver, strerror(rv));
260 dict = xbps_dictionary_create();
262 rv = errno ? errno : ENOMEM;
265 if (!xbps_dictionary_set_cstring(dict,
"pkgver", pkgdb_pkgver)) {
266 rv = errno ? errno : ENOMEM;
269 if (!xbps_dictionary_set(dict,
"remove-script", script)) {
270 rv = errno ? errno : ENOMEM;
273 if (!xbps_array_add(remove_scripts, dict)) {
274 rv = errno ? errno : ENOMEM;
277 xbps_object_release(dict);
279 xbps_object_iterator_reset(iter);
284 while ((obj = xbps_object_iterator_next(iter)) != NULL) {
285 xbps_dictionary_get_cstring_nocopy(obj,
"pkgver", &pkgver);
287 if (ttype == XBPS_TRANS_REMOVE || ttype == XBPS_TRANS_HOLD) {
288 xbps_dbg_printf(
"%s: skipping pre-install script for "
289 "%s: %d\n", __func__, pkgver, ttype);
294 xbps_set_cb_state(xhp, XBPS_STATE_TRANS_FAIL, rv, pkgver,
295 "%s: [trans] INSTALL script failed to execute pre ACTION: %s",
296 pkgver, strerror(rv));
300 xbps_object_iterator_reset(iter);
303 while ((obj = xbps_object_iterator_next(iter)) != NULL) {
304 xbps_dictionary_get_cstring_nocopy(obj,
"pkgver", &pkgver);
307 if (ttype == XBPS_TRANS_REMOVE) {
312 xbps_dictionary_get_bool(obj,
"remove-and-update", &update);
313 rv = xbps_remove_pkg(xhp, pkgver, update);
315 xbps_dbg_printf(
"[trans] failed to "
316 "remove %s: %s\n", pkgver, strerror(rv));
321 }
else if (ttype == XBPS_TRANS_UPDATE) {
326 xbps_set_cb_state(xhp, XBPS_STATE_UPDATE, 0, pkgver, NULL);
327 rv = xbps_remove_pkg(xhp, pkgver,
true);
329 xbps_set_cb_state(xhp,
330 XBPS_STATE_UPDATE_FAIL,
332 "%s: [trans] failed to update "
333 "package `%s'", pkgver,
337 }
else if (ttype == XBPS_TRANS_CONFIGURE) {
342 }
else if (ttype == XBPS_TRANS_HOLD) {
349 xbps_set_cb_state(xhp, XBPS_STATE_INSTALL, 0,
355 if ((rv = xbps_unpack_binary_pkg(xhp, obj)) != 0) {
356 xbps_dbg_printf(
"[trans] failed to unpack "
357 "%s: %s\n", pkgver, strerror(rv));
363 if ((rv = xbps_register_pkg(xhp, obj)) != 0) {
364 xbps_dbg_printf(
"[trans] failed to register "
365 "%s: %s\n", pkgver, strerror(rv));
370 if (!xbps_dictionary_get(xhp->
transd,
"total-update-pkgs") &&
371 !xbps_dictionary_get(xhp->
transd,
"total-install-pkgs"))
378 }
else if (xhp->
flags & XBPS_FLAG_UNPACK_ONLY) {
382 xbps_object_iterator_reset(iter);
390 rv = run_post_remove_scripts(xhp, remove_scripts);
399 xbps_set_cb_state(xhp, XBPS_STATE_TRANS_CONFIGURE, 0, NULL, NULL);
401 while ((obj = xbps_object_iterator_next(iter)) != NULL) {
402 xbps_dictionary_get_cstring_nocopy(obj,
"pkgver", &pkgver);
404 if (ttype == XBPS_TRANS_REMOVE || ttype == XBPS_TRANS_HOLD) {
405 xbps_dbg_printf(
"%s: skipping configuration for "
406 "%s: %d\n", __func__, pkgver, ttype);
410 if (ttype == XBPS_TRANS_UPDATE)
415 xbps_dbg_printf(
"%s: configure failed for "
416 "%s: %s\n", __func__, pkgver, strerror(rv));
424 xbps_set_cb_state(xhp, XBPS_STATE_UPDATE_DONE, 0,
427 xbps_set_cb_state(xhp, XBPS_STATE_INSTALL_DONE, 0,
433 xbps_object_release(remove_scripts);
434 xbps_object_iterator_release(iter);
char rootdir[XBPS_MAXPATH]
char cachedir[XBPS_MAXPATH]
Generic XBPS structure handler for initialization.
int xbps_pkg_exec_buffer(struct xbps_handle *xhp, const void *blob, const size_t blobsiz, const char *pkgver, const char *action, bool update)
int xbps_pkgdb_update(struct xbps_handle *xhp, bool flush, bool update)
xbps_dictionary_t xbps_pkgdb_get_pkg(struct xbps_handle *xhp, const char *pkg)
int xbps_pkg_exec_script(struct xbps_handle *xhp, xbps_dictionary_t d, const char *script, const char *action, bool update)
xbps_object_iterator_t xbps_array_iter_from_dict(xbps_dictionary_t dict, const char *key)
int xbps_transaction_commit(struct xbps_handle *xhp)
xbps_trans_type_t xbps_transaction_pkg_type(xbps_dictionary_t pkg_repod)
int xbps_mkpath(const char *path, mode_t mode)