X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=libopkg%2Fopkg_cmd.c;h=c40694eff8bb1b78425ea5b0f7bf43b6f4c65760;hb=9dd3216ffcf2c95e35ef097a0c8c3f2898bbde62;hp=9c1612b6f7b04fd095a2b306cf2e03bbdf86a0ac;hpb=f0c41b4e0e096698a7e2eae1ab99d9af1a74d5bd;p=oweals%2Fopkg-lede.git diff --git a/libopkg/opkg_cmd.c b/libopkg/opkg_cmd.c index 9c1612b..c40694e 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,57 +299,48 @@ static opkg_intercept_t opkg_prep_intercepts(opkg_conf_t *conf) { opkg_intercept_t ctx; char *newpath; - int gen; - ctx = calloc (1, sizeof (*ctx)); + 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; } static int opkg_finalize_intercepts(opkg_intercept_t ctx) { - char *cmd; 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); } @@ -362,10 +348,7 @@ static int opkg_finalize_intercepts(opkg_intercept_t ctx) } else perror (ctx->statedir); - sprintf_alloc (&cmd, "rm -rf %s", ctx->statedir); - err = system (cmd); - free (cmd); - + rm_r(ctx->statedir); free (ctx->statedir); free (ctx); @@ -464,7 +447,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 +472,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 +504,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 +555,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 +616,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); @@ -773,7 +754,7 @@ static int opkg_info_status_cmd(opkg_conf_t *conf, int argc, char **argv, int in pkg_formatted_info(stdout, pkg); - if (conf->verbosity > 1) { + if (conf->verbosity >= OPKG_NOTICE) { conffile_list_elt_t *iter; for (iter = nv_pair_list_first(&pkg->conffiles); iter; iter = nv_pair_list_next(&pkg->conffiles, iter)) { conffile_t *cf = (conffile_t *)iter->data; @@ -877,7 +858,7 @@ static int opkg_remove_cmd(opkg_conf_t *conf, int argc, char **argv) available = pkg_vec_alloc(); pkg_hash_fetch_all_installed(&conf->pkg_hash, available); for (i=0; i < argc; i++) { - pkg_name = calloc(1, strlen(argv[i])+2); + pkg_name = xcalloc(1, strlen(argv[i])+2); strcpy(pkg_name,argv[i]); for (a=0; a < available->len; a++) { pkg = available->pkgs[a]; @@ -1095,8 +1076,7 @@ static int opkg_depends_cmd(opkg_conf_t *conf, int argc, char **argv) for (l = 0; l < cdepend->possibility_count; l++) { depend_t *possibility = cdepend->possibilities[l]; opkg_message(conf, OPKG_ERROR, " %s", possibility->pkg->name); - if (conf->verbosity > 0) { - // char *ver = abstract_pkg_version_str_alloc(possibility->pkg); + if (conf->verbosity >= OPKG_NOTICE) { opkg_message(conf, OPKG_NOTICE, " %s", possibility->version); if (possibility->version) { char *typestr = NULL; @@ -1110,7 +1090,6 @@ static int opkg_depends_cmd(opkg_conf_t *conf, int argc, char **argv) } opkg_message(conf, OPKG_NOTICE, " (%s %s)", typestr, possibility->version); } - // free(ver); } opkg_message(conf, OPKG_ERROR, "\n"); } @@ -1198,9 +1177,9 @@ static int opkg_what_depends_conflicts_cmd(opkg_conf_t *conf, enum what_field_ty pkg_mark_provides(pkg); changed++; - opkg_message(conf, OPKG_NOTICE, " %s", pkg->name); - if (conf->verbosity > 0) { + if (conf->verbosity >= OPKG_NOTICE) { char *ver = pkg_version_str_alloc(pkg); + opkg_message(conf, OPKG_NOTICE, " %s", pkg->name); opkg_message(conf, OPKG_NOTICE, " %s", ver); opkg_message(conf, OPKG_NOTICE, "\t%s %s", rel_str, possibility->pkg->name); if (possibility->version) { @@ -1365,8 +1344,8 @@ static int opkg_compare_versions_cmd(opkg_conf_t *conf, int argc, char **argv) if (argc == 3) { /* this is a bit gross */ struct pkg p1, p2; - parseVersion(&p1, argv[0]); - parseVersion(&p2, argv[2]); + parse_version(&p1, argv[0]); + parse_version(&p2, argv[2]); return pkg_version_satisfied(&p1, &p2, argv[1]); } else { opkg_message(conf, OPKG_ERROR,