X-Git-Url: https://git.librecmc.org/?p=oweals%2Fopkg-lede.git;a=blobdiff_plain;f=libopkg%2Fopkg_cmd.c;h=f67a2645152866689a8f8336995ae1c110b78979;hp=807777e56870f0ef7542bc56983d737f51ec5b8d;hb=abc03cc413d81c734fac76bed348aecf4c3cf74c;hpb=480538737a8a9be074a1848f2e52cf2d1ff4709f diff --git a/libopkg/opkg_cmd.c b/libopkg/opkg_cmd.c index 807777e..f67a264 100644 --- a/libopkg/opkg_cmd.c +++ b/libopkg/opkg_cmd.c @@ -19,6 +19,7 @@ #include "includes.h" #include #include +#include #include "opkg_conf.h" #include "opkg_cmd.h" @@ -33,18 +34,14 @@ #include "libbb/libbb.h" #include "opkg_utils.h" #include "opkg_defines.h" - -#include - - #include "opkg_download.h" #include "opkg_install.h" #include "opkg_upgrade.h" #include "opkg_remove.h" #include "opkg_configure.h" #include "opkg_message.h" - #include "libopkg.h" +#include "xsystem.h" static int opkg_update_cmd(opkg_conf_t *conf, int argc, char **argv); static int opkg_upgrade_cmd(opkg_conf_t *conf, int argc, char **argv); @@ -180,7 +177,7 @@ static int opkg_update_cmd(opkg_conf_t *conf, int argc, char **argv) "%s: ERROR: %s exists, but is not a directory\n", __FUNCTION__, lists_dir); free(lists_dir); - return EINVAL; + return -1; } err = file_mkdir_hier(lists_dir, 0755); if (err) { @@ -188,18 +185,16 @@ static int opkg_update_cmd(opkg_conf_t *conf, int argc, char **argv) "%s: ERROR: failed to make directory %s: %s\n", __FUNCTION__, lists_dir, strerror(errno)); free(lists_dir); - return EINVAL; + return -1; } } failures = 0; - - tmp = xstrdup("/tmp/opkg.XXXXXX"); - + sprintf_alloc(&tmp, "%s/update-XXXXXX", conf->tmp_dir); if (mkdtemp (tmp) == NULL) { perror ("mkdtemp"); - failures++; + return -1; } @@ -304,28 +299,25 @@ static opkg_intercept_t opkg_prep_intercepts(opkg_conf_t *conf) { opkg_intercept_t ctx; char *newpath; - int gen; ctx = xcalloc(1, sizeof (*ctx)); ctx->oldpath = xstrdup(getenv("PATH")); - - sprintf_alloc (&newpath, "%s/opkg/intercept:%s", DATADIR, ctx->oldpath); - setenv ("PATH", newpath, 1); - free (newpath); - - gen = 0; - retry: - sprintf_alloc (&ctx->statedir, "/tmp/opkg-intercept-%d-%d", getpid (), gen); - if (mkdir (ctx->statedir, 0770) < 0) { - if (errno == EEXIST) { - free (ctx->statedir); - gen++; - goto retry; - } - perror (ctx->statedir); + sprintf_alloc(&newpath, "%s/opkg/intercept:%s", DATADIR, ctx->oldpath); + sprintf_alloc(&ctx->statedir, "%s/opkg-intercept-XXXXXX", conf->tmp_dir); + + if (mkdtemp(ctx->statedir) == NULL) { + fprintf(stderr, "%s: mkdtemp: %s\n", __FUNCTION__, strerror(errno)); + free(ctx->oldpath); + free(ctx->statedir); + free(newpath); + free(ctx); return NULL; } - setenv ("OPKG_INTERCEPT_DIR", ctx->statedir, 1); + + setenv("OPKG_INTERCEPT_DIR", ctx->statedir, 1); + setenv("PATH", newpath, 1); + free(newpath); + return ctx; } @@ -335,26 +327,21 @@ static int opkg_finalize_intercepts(opkg_intercept_t ctx) DIR *dir; int err = 0; - if (ctx->oldpath) { - setenv ("PATH", ctx->oldpath, 1); - free (ctx->oldpath); - } + setenv ("PATH", ctx->oldpath, 1); + free (ctx->oldpath); dir = opendir (ctx->statedir); if (dir) { struct dirent *de; while (de = readdir (dir), de != NULL) { char *path; - + if (de->d_name[0] == '.') continue; sprintf_alloc (&path, "%s/%s", ctx->statedir, de->d_name); if (access (path, X_OK) == 0) { - if (system (path)) { - err = errno; - perror (de->d_name); - } + xsystem (path); } free (path); } @@ -363,7 +350,7 @@ static int opkg_finalize_intercepts(opkg_intercept_t ctx) perror (ctx->statedir); sprintf_alloc (&cmd, "rm -rf %s", ctx->statedir); - err = system (cmd); + err = xsystem (cmd); free (cmd); free (ctx->statedir); @@ -464,7 +451,7 @@ static int opkg_recurse_pkgs_in_order(opkg_conf_t *conf, pkg_t *pkg, pkg_vec_t * static int opkg_configure_packages(opkg_conf_t *conf, char *pkg_name) { - pkg_vec_t *all, *ordered, *visited; + pkg_vec_t *all, *ordered, *visited; int i; pkg_t *pkg; opkg_intercept_t ic; @@ -489,8 +476,11 @@ static int opkg_configure_packages(opkg_conf_t *conf, char *pkg_name) opkg_recurse_pkgs_in_order(conf, pkg, all, visited, ordered); } - ic = opkg_prep_intercepts (conf); + if (ic == NULL) { + err = -1; + goto error; + } for(i = 0; i < all->len; i++) { pkg = all->pkgs[i]; @@ -518,6 +508,7 @@ static int opkg_configure_packages(opkg_conf_t *conf, char *pkg_name) if (r && !err) err = r; +error: pkg_vec_free(all); pkg_vec_free(ordered); pkg_vec_free(visited); @@ -568,9 +559,6 @@ static int opkg_install_cmd(opkg_conf_t *conf, int argc, char **argv) } } - /* recheck to verify that all dependences are satisfied */ - if (0) opkg_satisfy_all_dependences(conf); - opkg_configure_packages(conf, NULL); write_status_files_if_changed(conf); @@ -632,9 +620,6 @@ static int opkg_upgrade_cmd(opkg_conf_t *conf, int argc, char **argv) pkg_vec_free(installed); } - /* recheck to verify that all dependences are satisfied */ - if (0) opkg_satisfy_all_dependences(conf); - opkg_configure_packages(conf, NULL); write_status_files_if_changed(conf);