summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNatanael Copa <ncopa@alpinelinux.org>2011-04-14 21:48:49 +0200
committerNatanael Copa <ncopa@alpinelinux.org>2011-04-14 19:59:01 +0000
commitcec1fa2b0f414e980c4dc56a5cc4dc9ff48bddb8 (patch)
treef3e5a5bdef05102f7400195e4ef2ed8e8fb9a2ad
parent762e0c717bcae8c2d0f46ba4f35232b773ac8419 (diff)
downloadapk-tools-cec1fa2b0f414e980c4dc56a5cc4dc9ff48bddb8.tar.gz
apk-tools-cec1fa2b0f414e980c4dc56a5cc4dc9ff48bddb8.tar.bz2
apk-tools-cec1fa2b0f414e980c4dc56a5cc4dc9ff48bddb8.tar.xz
apk-tools-cec1fa2b0f414e980c4dc56a5cc4dc9ff48bddb8.zip
db: Allow override arch when using --root
This is so we can do x86 --root installs on x86_64 hosts. Using --arch without --root can make great damage so we only enable it if --root is used.
-rw-r--r--src/apk.c5
-rw-r--r--src/apk_database.h1
-rw-r--r--src/database.c7
3 files changed, 11 insertions, 2 deletions
diff --git a/src/apk.c b/src/apk.c
index 55963b0..c40cc20 100644
--- a/src/apk.c
+++ b/src/apk.c
@@ -66,6 +66,8 @@ static struct apk_option generic_options[] = {
required_argument, "REPOFILE" },
{ 0x109, "no-network", "Do not use network (cache is still used)" },
{ 0x111, "overlay-from-stdin", "Read list of overlay files from stdin" },
+ { 0x112, "arch", "Use architecture with --root",
+ required_argument, "ARCH" },
};
static int version(void)
@@ -369,6 +371,9 @@ int main(int argc, char **argv)
case 0x111:
apk_flags |= APK_OVERLAY_FROM_STDIN;
break;
+ case 0x112:
+ dbopts.arch = optarg;
+ break;
default:
if (applet == NULL || applet->parse == NULL ||
applet->parse(ctx, &dbopts, r,
diff --git a/src/apk_database.h b/src/apk_database.h
index 68bba08..9b032e7 100644
--- a/src/apk_database.h
+++ b/src/apk_database.h
@@ -95,6 +95,7 @@ struct apk_db_options {
int lock_wait;
unsigned long open_flags;
char *root;
+ char *arch;
char *keys_dir;
char *repositories_file;
struct list_head repository_list;
diff --git a/src/database.c b/src/database.c
index 1376ec3..45960d2 100644
--- a/src/database.c
+++ b/src/database.c
@@ -49,7 +49,6 @@ enum {
int apk_verbosity = 1;
unsigned int apk_flags = 0;
-const char *apk_arch = APK_DEFAULT_ARCH;
const char * const apkindex_tar_gz = "APKINDEX.tar.gz";
static const char * const apk_static_cache_dir = "var/cache/apk";
@@ -1149,6 +1148,11 @@ int apk_db_open(struct apk_database *db, struct apk_db_options *dbopts)
apk_string_array_init(&db->protected_paths);
db->permanent = 1;
+ if (dbopts->root && dbopts->arch) {
+ db->arch = apk_blob_atomize(APK_BLOB_STR(dbopts->arch));
+ } else {
+ db->arch = apk_blob_atomize(APK_BLOB_STR(APK_DEFAULT_ARCH));
+ }
db->root = strdup(dbopts->root ?: "/");
db->root_fd = openat(AT_FDCWD, db->root, O_RDONLY | O_CLOEXEC);
if (db->root_fd < 0 && (dbopts->open_flags & APK_OPENF_CREATE)) {
@@ -1226,7 +1230,6 @@ int apk_db_open(struct apk_database *db, struct apk_db_options *dbopts)
db->cachetmp_fd = db->cache_fd;
}
- db->arch = apk_blob_atomize(APK_BLOB_STR(apk_arch));
db->keys_fd = openat(db->root_fd,
dbopts->keys_dir ?: "etc/apk/keys",
O_RDONLY | O_CLOEXEC);