diff options
author | Michael Vogt <mvo@debian.org> | 2011-04-04 16:49:21 +0200 |
---|---|---|
committer | Michael Vogt <mvo@debian.org> | 2011-04-04 16:49:21 +0200 |
commit | bee9ae120eeaf9f43c9688440fc3fdb8d02bf94a (patch) | |
tree | 16f267931477609dca384e60b02cf3819764e171 /apt-pkg/aptconfiguration.cc | |
parent | 3a1f49c42aae17c23d52486db21fb7c05734dbd2 (diff) | |
parent | 410327e1ee0fac0c28a95e45ea75f7359cc8dcb4 (diff) |
merged from lp:~donkult/apt/sid
Diffstat (limited to 'apt-pkg/aptconfiguration.cc')
-rw-r--r-- | apt-pkg/aptconfiguration.cc | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/apt-pkg/aptconfiguration.cc b/apt-pkg/aptconfiguration.cc index b23e12acb..14ee09e0d 100644 --- a/apt-pkg/aptconfiguration.cc +++ b/apt-pkg/aptconfiguration.cc @@ -17,6 +17,7 @@ #include <sys/types.h> #include <dirent.h> +#include <stdio.h> #include <algorithm> #include <string> @@ -314,11 +315,41 @@ std::vector<std::string> const Configuration::getArchitectures(bool const &Cache if (likely(Cached == true) && archs.empty() == false) return archs; - archs = _config->FindVector("APT::Architectures"); string const arch = _config->Find("APT::Architecture"); + archs = _config->FindVector("APT::Architectures"); + if (unlikely(arch.empty() == true)) return archs; + // FIXME: It is a bit unclean to have debian specific code hereā¦ + if (archs.empty() == true) { + archs.push_back(arch); + string dpkgcall = _config->Find("Dir::Bin::dpkg", "dpkg"); + std::vector<string> const dpkgoptions = _config->FindVector("DPkg::options"); + for (std::vector<string>::const_iterator o = dpkgoptions.begin(); + o != dpkgoptions.end(); ++o) + dpkgcall.append(" ").append(*o); + dpkgcall.append(" --print-foreign-architectures 2> /dev/null"); + FILE *dpkg = popen(dpkgcall.c_str(), "r"); + char buf[1024]; + if(dpkg != NULL) { + if (fgets(buf, sizeof(buf), dpkg) != NULL) { + char* arch = strtok(buf, " "); + while (arch != NULL) { + for (; isspace(*arch) != 0; ++arch); + if (arch != '\0') { + char const* archend = arch; + for (; isspace(*archend) == 0 && *archend != '\0'; ++archend); + archs.push_back(string(arch, (archend - arch))); + } + arch = strtok(NULL, " "); + } + } + pclose(dpkg); + } + return archs; + } + if (archs.empty() == true || std::find(archs.begin(), archs.end(), arch) == archs.end()) archs.push_back(arch); |