From dfe45e1f1133ffabe55297ae76c77a0767e3ae55 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Sat, 13 Oct 2012 09:59:54 +0200 Subject: correct "3 missing" to "2 missing" remap registrations as the Version handled in NewVersion is already registered --- apt-pkg/pkgcachegen.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'apt-pkg') diff --git a/apt-pkg/pkgcachegen.cc b/apt-pkg/pkgcachegen.cc index d5f1f9072..4eaf40b51 100644 --- a/apt-pkg/pkgcachegen.cc +++ b/apt-pkg/pkgcachegen.cc @@ -774,7 +774,7 @@ unsigned long pkgCacheGenerator::NewVersion(pkgCache::VerIterator &Ver, // Fill it in Ver = pkgCache::VerIterator(Cache,Cache.VerP + Version); - Dynamic DynV(Ver); + //Dynamic DynV(Ver); // caller MergeListVersion already takes care of it Ver->NextVer = Next; Ver->ID = Cache.HeaderP->VersionCount++; map_ptrloc const idxVerStr = WriteStringInMap(VerStr); -- cgit v1.2.3 From 7ccb5efb4f5b4471e6b424377f42feff070bb2d3 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Sat, 13 Oct 2012 11:16:30 +0200 Subject: write the native architecture as unique string into the cache header as it is used for arch:all packages as a map to arch:native. Otherwise arch comparisons later will see differences (Closes: #689323) --- apt-pkg/pkgcachegen.cc | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'apt-pkg') diff --git a/apt-pkg/pkgcachegen.cc b/apt-pkg/pkgcachegen.cc index 4eaf40b51..739b538c6 100644 --- a/apt-pkg/pkgcachegen.cc +++ b/apt-pkg/pkgcachegen.cc @@ -69,7 +69,9 @@ pkgCacheGenerator::pkgCacheGenerator(DynamicMMap *pMap,OpProgress *Prog) : *Cache.HeaderP = pkgCache::Header(); map_ptrloc const idxVerSysName = WriteStringInMap(_system->VS->Label); Cache.HeaderP->VerSysName = idxVerSysName; - map_ptrloc const idxArchitecture = WriteStringInMap(_config->Find("APT::Architecture")); + // this pointer is set in ReMap, but we need it now for WriteUniqString + Cache.StringItemP = (pkgCache::StringItem *)Map.Data(); + map_ptrloc const idxArchitecture = WriteUniqString(_config->Find("APT::Architecture")); Cache.HeaderP->Architecture = idxArchitecture; if (unlikely(idxVerSysName == 0 || idxArchitecture == 0)) return; -- cgit v1.2.3 From 036eb0127ac3339347eb39c805e98fe43905bafe Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Sat, 13 Oct 2012 12:14:44 +0200 Subject: * apt-pkg/edsp.cc: - include reinstall requests and already installed (= protected) packages in the install-request for external resolvers (Closes: #689331) --- apt-pkg/edsp.cc | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'apt-pkg') diff --git a/apt-pkg/edsp.cc b/apt-pkg/edsp.cc index adb8788b3..6ce9da784 100644 --- a/apt-pkg/edsp.cc +++ b/apt-pkg/edsp.cc @@ -214,9 +214,11 @@ bool EDSP::WriteRequest(pkgDepCache &Cache, FILE* output, bool const Upgrade, if (Progress != NULL && p % 100 == 0) Progress->Progress(p); string* req; - if (Cache[Pkg].Delete() == true) + pkgDepCache::StateCache &P = Cache[Pkg]; + if (P.Delete() == true) req = &del; - else if (Cache[Pkg].NewInstall() == true || Cache[Pkg].Upgrade() == true) + else if (P.NewInstall() == true || P.Upgrade() == true || P.ReInstall() == true || + (P.Mode == pkgDepCache::ModeKeep && (P.iFlags & pkgDepCache::Protected) == pkgDepCache::Protected)) req = &inst; else continue; -- cgit v1.2.3 From 9ed80cdd1faceb32963393449bc94a5d93a9115f Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Sat, 13 Oct 2012 13:18:29 +0200 Subject: * apt-pkg/policy.cc: - match pins with(out) an architecture as we do on the commandline (partly fixing #687255, b= support has to wait for jessie) --- apt-pkg/policy.cc | 49 ++++++++++++++++++++++++++----------------------- 1 file changed, 26 insertions(+), 23 deletions(-) (limited to 'apt-pkg') diff --git a/apt-pkg/policy.cc b/apt-pkg/policy.cc index b47dab90c..4ae3b5f87 100644 --- a/apt-pkg/policy.cc +++ b/apt-pkg/policy.cc @@ -27,6 +27,7 @@ #include #include +#include #include #include #include @@ -259,17 +260,33 @@ void pkgPolicy::CreatePin(pkgVersionMatch::MatchType Type,string Name, } // find the package (group) this pin applies to - pkgCache::GrpIterator Grp; - pkgCache::PkgIterator Pkg; - if (Arch.empty() == false) - Pkg = Cache->FindPkg(Name, Arch); - else { - Grp = Cache->FindGrp(Name); - if (Grp.end() == false) - Pkg = Grp.PackageList(); + pkgCache::GrpIterator Grp = Cache->FindGrp(Name); + bool matched = false; + if (Grp.end() == false) + { + std::string MatchingArch; + if (Arch.empty() == true) + MatchingArch = Cache->NativeArch(); + else + MatchingArch = Arch; + APT::CacheFilter::PackageArchitectureMatchesSpecification pams(MatchingArch); + for (pkgCache::PkgIterator Pkg = Grp.PackageList(); Pkg.end() != true; Pkg = Grp.NextPkg(Pkg)) + { + if (pams(Pkg.Arch()) == false) + continue; + Pin *P = Pins + Pkg->ID; + // the first specific stanza for a package is the ruler, + // all others need to be ignored + if (P->Type != pkgVersionMatch::None) + P = &*Unmatched.insert(Unmatched.end(),PkgPin(Pkg.FullName())); + P->Type = Type; + P->Priority = Priority; + P->Data = Data; + matched = true; + } } - if (Pkg.end() == true) + if (matched == false) { PkgPin *P = &*Unmatched.insert(Unmatched.end(),PkgPin(Name)); if (Arch.empty() == false) @@ -279,20 +296,6 @@ void pkgPolicy::CreatePin(pkgVersionMatch::MatchType Type,string Name, P->Data = Data; return; } - - for (; Pkg.end() != true; Pkg = Grp.NextPkg(Pkg)) - { - Pin *P = Pins + Pkg->ID; - // the first specific stanza for a package is the ruler, - // all others need to be ignored - if (P->Type != pkgVersionMatch::None) - P = &*Unmatched.insert(Unmatched.end(),PkgPin(Pkg.FullName())); - P->Type = Type; - P->Priority = Priority; - P->Data = Data; - if (Grp.end() == true) - break; - } } /*}}}*/ // Policy::GetMatch - Get the matching version for a package pin /*{{{*/ -- cgit v1.2.3 From b8c50bd0415bd4ea16a8f09356d882f267976d40 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Sat, 13 Oct 2012 17:25:07 +0200 Subject: * apt-pkg/contrib/netrc.cc: - remove the 64 char limit for login/password in internal usage --- apt-pkg/contrib/netrc.cc | 43 +++++++++++++++++++++++++++---------------- 1 file changed, 27 insertions(+), 16 deletions(-) (limited to 'apt-pkg') diff --git a/apt-pkg/contrib/netrc.cc b/apt-pkg/contrib/netrc.cc index 56e59d84b..950d21dad 100644 --- a/apt-pkg/contrib/netrc.cc +++ b/apt-pkg/contrib/netrc.cc @@ -44,11 +44,11 @@ enum { #define NETRC DOT_CHAR "netrc" /* returns -1 on failure, 0 if the host is found, 1 is the host isn't found */ -int parsenetrc (char *host, char *login, char *password, char *netrcfile = NULL) +static int parsenetrc_string (char *host, std::string &login, std::string &password, char *netrcfile = NULL) { FILE *file; int retcode = 1; - int specific_login = (login[0] != 0); + int specific_login = (login.empty() == false); char *home = NULL; bool netrc_alloc = false; @@ -88,7 +88,7 @@ int parsenetrc (char *host, char *login, char *password, char *netrcfile = NULL) while (!done && fgets(netrcbuffer, sizeof (netrcbuffer), file)) { tok = strtok_r (netrcbuffer, " \t\n", &tok_buf); while (!done && tok) { - if(login[0] && password[0]) { + if(login.empty() == false && password.empty() == false) { done = true; break; } @@ -120,13 +120,13 @@ int parsenetrc (char *host, char *login, char *password, char *netrcfile = NULL) /* we are now parsing sub-keywords concerning "our" host */ if (state_login) { if (specific_login) - state_our_login = !strcasecmp (login, tok); + state_our_login = !strcasecmp (login.c_str(), tok); else - strncpy (login, tok, LOGINSIZE - 1); + login = tok; state_login = 0; } else if (state_password) { if (state_our_login || !specific_login) - strncpy (password, tok, PASSWORDSIZE - 1); + password = tok; state_password = 0; } else if (!strcasecmp ("login", tok)) state_login = 1; @@ -152,6 +152,18 @@ int parsenetrc (char *host, char *login, char *password, char *netrcfile = NULL) return retcode; } +// for some unknown reason this method is exported so keep a compatible interface for now … +int parsenetrc (char *host, char *login, char *password, char *netrcfile = NULL) +{ + std::string login_string, password_string; + int const ret = parsenetrc_string(host, login_string, password_string, netrcfile); + if (ret < 0) + return ret; + strncpy(login, login_string.c_str(), LOGINSIZE - 1); + strncpy(password, password_string.c_str(), PASSWORDSIZE - 1); + return ret; +} + void maybe_add_auth (URI &Uri, string NetRCFile) { @@ -162,21 +174,20 @@ void maybe_add_auth (URI &Uri, string NetRCFile) { if (NetRCFile.empty () == false) { - char login[64] = ""; - char password[64] = ""; + std::string login, password; char *netrcfile = strdup(NetRCFile.c_str()); // first check for a generic host based netrc entry char *host = strdup(Uri.Host.c_str()); - if (host && parsenetrc (host, login, password, netrcfile) == 0) + if (host && parsenetrc_string(host, login, password, netrcfile) == 0) { if (_config->FindB("Debug::Acquire::netrc", false) == true) std::clog << "host: " << host << " user: " << login - << " pass-size: " << strlen(password) + << " pass-size: " << password.size() << std::endl; - Uri.User = string (login); - Uri.Password = string (password); + Uri.User = login; + Uri.Password = password; free(netrcfile); free(host); return; @@ -187,15 +198,15 @@ void maybe_add_auth (URI &Uri, string NetRCFile) // a lookup uri.startswith(host) in the netrc file parser (because // of the "/" char *hostpath = strdup(string(Uri.Host+Uri.Path).c_str()); - if (hostpath && parsenetrc (hostpath, login, password, netrcfile) == 0) + if (hostpath && parsenetrc_string(hostpath, login, password, netrcfile) == 0) { if (_config->FindB("Debug::Acquire::netrc", false) == true) std::clog << "hostpath: " << hostpath << " user: " << login - << " pass-size: " << strlen(password) + << " pass-size: " << password.size() << std::endl; - Uri.User = string (login); - Uri.Password = string (password); + Uri.User = login; + Uri.Password = password; } free(netrcfile); free(hostpath); -- cgit v1.2.3 From 7f18595b3ef9a348719969889097adb4f45d44f0 Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Sat, 13 Oct 2012 18:56:23 +0200 Subject: remove 256 char line limit by using getline() (POSIX.1-2008) --- apt-pkg/contrib/netrc.cc | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'apt-pkg') diff --git a/apt-pkg/contrib/netrc.cc b/apt-pkg/contrib/netrc.cc index 950d21dad..c5f9630c4 100644 --- a/apt-pkg/contrib/netrc.cc +++ b/apt-pkg/contrib/netrc.cc @@ -79,13 +79,14 @@ static int parsenetrc_string (char *host, std::string &login, std::string &passw char *tok; char *tok_buf; bool done = false; - char netrcbuffer[256]; + char *netrcbuffer = NULL; + size_t netrcbuffer_size = 0; int state = NOTHING; char state_login = 0; /* Found a login keyword */ char state_password = 0; /* Found a password keyword */ - while (!done && fgets(netrcbuffer, sizeof (netrcbuffer), file)) { + while (!done && getline(&netrcbuffer, &netrcbuffer_size, file) != -1) { tok = strtok_r (netrcbuffer, " \t\n", &tok_buf); while (!done && tok) { if(login.empty() == false && password.empty() == false) { @@ -142,8 +143,9 @@ static int parsenetrc_string (char *host, std::string &login, std::string &passw tok = strtok_r (NULL, " \t\n", &tok_buf); } /* while(tok) */ - } /* while fgets() */ + } /* while getline() */ + free(netrcbuffer); fclose(file); } -- cgit v1.2.3