From: Yousong Zhou <yszhou4t...@gmail.com> Almost all busybox applets are alternatives to some other existing "full" utilities. To lift the maintenance burden of enumerating CONFIG symbols, symlink path of each applet, we special case busybox here as a known alternatives provider.
All file pathes provided by busybox will serve as fallback alternatives with -inf priority. Packages intending to switch to using alternatives mechanism will also not need to depend on the same kind of change be applied on busybox in base system Signed-off-by: Yousong Zhou <zhouyous...@yunionyun.com> --- libopkg/pkg_alternatives.c | 35 ++++++++++++++++++++++++++++++++--- 1 file changed, 32 insertions(+), 3 deletions(-) diff --git a/libopkg/pkg_alternatives.c b/libopkg/pkg_alternatives.c index 50e9d12..4a1a31c 100644 --- a/libopkg/pkg_alternatives.c +++ b/libopkg/pkg_alternatives.c @@ -27,6 +27,28 @@ #include "pkg_alternatives.h" #include "sprintf_alloc.h" +static bool pkg_alternatives_check_busybox(const char *path) +{ + pkg_t *pkg; + str_list_t *files; + str_list_elt_t *iter; + bool found = false; + + pkg = pkg_hash_fetch_installed_by_name("busybox"); + if (!pkg) { + return false; + } + files = pkg_get_installed_files(pkg); + for (iter = str_list_first(files); iter; iter = str_list_next(files, iter)) { + if (!strcmp(path, (char *)(iter->data))) { + found = true; + break; + } + } + pkg_free_installed_files(pkg); + return found; +} + static int pkg_alternatives_update_path(pkg_t *pkg, const pkg_vec_t *installed, const char *path) { struct pkg_alternatives *pkg_alts; @@ -35,6 +57,7 @@ static int pkg_alternatives_update_path(pkg_t *pkg, const pkg_vec_t *installed, int i, j; int r; char *path_in_dest; + char *target_path = NULL; for (i = 0; i < installed->len; i++) { pkg_t *pkg = installed->pkgs[i]; @@ -60,6 +83,12 @@ static int pkg_alternatives_update_path(pkg_t *pkg, const pkg_vec_t *installed, return -1; if (the_alt) { + target_path = the_alt->altpath; + } else if (pkg_alternatives_check_busybox(path)) { + target_path = "/bin/busybox"; + } + + if (target_path) { struct stat sb; r = lstat(path_in_dest, &sb); @@ -72,7 +101,7 @@ static int pkg_alternatives_update_path(pkg_t *pkg, const pkg_vec_t *installed, goto out; } realpath = xreadlink(path_in_dest); - if (realpath && strcmp(realpath, the_alt->altpath)) + if (realpath && strcmp(realpath, target_path)) unlink(path_in_dest); free(realpath); } else if (errno != ENOENT) { @@ -87,7 +116,7 @@ static int pkg_alternatives_update_path(pkg_t *pkg, const pkg_vec_t *installed, if (r) { goto out; } - r = symlink(the_alt->altpath, path_in_dest); + r = symlink(target_path, path_in_dest); if (r && errno == EEXIST) { /* * the strcmp & unlink check above will make sure that if EEXIST @@ -96,7 +125,7 @@ static int pkg_alternatives_update_path(pkg_t *pkg, const pkg_vec_t *installed, r = 0; } if (r) { - opkg_perror(ERROR, "failed symlinking %s -> %s", path_in_dest, the_alt->altpath); + opkg_perror(ERROR, "failed symlinking %s -> %s", path_in_dest, target_path); } } } else { _______________________________________________ openwrt-devel mailing list openwrt-devel@lists.openwrt.org https://lists.openwrt.org/mailman/listinfo/openwrt-devel