Two new options to dpkg, needed for multiarch:
--foreign-architecture lets you specify that packages for the named
architecture should be installable without the use of --force-architecture
--print-foreign-architectures prints out a space-separated list of all
architectures so configured, so that front-ends can query the list.
---
src/enquiry.c | 14 ++++++++++++++
src/main.c | 12 ++++++++++++
src/main.h | 9 ++++++++-
src/processarc.c | 19 +++++++++++++++----
4 files changed, 49 insertions(+), 5 deletions(-)
diff --git a/src/enquiry.c b/src/enquiry.c
index 5f773f8..cb5f410 100644
--- a/src/enquiry.c
+++ b/src/enquiry.c
@@ -395,6 +395,20 @@ printinstarch(const char *const *argv)
printarch(argv);
}
+void
+printforeignarchs(const char *const *argv)
+{
+ struct architecture *archp;
+ if (*argv)
+ badusage(_("--%s takes no arguments"), cipaction->olong);
+
+ for (archp = foreign_archs; archp; archp = archp->next) {
+ if (printf("%s ",archp->arch) == EOF) werr("stdout");
+ }
+ if (printf("\n") == EOF) werr("stdout");
+ if (fflush(stdout)) werr("stdout");
+}
+
void cmpversions(const char *const *argv) {
struct relationinfo {
const char *string;
diff --git a/src/main.c b/src/main.c
index d237054..b2cce63 100644
--- a/src/main.c
+++ b/src/main.c
@@ -152,6 +152,7 @@ usage(void)
const char thisname[]= "dpkg";
const char architecture[]= ARCHITECTURE;
+struct architecture *foreign_archs = NULL;
const char printforhelp[]= N_(
"Type dpkg --help for help about installing and deinstalling packages [*];\n"
"Use `dselect' or `aptitude' for user-friendly package management;\n"
@@ -315,6 +316,15 @@ static void setpipe(const struct cmdinfo *cip, const char *value) {
*pipe_head = pipe_new;
}
+static void set_foreign_arch(const struct cmdinfo *cip, const char *value) {
+ struct architecture *arch_new;
+
+ arch_new = nfmalloc(sizeof(struct architecture));
+ arch_new->arch = m_strdup(value);
+ arch_new->next = foreign_archs;
+ foreign_archs = arch_new;
+}
+
static void setforce(const struct cmdinfo *cip, const char *value) {
const char *comma;
size_t l;
@@ -426,6 +436,7 @@ static const struct cmdinfo cmdinfos[]= {
ACTION( "print-installation-architecture", 0, act_printinstarch, printinstarch ),
ACTION( "predep-package", 0, act_predeppackage, predeppackage ),
ACTION( "compare-versions", 0, act_cmpversions, cmpversions ),
+ ACTION( "print-foreign-architectures", 0, act_foreignarchs, printforeignarchs ),
/*
ACTION( "command-fd", 'c', act_commandfd, commandfd ),
*/
@@ -462,6 +473,7 @@ static const struct cmdinfo cmdinfos[]= {
{ "licence", 0, 0, NULL, NULL, showcopyright, 0 },
/* US spelling. */
{ "license", 0, 0, NULL, NULL, showcopyright, 0 },
+ { "foreign-architecture", 0,1, NULL, NULL, set_foreign_arch, 0, &foreign_archs },
ACTIONBACKEND( "build", 'b', BACKEND),
ACTIONBACKEND( "contents", 'c', BACKEND),
ACTIONBACKEND( "control", 'e', BACKEND),
diff --git a/src/main.h b/src/main.h
index eb5bfce..825d39a 100644
--- a/src/main.h
+++ b/src/main.h
@@ -61,7 +61,7 @@ enum action { act_unset, act_install, act_unpack, act_avail, act_configure,
act_forgetold,
act_getselections, act_setselections, act_clearselections,
act_assertepoch, act_assertlongfilenames, act_assertmulticonrep,
- act_commandfd };
+ act_commandfd, act_foreignarchs };
enum conffopt {
cfof_prompt = 001,
@@ -102,6 +102,12 @@ extern const char *instdir;
extern struct pkginqueue *ignoredependss;
extern const char architecture[];
+struct architecture {
+ struct architecture *next;
+ const char *arch;
+};
+extern struct architecture *foreign_archs;
+
/* from archives.c */
void archivefiles(const char *const *argv);
@@ -130,6 +136,7 @@ void assertmulticonrep(const char *const *argv);
void predeppackage(const char *const *argv);
void printarch(const char *const *argv);
void printinstarch(const char *const *argv);
+void printforeignarchs(const char *const *argv);
void cmpversions(const char *const *argv) DPKG_ATTR_NORET;
/* Intended for use as a comparison function for qsort when
diff --git a/src/processarc.c b/src/processarc.c
index 0b8d248..75e6427 100644
--- a/src/processarc.c
+++ b/src/processarc.c
@@ -216,10 +216,21 @@ void process_archive(const char *filename) {
if (pkg->available.architecture && *pkg->available.architecture &&
strcmp(pkg->available.architecture,"all") &&
- strcmp(pkg->available.architecture,architecture))
- forcibleerr(fc_architecture,
- _("package architecture (%s) does not match system (%s)"),
- pkg->available.architecture,architecture);
+ strcmp(pkg->available.architecture,architecture)) {
+ struct architecture *archp;
+ int archok = 0;
+
+ for (archp = foreign_archs; archp; archp = archp->next) {
+ if (!strcmp(pkg->available.architecture,archp->arch)) {
+ archok = 1;
+ break;
+ }
+ }
+ if (!archok)
+ forcibleerr(fc_architecture,
+ _("package architecture (%s) does not match system (%s)"),
+ pkg->available.architecture,architecture);
+ }
if (!pkg->installed.valid) blankpackageperfile(&pkg->installed);
assert(pkg->available.valid);
--
1.6.3.3
--
Steve Langasek Give me a lever long enough and a Free OS
Debian Developer to set it on, and I can move the world.
Ubuntu Developer http://www.debian.org/
slangasek@ubuntu.com vorlon@debian.org
Attachment:
signature.asc
Description: Digital signature