From 2a7497704e9dee1f1d987e7a2cd59e939d991909 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Tue, 13 Sep 2005 14:09:50 +0000 Subject: * merged from apt--cdrom-fallback--0 Patches applied: * michael.vogt@ubuntu.com--2005/apt--cdrom-fallback--0--base-0 tag of apt@packages.debian.org/apt--main--0--patch-110 * michael.vogt@ubuntu.com--2005/apt--cdrom-fallback--0--patch-1 * initial patch to make falling back from cdrom possible * michael.vogt@ubuntu.com--2005/apt--cdrom-fallback--0--patch-2 * fix in methods/cdrom.cc: don't call Fail() but return false so that apt can fallback to a differencent source --- methods/cdrom.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'methods') diff --git a/methods/cdrom.cc b/methods/cdrom.cc index 41eb8a0ee..d6b8eae75 100644 --- a/methods/cdrom.cc +++ b/methods/cdrom.cc @@ -166,8 +166,7 @@ bool CDROMMethod::Fetch(FetchItem *Itm) if (MediaFail(Get.Host,CDROM) == false) { CurrentID = "FAIL"; - Fail(_("Wrong CD-ROM"),true); - return true; + return _error->Error(_("Disk not found.")); } } -- cgit v1.2.3 From 927c393f1305925c1456c931e1e7b45afd6f051d Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Sun, 23 Oct 2005 11:12:54 +0000 Subject: * added http data corruption fix patch (#280844) --- methods/http.cc | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) (limited to 'methods') diff --git a/methods/http.cc b/methods/http.cc index e2337a9ba..dbf2d1b43 100644 --- a/methods/http.cc +++ b/methods/http.cc @@ -205,28 +205,23 @@ bool CircleBuf::WriteTillEl(string &Data,bool Single) if (Buf[I%Size] != '\n') continue; ++I; - if (I < InP && Buf[I%Size] == '\r') - ++I; if (Single == false) { - if (Buf[I%Size] != '\n') - continue; - ++I; if (I < InP && Buf[I%Size] == '\r') ++I; + if (I >= InP || Buf[I%Size] != '\n') + continue; + ++I; } - if (I > InP) - I = InP; - Data = ""; while (OutP < I) { unsigned long Sz = LeftWrite(); if (Sz == 0) return false; - if (I - OutP < LeftWrite()) + if (I - OutP < Sz) Sz = I - OutP; Data += string((char *)(Buf + (OutP%Size)),Sz); OutP += Sz; -- cgit v1.2.3 From 46e00f9d71300f3a80a4a311e369e64a48ce396f Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Tue, 22 Nov 2005 19:34:02 +0000 Subject: * ABI change: merged more flexible pkgAcquireFile code --- methods/makefile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'methods') diff --git a/methods/makefile b/methods/makefile index 06fd2a6fc..1e3b1ef85 100644 --- a/methods/makefile +++ b/methods/makefile @@ -7,7 +7,7 @@ include ../buildlib/defaults.mak BIN := $(BIN)/methods # FIXME.. -LIB_APT_PKG_MAJOR = 3.10 +LIB_APT_PKG_MAJOR = 3.11 APT_DOMAIN := libapt-pkg$(LIB_APT_PKG_MAJOR) # The file method -- cgit v1.2.3 From 7c6e2dc761f736bf203f7770f7a1c4a63f7063d4 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Tue, 22 Nov 2005 22:11:06 +0000 Subject: * merged http download limit for apt (#146877) --- methods/http.cc | 41 +++++++++++++++++++++++++++++++++++++++-- methods/http.h | 5 +++++ 2 files changed, 44 insertions(+), 2 deletions(-) (limited to 'methods') diff --git a/methods/http.cc b/methods/http.cc index ba86aa6b6..a5c9601e7 100644 --- a/methods/http.cc +++ b/methods/http.cc @@ -58,6 +58,12 @@ unsigned long PipelineDepth = 10; unsigned long TimeOut = 120; bool Debug = false; + +unsigned long CircleBuf::BwReadLimit=0; +unsigned long CircleBuf::BwTickReadData=0; +struct timeval CircleBuf::BwReadTick={0,0}; +const unsigned int CircleBuf::BW_HZ=10; + // CircleBuf::CircleBuf - Circular input buffer /*{{{*/ // --------------------------------------------------------------------- /* */ @@ -65,6 +71,8 @@ CircleBuf::CircleBuf(unsigned long Size) : Size(Size), Hash(0) { Buf = new unsigned char[Size]; Reset(); + + CircleBuf::BwReadLimit = _config->FindI("Acquire::http::Dl-Limit",0)*1024; } /*}}}*/ // CircleBuf::Reset - Reset to the default state /*{{{*/ @@ -90,16 +98,45 @@ void CircleBuf::Reset() is non-blocking.. */ bool CircleBuf::Read(int Fd) { + unsigned long BwReadMax; + while (1) { // Woops, buffer is full if (InP - OutP == Size) return true; - + + // what's left to read in this tick + BwReadMax = CircleBuf::BwReadLimit/BW_HZ; + + if(CircleBuf::BwReadLimit) { + struct timeval now; + gettimeofday(&now,0); + + unsigned long d = (now.tv_sec-CircleBuf::BwReadTick.tv_sec)*1000000 + + now.tv_usec-CircleBuf::BwReadTick.tv_usec; + if(d > 1000000/BW_HZ) { + CircleBuf::BwReadTick = now; + CircleBuf::BwTickReadData = 0; + } + + if(CircleBuf::BwTickReadData >= BwReadMax) { + usleep(1000000/BW_HZ); + return true; + } + } + // Write the buffer segment int Res; - Res = read(Fd,Buf + (InP%Size),LeftRead()); + if(CircleBuf::BwReadLimit) { + Res = read(Fd,Buf + (InP%Size), + BwReadMax > LeftRead() ? LeftRead() : BwReadMax); + } else + Res = read(Fd,Buf + (InP%Size),LeftRead()); + if(Res > 0 && BwReadLimit > 0) + CircleBuf::BwTickReadData += Res; + if (Res == 0) return false; if (Res < 0) diff --git a/methods/http.h b/methods/http.h index c5a4d0e86..541e2952c 100644 --- a/methods/http.h +++ b/methods/http.h @@ -31,6 +31,11 @@ class CircleBuf unsigned long MaxGet; struct timeval Start; + static unsigned long BwReadLimit; + static unsigned long BwTickReadData; + static struct timeval BwReadTick; + static const unsigned int BW_HZ; + unsigned long LeftRead() { unsigned long Sz = Size - (InP - OutP); -- cgit v1.2.3 From b57c8bb4085634c3fbe219ae1fd005d6bd62987a Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Mon, 28 Nov 2005 22:27:06 +0000 Subject: * build-depend on libdb4.3 now, fix for kFreeBSD (#317718) --- methods/http.cc | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) (limited to 'methods') diff --git a/methods/http.cc b/methods/http.cc index a5c9601e7..dc3f0b763 100644 --- a/methods/http.cc +++ b/methods/http.cc @@ -824,7 +824,10 @@ bool HttpMethod::Flush(ServerState *Srv) { if (File != 0) { - SetNonBlock(File->Fd(),false); + // on GNU/kFreeBSD, apt dies on /dev/null because non-blocking + // can't be set + if (File->Name() != "/dev/null") + SetNonBlock(File->Fd(),false); if (Srv->In.WriteSpace() == false) return true; @@ -852,7 +855,10 @@ bool HttpMethod::ServerDie(ServerState *Srv) // Dump the buffer to the file if (Srv->State == ServerState::Data) { - SetNonBlock(File->Fd(),false); + // on GNU/kFreeBSD, apt dies on /dev/null because non-blocking + // can't be set + if (File->Name() != "/dev/null") + SetNonBlock(File->Fd(),false); while (Srv->In.WriteSpace() == true) { if (Srv->In.Write(File->Fd()) == false) -- cgit v1.2.3 From ce424cd4464ce46706046d581e05fbf292a54881 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Fri, 6 Jan 2006 00:02:14 +0000 Subject: * support multiple signatures --- methods/gpgv.cc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'methods') diff --git a/methods/gpgv.cc b/methods/gpgv.cc index 5cb154f66..a114ad797 100644 --- a/methods/gpgv.cc +++ b/methods/gpgv.cc @@ -247,7 +247,11 @@ bool GPGVMethod::Fetch(FetchItem *Itm) errmsg += (*I + "\n"); } } - return _error->Error(errmsg.c_str()); + // this is only fatal if we have no good sigs or if we have at + // least one bad signature. good signatures and NoPubKey signatures + // happen easily when a file is signed with multiple signatures + if(GoodSigners.empty() or !BadSigners.empty()) + return _error->Error(errmsg.c_str()); } // Transfer the modification times -- cgit v1.2.3 From 75dd8af14b76bb84a69a927ecae93f60600b9667 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Mon, 20 Feb 2006 20:38:11 +0000 Subject: * only remove the sigfile if pkgAcqMetaSig::Failed() didn't fail for a network error --- methods/connect.cc | 2 ++ 1 file changed, 2 insertions(+) (limited to 'methods') diff --git a/methods/connect.cc b/methods/connect.cc index 4e48927ed..8c2ac6d56 100644 --- a/methods/connect.cc +++ b/methods/connect.cc @@ -103,6 +103,8 @@ static bool DoConnect(struct addrinfo *Addr,string Host, if (Err != 0) { errno = Err; + if(errno == ECONNREFUSED) + Owner->SetFailExtraMsg("\nFailReason: ConnectionRefused"); return _error->Errno("connect",_("Could not connect to %s:%s (%s)."),Host.c_str(), Service,Name); } -- cgit v1.2.3 From da9ed163ca5ebe6dd33fda2679107bcbd3ffaa71 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Sun, 30 Apr 2006 10:58:28 +0200 Subject: * string i18n handling fixes (debian bug #349298) --- methods/gpgv.cc | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) (limited to 'methods') diff --git a/methods/gpgv.cc b/methods/gpgv.cc index a114ad797..75335b9b8 100644 --- a/methods/gpgv.cc +++ b/methods/gpgv.cc @@ -11,6 +11,7 @@ #include #include #include +#include #define GNUPGPREFIX "[GNUPG:]" #define GNUPGBADSIG "[GNUPG:] BADSIG" @@ -20,7 +21,7 @@ class GPGVMethod : public pkgAcqMethod { private: - const char *VerifyGetSigners(const char *file, const char *outfile, + string VerifyGetSigners(const char *file, const char *outfile, vector &GoodSigners, vector &BadSigners, vector &NoPubKeySigners); @@ -32,11 +33,15 @@ class GPGVMethod : public pkgAcqMethod GPGVMethod() : pkgAcqMethod("1.0",SingleInstance | SendConfig) {}; }; -const char *GPGVMethod::VerifyGetSigners(const char *file, const char *outfile, +string GPGVMethod::VerifyGetSigners(const char *file, const char *outfile, vector &GoodSigners, vector &BadSigners, vector &NoPubKeySigners) { + // setup a (empty) stringstream for formating the return value + std::stringstream ret; + res.str(""); + if (_config->FindB("Debug::Acquire::gpgv", false)) { std::cerr << "inside VerifyGetSigners" << std::endl; @@ -54,9 +59,11 @@ const char *GPGVMethod::VerifyGetSigners(const char *file, const char *outfile, std::cerr << "Keyring path: " << pubringpath << std::endl; } - if (stat(pubringpath.c_str(), &buff) != 0) - return (string("Couldn't access keyring: ") + strerror(errno)).c_str(); - + if (stat(pubringpath.c_str(), &buff) != 0) + { + ioprintf(ret, _("Couldn't access keyring: '%s'"), strerror(errno)); + return ret.str(); + } if (pipe(fd) < 0) { return "Couldn't create pipe"; @@ -65,7 +72,7 @@ const char *GPGVMethod::VerifyGetSigners(const char *file, const char *outfile, pid = fork(); if (pid < 0) { - return (string("Couldn't spawn new process") + strerror(errno)).c_str(); + return string("Couldn't spawn new process") + strerror(errno); } else if (pid == 0) { @@ -189,7 +196,7 @@ const char *GPGVMethod::VerifyGetSigners(const char *file, const char *outfile, { if (GoodSigners.empty()) return _("Internal error: Good signature, but could not determine key fingerprint?!"); - return NULL; + return ""; } else if (WEXITSTATUS(status) == 1) { @@ -197,9 +204,8 @@ const char *GPGVMethod::VerifyGetSigners(const char *file, const char *outfile, } else if (WEXITSTATUS(status) == 111) { - // FIXME String concatenation considered harmful. - return (string(_("Could not execute ")) + gpgvpath + - string(_(" to verify signature (is gnupg installed?)"))).c_str(); + ioprintf(ret, _("Could not execute '%s' to verify signature (is gnupg installed?)"), gpgvpath.c_str()); + return ret.str(); } else { @@ -221,8 +227,8 @@ bool GPGVMethod::Fetch(FetchItem *Itm) URIStart(Res); // Run gpgv on file, extract contents and get the key ID of the signer - const char *msg = VerifyGetSigners(Path.c_str(), Itm->DestFile.c_str(), - GoodSigners, BadSigners, NoPubKeySigners); + string msg = VerifyGetSigners(Path.c_str(), Itm->DestFile.c_str(), + GoodSigners, BadSigners, NoPubKeySigners); if (GoodSigners.empty() || !BadSigners.empty() || !NoPubKeySigners.empty()) { string errmsg; -- cgit v1.2.3 From b2c220756c2c571595765ca23da48c611b88d057 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Mon, 1 May 2006 16:17:08 +0200 Subject: * methods/gpgv.cc: typo --- methods/gpgv.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'methods') diff --git a/methods/gpgv.cc b/methods/gpgv.cc index 75335b9b8..ba7389cba 100644 --- a/methods/gpgv.cc +++ b/methods/gpgv.cc @@ -40,7 +40,7 @@ string GPGVMethod::VerifyGetSigners(const char *file, const char *outfile, { // setup a (empty) stringstream for formating the return value std::stringstream ret; - res.str(""); + ret.str(""); if (_config->FindB("Debug::Acquire::gpgv", false)) { -- cgit v1.2.3 From fc5f54175a514c31c9400d9f9d08e6496cf63823 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Mon, 8 May 2006 18:31:47 +0200 Subject: * methods/ftp.cc: remove a tried-to-downloaded file if the file is missing on the sever --- methods/ftp.cc | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'methods') diff --git a/methods/ftp.cc b/methods/ftp.cc index f595e0ca4..0c2aa00a7 100644 --- a/methods/ftp.cc +++ b/methods/ftp.cc @@ -1055,9 +1055,12 @@ bool FtpMethod::Fetch(FetchItem *Itm) UBuf.modtime = FailTime; utime(FailFile.c_str(),&UBuf); - // If the file is missing we hard fail otherwise transient fail - if (Missing == true) + // If the file is missing we hard fail and delete the destfile + // otherwise transient fail + if (Missing == true) { + unlink(FailFile.c_str()); return false; + } Fail(true); return true; } -- cgit v1.2.3 From 2abb68b77d4be00173c0aaab7d05277a053d3c5f Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Tue, 25 Jul 2006 11:55:17 +0200 Subject: * methods/gpgv.cc: - deal with gpgs NODATA message --- methods/gpgv.cc | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'methods') diff --git a/methods/gpgv.cc b/methods/gpgv.cc index ba7389cba..227e08d63 100644 --- a/methods/gpgv.cc +++ b/methods/gpgv.cc @@ -17,6 +17,7 @@ #define GNUPGBADSIG "[GNUPG:] BADSIG" #define GNUPGNOPUBKEY "[GNUPG:] NO_PUBKEY" #define GNUPGVALIDSIG "[GNUPG:] VALIDSIG" +#define GNUPGNODATA "[GNUPG:] NODATA" class GPGVMethod : public pkgAcqMethod { @@ -171,7 +172,12 @@ string GPGVMethod::VerifyGetSigners(const char *file, const char *outfile, std::cerr << "Got NO_PUBKEY " << std::endl; NoPubKeySigners.push_back(string(buffer+sizeof(GNUPGPREFIX))); } - + if (strncmp(buffer, GNUPGNODATA, sizeof(GNUPGBADSIG)-1) == 0) + { + if (_config->FindB("Debug::Acquire::gpgv", false)) + std::cerr << "Got NODATA! " << std::endl; + BadSigners.push_back(string(buffer+sizeof(GNUPGPREFIX))); + } if (strncmp(buffer, GNUPGVALIDSIG, sizeof(GNUPGVALIDSIG)-1) == 0) { char *sig = buffer + sizeof(GNUPGPREFIX); -- cgit v1.2.3 From 02b7ddb1404fa3969bceb03a5f35107884027ba6 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Wed, 16 Aug 2006 12:16:46 +0200 Subject: * methods/http.cc: - check for incorrect proxy settings more carefully --- methods/http.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'methods') diff --git a/methods/http.cc b/methods/http.cc index 341de94e3..c6623c46f 100644 --- a/methods/http.cc +++ b/methods/http.cc @@ -657,7 +657,7 @@ void HttpMethod::SendReq(FetchItem *Itm,CircleBuf &Out) will glitch HTTP/1.0 proxies because they do not filter it out and pass it on, HTTP/1.1 says the connection should default to keep alive and we expect the proxy to do this */ - if (Proxy.empty() == true) + if (Proxy.empty() == true || Proxy.Host.empty()) sprintf(Buf,"GET %s HTTP/1.1\r\nHost: %s\r\nConnection: keep-alive\r\n", QuoteString(Uri.Path,"~").c_str(),ProperHost.c_str()); else -- cgit v1.2.3 From 504bbe47e634f07c3de7a4868f63ee2ec142b9e4 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Tue, 12 Sep 2006 11:19:35 +0200 Subject: * methods/gzip.cc: - if it can't write (because var is full), close the FromGz stream to not hang in ExecWait() later --- methods/gzip.cc | 1 + 1 file changed, 1 insertion(+) (limited to 'methods') diff --git a/methods/gzip.cc b/methods/gzip.cc index 809afc0fc..55ff33270 100644 --- a/methods/gzip.cc +++ b/methods/gzip.cc @@ -111,6 +111,7 @@ bool GzipMethod::Fetch(FetchItem *Itm) if (To.Write(Buffer,Count) == false) { Failed = true; + FromGz.Close(); break; } } -- cgit v1.2.3 From 84cc6f7364d31321698ab3182bcd10d575710a49 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Sat, 30 Sep 2006 14:14:04 +0200 Subject: * methods/gzip.cc: - just stop on empty files, don't call the extractor * debian/changelog: - merged the last debian upload - added entry for extractor --- methods/gzip.cc | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'methods') diff --git a/methods/gzip.cc b/methods/gzip.cc index 55ff33270..a8e816bf3 100644 --- a/methods/gzip.cc +++ b/methods/gzip.cc @@ -52,6 +52,13 @@ bool GzipMethod::Fetch(FetchItem *Itm) // Open the source and destination files FileFd From(Path,FileFd::ReadOnly); + // if the file is empty, just rename it and return + if(From.Size() == 0) + { + Rename(Path, Itm->DestFile); + return true; + } + int GzOut[2]; if (pipe(GzOut) < 0) return _error->Errno("pipe",_("Couldn't open pipe for %s"),Prog); -- cgit v1.2.3 From 60a9e375317c42f6682704e2769b7b2776c7ec12 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Sat, 30 Sep 2006 16:30:42 +0200 Subject: * methods/gzip.cc: - fix invalid reanem --- methods/gzip.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'methods') diff --git a/methods/gzip.cc b/methods/gzip.cc index a8e816bf3..f732c0b86 100644 --- a/methods/gzip.cc +++ b/methods/gzip.cc @@ -55,7 +55,7 @@ bool GzipMethod::Fetch(FetchItem *Itm) // if the file is empty, just rename it and return if(From.Size() == 0) { - Rename(Path, Itm->DestFile); + rename(Path.c_str(), Itm->DestFile.c_str()); return true; } -- cgit v1.2.3