On Sat, Aug 29, 2009 at 01:31:17PM -0700, Steve Langasek wrote: > On Sat, Aug 29, 2009 at 01:29:47PM -0700, Steve Langasek wrote: > > The rest are included in the attached revised patch. > > > And do not call it yet, I'd like to add that part only later on once > > > it's safe to install foreign architecture packages. Or rather, split it > > > into another patch that > > > we'll keep at the end of the branch. > > Right, done - also attached as a separate patch. > Pff, let's try this again. And I missed updating the header definition, doh. Updated again. -- 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
From a2dffe5db0a0c6b94e0ca3396d20bf4ea7f01c1b Mon Sep 17 00:00:00 2001
From: Steve Langasek <steve.langasek@canonical.com>
Date: Thu, 27 Aug 2009 12:42:35 -0700
Subject: [PATCH 1/2] Add --foreign-architecture and --print-foreign-architectures options
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.
---
man/dpkg.1 | 10 ++++++++++
src/enquiry.c | 17 +++++++++++++++++
src/main.c | 14 ++++++++++++++
src/main.h | 8 ++++++++
src/processarc.c | 13 +++++++++++++
5 files changed, 62 insertions(+), 0 deletions(-)
diff --git a/man/dpkg.1 b/man/dpkg.1
index d22d802..125273d 100644
--- a/man/dpkg.1
+++ b/man/dpkg.1
@@ -238,6 +238,16 @@ reason still haven't been installed.
.B \-\-print\-architecture
Print architecture of packages \fBdpkg\fP installs (for example, "i386").
.TP
+.B \-\-foreign\-architecture \fIarchitecture\fP
+Add \fIarchitecture\fP to the list of architectures for which packages can be
+installed without using \fB\-\-force\-architecture\fP, in addition to the
+architecture \fBdpkg\fP is built for (i.e.: the output of
+\fB\-\-print\-architecture\fP).
+.TP
+.B \-\-print\-foreign\-architectures
+Print a space-separated list of the extra architectures \fBdpkg\fP is
+configured to allow packages to be installed for.
+.TP
.B \-\-compare\-versions \fIver1 op ver2\fP
Compare version numbers, where \fIop\fP is a binary operator. \fBdpkg\fP
returns success (zero result) if the specified condition is satisfied,
diff --git a/src/enquiry.c b/src/enquiry.c
index 5f773f8..02ede15 100644
--- a/src/enquiry.c
+++ b/src/enquiry.c
@@ -395,6 +395,23 @@ printinstarch(const char *const *argv)
printarch(argv);
}
+void
+print_foreign_archs(const char *const *argv)
+{
+ struct architecture *archp;
+
+ if (*argv)
+ badusage(_("--%s takes no arguments"), cipaction->olong);
+
+ for (archp = foreign_archs; archp; archp = archp->next) {
+ printf("%s ", archp->name);
+ }
+ printf("\n");
+ fflush(stdout);
+ if (ferror(stdout) != 0)
+ 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..ca32a07 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,17 @@ 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->name = m_strdup(value);
+ arch_new->next = *cip->parg;
+ *cip->parg = arch_new;
+}
+
static void setforce(const struct cmdinfo *cip, const char *value) {
const char *comma;
size_t l;
@@ -424,12 +436,14 @@ static const struct cmdinfo cmdinfos[]= {
ACTION( "assert-multi-conrep", 0, act_assertmulticonrep, assertmulticonrep ),
ACTION( "print-architecture", 0, act_printarch, printarch ),
ACTION( "print-installation-architecture", 0, act_printinstarch, printinstarch ),
+ ACTION( "print-foreign-architectures", 0, act_foreignarchs, print_foreign_archs ),
ACTION( "predep-package", 0, act_predeppackage, predeppackage ),
ACTION( "compare-versions", 0, act_cmpversions, cmpversions ),
/*
ACTION( "command-fd", 'c', act_commandfd, commandfd ),
*/
+ { "foreign-architecture", 0,1, NULL, NULL, set_foreign_arch, 0, &foreign_archs },
{ "status-fd", 0, 1, NULL, NULL, setpipe, 0, &status_pipes },
{ "log", 0, 1, NULL, &log_file, NULL, 0 },
{ "pending", 'a', 0, &f_pending, NULL, NULL, 1 },
diff --git a/src/main.h b/src/main.h
index eb5bfce..ec12fdf 100644
--- a/src/main.h
+++ b/src/main.h
@@ -57,6 +57,7 @@ enum action { act_unset, act_install, act_unpack, act_avail, act_configure,
act_unpackchk, act_status, act_searchfiles, act_audit, act_listfiles,
act_controlpath,
act_assertpredep, act_printarch, act_predeppackage, act_cmpversions,
+ act_foreignarchs,
act_printinstarch, act_compareversions, act_printavail, act_avclear,
act_forgetold,
act_getselections, act_setselections, act_clearselections,
@@ -102,6 +103,12 @@ extern const char *instdir;
extern struct pkginqueue *ignoredependss;
extern const char architecture[];
+struct architecture {
+ struct architecture *next;
+ const char *name;
+};
+extern struct architecture *foreign_archs;
+
/* from archives.c */
void archivefiles(const char *const *argv);
@@ -130,6 +137,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 print_foreign_archs(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..313f2f3 100644
--- a/src/processarc.c
+++ b/src/processarc.c
@@ -48,6 +48,19 @@
#include "main.h"
#include "archives.h"
+static int
+allowed_foreign_arch(char *this_arch)
+{
+ struct architecture *archp;
+
+ for (archp = foreign_archs; archp; archp = archp->next)
+ if (strcmp(this_arch, archp->name) == 0)
+ return 1;
+
+ return 0;
+}
+
+
void process_archive(const char *filename) {
static const struct TarFunctions tf = {
tarfileread,
--
1.6.3.3
From 43a50967859371af7c6ed852d176a4086c2e88ff Mon Sep 17 00:00:00 2001
From: Steve Langasek <steve.langasek@canonical.com>
Date: Sat, 29 Aug 2009 12:35:31 -0700
Subject: [PATCH 2/2] Hook in the foreign_archs list when checking if a package is ok to install
---
src/processarc.c | 3 ++-
1 files changed, 2 insertions(+), 1 deletions(-)
diff --git a/src/processarc.c b/src/processarc.c
index 313f2f3..ce6771c 100644
--- a/src/processarc.c
+++ b/src/processarc.c
@@ -229,7 +229,8 @@ void process_archive(const char *filename) {
if (pkg->available.architecture && *pkg->available.architecture &&
strcmp(pkg->available.architecture,"all") &&
- strcmp(pkg->available.architecture,architecture))
+ strcmp(pkg->available.architecture,architecture) &&
+ !allowed_foreign_arch(pkg->available.architecture))
forcibleerr(fc_architecture,
_("package architecture (%s) does not match system (%s)"),
pkg->available.architecture,architecture);
--
1.6.3.3
Attachment:
signature.asc
Description: Digital signature