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