IPKG_CONF_DIR=$(STAGING_DIR)/etc \
IPKG_OFFLINE_ROOT=$(TARGET_DIR) \
$(STAGING_DIR_HOST)/bin/opkg \
- -f $(STAGING_DIR)/etc/opkg.conf \
--offline-root $(TARGET_DIR) \
--force-depends \
--force-overwrite \
- --force-run-hooks
+ --force-postinstall \
+ --add-dest root:/ \
+ --add-arch all:100 \
+ --add-arch $(ARCH_PACKAGES):200
# invoke ipkg-build with some default options
IPKG_BUILD:= \
rm -rf $(STAGING_DIR_ROOT)/tmp-$(1)
touch $$@
- $$(IPKG_$(1)): $(STAGING_DIR)/etc/opkg.conf $(STAMP_BUILT)
+ $$(IPKG_$(1)): $(STAMP_BUILT)
@rm -rf $(PACKAGE_DIR)/$(1)_* $$(IDIR_$(1))
mkdir -p $(PACKAGE_DIR) $$(IDIR_$(1))/CONTROL
$(call Package/$(1)/install,$$(IDIR_$(1)))
clean: $(1)-clean
endef
-
- $(STAGING_DIR)/etc/opkg.conf:
- mkdir -p $(STAGING_DIR)/etc
- ( echo "dest root /" > $@; \
- echo "arch all 100" >> $@; \
- echo "arch $(PKGARCH) 200" >> $@ )
-
endif
PKG_NAME:=opkg
PKG_REV:=528
PKG_VERSION:=$(PKG_REV)
-PKG_RELEASE:=2
+PKG_RELEASE:=3
PKG_SOURCE_PROTO:=svn
PKG_SOURCE_VERSION:=$(PKG_REV)
}
-
+
-+ if(!conf->conf_file)
++ if(!conf->conf_file && !conf->offline_root)
+ conf->conf_file = xstrdup("/etc/opkg.conf");
+
if (parse_err)
+++ /dev/null
---- a/libopkg/opkg_conf.c
-+++ b/libopkg/opkg_conf.c
-@@ -54,6 +54,7 @@ opkg_option_t options[] = {
- { "force_reinstall", OPKG_OPT_TYPE_BOOL, &_conf.force_reinstall },
- { "force_space", OPKG_OPT_TYPE_BOOL, &_conf.force_space },
- { "check_signature", OPKG_OPT_TYPE_BOOL, &_conf.check_signature },
-+ { "force_run_hooks", OPKG_OPT_TYPE_BOOL, &_conf.force_run_hooks },
- { "ftp_proxy", OPKG_OPT_TYPE_STRING, &_conf.ftp_proxy },
- { "http_proxy", OPKG_OPT_TYPE_STRING, &_conf.http_proxy },
- { "no_proxy", OPKG_OPT_TYPE_STRING, &_conf.no_proxy },
---- a/libopkg/opkg_conf.h
-+++ b/libopkg/opkg_conf.h
-@@ -73,6 +73,7 @@ struct opkg_conf
- int force_space;
- int force_removal_of_dependent_packages;
- int force_removal_of_essential_packages;
-+ int force_run_hooks;
- int check_signature;
- int nodeps; /* do not follow dependencies */
- char *offline_root;
---- a/libopkg/pkg.c
-+++ b/libopkg/pkg.c
-@@ -1249,7 +1249,7 @@ pkg_run_script(pkg_t *pkg, const char *s
-
- /* XXX: FEATURE: When conf->offline_root is set, we should run the
- maintainer script within a chroot environment. */
-- if (conf->offline_root) {
-+ if (conf->offline_root && !conf->force_run_hooks) {
- opkg_msg(INFO, "Offline root mode: not running %s.%s.\n",
- pkg->name, script);
- return 0;
---- a/src/opkg-cl.c
-+++ b/src/opkg-cl.c
-@@ -39,6 +39,7 @@ enum {
- ARGS_OPT_FORCE_REMOVAL_OF_DEPENDENT_PACKAGES,
- ARGS_OPT_FORCE_REMOVAL_OF_ESSENTIAL_PACKAGES,
- ARGS_OPT_FORCE_SPACE,
-+ ARGS_OPT_FORCE_RUN_HOOKS,
- ARGS_OPT_NOACTION,
- ARGS_OPT_DOWNLOAD_ONLY,
- ARGS_OPT_NODEPS,
-@@ -74,6 +75,8 @@ static struct option long_options[] = {
- ARGS_OPT_FORCE_REMOVAL_OF_ESSENTIAL_PACKAGES},
- {"force_removal_of_essential_packages", 0, 0,
- ARGS_OPT_FORCE_REMOVAL_OF_ESSENTIAL_PACKAGES},
-+ {"force-run-hooks", 0, 0, ARGS_OPT_FORCE_RUN_HOOKS},
-+ {"force_run_hooks", 0, 0, ARGS_OPT_FORCE_RUN_HOOKS},
- {"noaction", 0, 0, ARGS_OPT_NOACTION},
- {"download-only", 0, 0, ARGS_OPT_DOWNLOAD_ONLY},
- {"nodeps", 0, 0, ARGS_OPT_NODEPS},
-@@ -153,6 +156,9 @@ args_parse(int argc, char *argv[])
- case ARGS_OPT_FORCE_SPACE:
- conf->force_space = 1;
- break;
-+ case ARGS_OPT_FORCE_RUN_HOOKS:
-+ conf->force_run_hooks = 1;
-+ break;
- case ARGS_OPT_NODEPS:
- conf->nodeps = 1;
- break;
-@@ -242,6 +248,7 @@ usage()
- printf("\t--force-overwrite Overwrite files from other package(s)\n");
- printf("\t--force-downgrade Allow opkg to downgrade packages\n");
- printf("\t--force-space Disable free space checks\n");
-+ printf("\t--force-run-hooks Run postinstall scripts even in offline mode\n");
- printf("\t--noaction No action -- test only\n");
- printf("\t--download-only No action -- download only\n");
- printf("\t--nodeps Do not follow dependencies\n");
--- /dev/null
+--- a/libopkg/opkg_conf.c
++++ b/libopkg/opkg_conf.c
+@@ -54,6 +54,7 @@ opkg_option_t options[] = {
+ { "force_reinstall", OPKG_OPT_TYPE_BOOL, &_conf.force_reinstall },
+ { "force_space", OPKG_OPT_TYPE_BOOL, &_conf.force_space },
+ { "check_signature", OPKG_OPT_TYPE_BOOL, &_conf.check_signature },
++ { "force_postinstall", OPKG_OPT_TYPE_BOOL, &_conf.force_postinstall },
+ { "ftp_proxy", OPKG_OPT_TYPE_STRING, &_conf.ftp_proxy },
+ { "http_proxy", OPKG_OPT_TYPE_STRING, &_conf.http_proxy },
+ { "no_proxy", OPKG_OPT_TYPE_STRING, &_conf.no_proxy },
+--- a/libopkg/opkg_conf.h
++++ b/libopkg/opkg_conf.h
+@@ -73,6 +73,7 @@ struct opkg_conf
+ int force_space;
+ int force_removal_of_dependent_packages;
+ int force_removal_of_essential_packages;
++ int force_postinstall;
+ int check_signature;
+ int nodeps; /* do not follow dependencies */
+ char *offline_root;
+--- a/libopkg/pkg.c
++++ b/libopkg/pkg.c
+@@ -1249,7 +1249,7 @@ pkg_run_script(pkg_t *pkg, const char *s
+
+ /* XXX: FEATURE: When conf->offline_root is set, we should run the
+ maintainer script within a chroot environment. */
+- if (conf->offline_root) {
++ if (conf->offline_root && !conf->force_postinstall) {
+ opkg_msg(INFO, "Offline root mode: not running %s.%s.\n",
+ pkg->name, script);
+ return 0;
+--- a/src/opkg-cl.c
++++ b/src/opkg-cl.c
+@@ -39,6 +39,7 @@ enum {
+ ARGS_OPT_FORCE_REMOVAL_OF_DEPENDENT_PACKAGES,
+ ARGS_OPT_FORCE_REMOVAL_OF_ESSENTIAL_PACKAGES,
+ ARGS_OPT_FORCE_SPACE,
++ ARGS_OPT_FORCE_POSTINSTALL,
+ ARGS_OPT_NOACTION,
+ ARGS_OPT_DOWNLOAD_ONLY,
+ ARGS_OPT_NODEPS,
+@@ -74,6 +75,8 @@ static struct option long_options[] = {
+ ARGS_OPT_FORCE_REMOVAL_OF_ESSENTIAL_PACKAGES},
+ {"force_removal_of_essential_packages", 0, 0,
+ ARGS_OPT_FORCE_REMOVAL_OF_ESSENTIAL_PACKAGES},
++ {"force-postinstall", 0, 0, ARGS_OPT_FORCE_POSTINSTALL},
++ {"force_postinstall", 0, 0, ARGS_OPT_FORCE_POSTINSTALL},
+ {"noaction", 0, 0, ARGS_OPT_NOACTION},
+ {"download-only", 0, 0, ARGS_OPT_DOWNLOAD_ONLY},
+ {"nodeps", 0, 0, ARGS_OPT_NODEPS},
+@@ -153,6 +156,9 @@ args_parse(int argc, char *argv[])
+ case ARGS_OPT_FORCE_SPACE:
+ conf->force_space = 1;
+ break;
++ case ARGS_OPT_FORCE_POSTINSTALL:
++ conf->force_postinstall = 1;
++ break;
+ case ARGS_OPT_NODEPS:
+ conf->nodeps = 1;
+ break;
+@@ -242,6 +248,7 @@ usage()
+ printf("\t--force-overwrite Overwrite files from other package(s)\n");
+ printf("\t--force-downgrade Allow opkg to downgrade packages\n");
+ printf("\t--force-space Disable free space checks\n");
++ printf("\t--force-postinstall Run postinstall scripts even in offline mode\n");
+ printf("\t--noaction No action -- test only\n");
+ printf("\t--download-only No action -- download only\n");
+ printf("\t--nodeps Do not follow dependencies\n");
--- /dev/null
+--- a/libopkg/opkg.c
++++ b/libopkg/opkg.c
+@@ -120,6 +120,9 @@ opkg_new()
+ if (opkg_conf_init())
+ goto err0;
+
++ if (opkg_conf_load())
++ goto err0;
++
+ if (pkg_hash_load_feeds())
+ goto err1;
+
+--- a/libopkg/opkg_conf.c
++++ b/libopkg/opkg_conf.c
+@@ -91,15 +91,15 @@ opkg_option_t options[] = {
+ };
+
+ static int
+-resolve_pkg_dest_list(nv_pair_list_t *nv_pair_list)
++resolve_pkg_dest_list(void)
+ {
+ nv_pair_list_elt_t *iter;
+ nv_pair_t *nv_pair;
+ pkg_dest_t *dest;
+ char *root_dir;
+
+- for (iter = nv_pair_list_first(nv_pair_list); iter;
+- iter = nv_pair_list_next(nv_pair_list, iter)) {
++ for (iter = nv_pair_list_first(&conf->tmp_dest_list); iter;
++ iter = nv_pair_list_next(&conf->tmp_dest_list, iter)) {
+ nv_pair = (nv_pair_t *)iter->data;
+
+ if (conf->offline_root) {
+@@ -185,8 +185,7 @@ opkg_conf_set_option(const char *name, c
+
+ static int
+ opkg_conf_parse_file(const char *filename,
+- pkg_src_list_t *pkg_src_list,
+- nv_pair_list_t *tmp_dest_nv_pair_list)
++ pkg_src_list_t *pkg_src_list)
+ {
+ int line_num = 0;
+ int err = 0;
+@@ -269,7 +268,7 @@ opkg_conf_parse_file(const char *filenam
+ regmatch[11].rm_eo - regmatch[11].rm_so);
+ }
+
+- /* We use the tmp_dest_nv_pair_list below instead of
++ /* We use the tmp_dest_list below instead of
+ conf->pkg_dest_list because we might encounter an
+ offline_root option later and that would invalidate the
+ directories we would have computed in
+@@ -292,7 +291,7 @@ opkg_conf_parse_file(const char *filenam
+ "Skipping.\n", name, value);
+ }
+ } else if (strcmp(type, "dest") == 0) {
+- nv_pair_list_append(tmp_dest_nv_pair_list, name, value);
++ nv_pair_list_append(&conf->tmp_dest_list, name, value);
+ } else if (strcmp(type, "lists_dir") == 0) {
+ conf->lists_dir = xstrdup(value);
+ } else if (strcmp(type, "arch") == 0) {
+@@ -411,9 +410,19 @@ glob_errfunc(const char *epath, int eerr
+ int
+ opkg_conf_init(void)
+ {
++ pkg_src_list_init(&conf->pkg_src_list);
++ pkg_dest_list_init(&conf->pkg_dest_list);
++ pkg_dest_list_init(&conf->tmp_dest_list);
++ nv_pair_list_init(&conf->arch_list);
++
++ return 0;
++}
++
++int
++opkg_conf_load(void)
++{
+ int i, glob_ret;
+ char *tmp, *tmp_dir_base, **tmp_val;
+- nv_pair_list_t tmp_dest_nv_pair_list;
+ glob_t globbuf;
+ char *etc_opkg_conf_pattern;
+
+@@ -423,11 +432,6 @@ opkg_conf_init(void)
+ conf->check_x509_path = 1;
+ #endif
+
+- pkg_src_list_init(&conf->pkg_src_list);
+- pkg_dest_list_init(&conf->pkg_dest_list);
+- nv_pair_list_init(&conf->arch_list);
+- nv_pair_list_init(&tmp_dest_nv_pair_list);
+-
+ if (!conf->offline_root)
+ conf->offline_root = xstrdup(getenv("OFFLINE_ROOT"));
+
+@@ -438,7 +442,7 @@ opkg_conf_init(void)
+ goto err0;
+ }
+ if (opkg_conf_parse_file(conf->conf_file,
+- &conf->pkg_src_list, &tmp_dest_nv_pair_list))
++ &conf->pkg_src_list))
+ goto err1;
+ }
+
+@@ -467,7 +471,7 @@ opkg_conf_init(void)
+ !strcmp(conf->conf_file, globbuf.gl_pathv[i]))
+ continue;
+ if ( opkg_conf_parse_file(globbuf.gl_pathv[i],
+- &conf->pkg_src_list, &tmp_dest_nv_pair_list)<0) {
++ &conf->pkg_src_list)<0) {
+ globfree(&globbuf);
+ goto err1;
+ }
+@@ -528,16 +532,16 @@ opkg_conf_init(void)
+ }
+
+ /* Even if there is no conf file, we'll need at least one dest. */
+- if (nv_pair_list_empty(&tmp_dest_nv_pair_list)) {
+- nv_pair_list_append(&tmp_dest_nv_pair_list,
++ if (nv_pair_list_empty(&conf->tmp_dest_list)) {
++ nv_pair_list_append(&conf->tmp_dest_list,
+ OPKG_CONF_DEFAULT_DEST_NAME,
+ OPKG_CONF_DEFAULT_DEST_ROOT_DIR);
+ }
+
+- if (resolve_pkg_dest_list(&tmp_dest_nv_pair_list))
++ if (resolve_pkg_dest_list())
+ goto err5;
+
+- nv_pair_list_deinit(&tmp_dest_nv_pair_list);
++ nv_pair_list_deinit(&conf->tmp_dest_list);
+
+ return 0;
+
+@@ -577,7 +581,7 @@ err1:
+ }
+ }
+ err0:
+- nv_pair_list_deinit(&tmp_dest_nv_pair_list);
++ nv_pair_list_deinit(&conf->tmp_dest_list);
+ if (conf->dest_str)
+ free(conf->dest_str);
+ if (conf->conf_file)
+--- a/libopkg/opkg_conf.h
++++ b/libopkg/opkg_conf.h
+@@ -46,6 +46,7 @@ struct opkg_conf
+ {
+ pkg_src_list_t pkg_src_list;
+ pkg_dest_list_t pkg_dest_list;
++ pkg_dest_list_t tmp_dest_list;
+ nv_pair_list_t arch_list;
+
+ int restrict_to_default_dest;
+@@ -133,6 +134,7 @@ struct opkg_option {
+ };
+
+ int opkg_conf_init(void);
++int opkg_conf_load(void);
+ void opkg_conf_deinit(void);
+
+ int opkg_conf_write_status_files(void);
+--- a/src/opkg-cl.c
++++ b/src/opkg-cl.c
+@@ -40,6 +40,8 @@ enum {
+ ARGS_OPT_FORCE_REMOVAL_OF_ESSENTIAL_PACKAGES,
+ ARGS_OPT_FORCE_SPACE,
+ ARGS_OPT_FORCE_POSTINSTALL,
++ ARGS_OPT_ADD_ARCH,
++ ARGS_OPT_ADD_DEST,
+ ARGS_OPT_NOACTION,
+ ARGS_OPT_DOWNLOAD_ONLY,
+ ARGS_OPT_NODEPS,
+@@ -82,6 +84,8 @@ static struct option long_options[] = {
+ {"nodeps", 0, 0, ARGS_OPT_NODEPS},
+ {"offline", 1, 0, 'o'},
+ {"offline-root", 1, 0, 'o'},
++ {"add-arch", 1, 0, ARGS_OPT_ADD_ARCH},
++ {"add-dest", 1, 0, ARGS_OPT_ADD_DEST},
+ {"test", 0, 0, ARGS_OPT_NOACTION},
+ {"tmp-dir", 1, 0, 't'},
+ {"tmp_dir", 1, 0, 't'},
+@@ -96,6 +100,7 @@ args_parse(int argc, char *argv[])
+ int c;
+ int option_index = 0;
+ int parse_err = 0;
++ char *tuple, *prio;
+
+ while (1) {
+ c = getopt_long_only(argc, argv, "Ad:f:no:p:t:vV:",
+@@ -162,6 +167,21 @@ args_parse(int argc, char *argv[])
+ case ARGS_OPT_NODEPS:
+ conf->nodeps = 1;
+ break;
++ case ARGS_OPT_ADD_ARCH:
++ case ARGS_OPT_ADD_DEST:
++ tuple = xstrdup(optarg);
++ if ((prio = strchr(tuple, ':')) != NULL) {
++ *prio++ = 0;
++ if ((strlen(tuple) > 0) && (strlen(prio) > 0)) {
++ nv_pair_list_append(
++ (c == ARGS_OPT_ADD_ARCH)
++ ? &conf->arch_list : &conf->tmp_dest_list,
++ tuple, prio
++ );
++ }
++ }
++ free(tuple);
++ break;
+ case ARGS_OPT_NOACTION:
+ conf->noaction = 1;
+ break;
+@@ -240,6 +260,8 @@ usage()
+ printf(" directory name in a pinch).\n");
+ printf("\t-o <dir> Use <dir> as the root directory for\n");
+ printf("\t--offline-root <dir> offline installation of packages.\n");
++ printf("\t--add-arch <arch>:<prio> Register architecture with given priority\n");
++ printf("\t--add-dest <name>:<path> Register destination with given path\n");
+
+ printf("\nForce Options:\n");
+ printf("\t--force-depends Install/remove despite failed dependencies\n");
+@@ -280,6 +302,9 @@ main(int argc, char *argv[])
+ int nocheckfordirorfile = 0;
+ int noreadfeedsfile = 0;
+
++ if (opkg_conf_init())
++ goto err0;
++
+ conf->verbosity = NOTICE;
+
+ opts = args_parse(argc, argv);
+@@ -317,7 +342,7 @@ main(int argc, char *argv[])
+
+ conf->pfm = cmd->pfm;
+
+- if (opkg_conf_init())
++ if (opkg_conf_load())
+ goto err0;
+
+ if (!nocheckfordirorfile) {