summaryrefslogtreecommitdiff
path: root/methods/file.cc
diff options
context:
space:
mode:
authorArch Librarian <arch@canonical.com>2004-09-20 16:51:09 +0000
committerArch Librarian <arch@canonical.com>2004-09-20 16:51:09 +0000
commit24231681aa99e84c8a6aae5e54b7e207e19d6087 (patch)
tree65cbe883a45c8a0ca042123c9e2ffb0c993a0903 /methods/file.cc
parent0a8a80e58374771acc225fe1e08ed8e0fe0016cc (diff)
Sync
Author: jgg Date: 1998-10-23 00:49:58 GMT Sync
Diffstat (limited to 'methods/file.cc')
-rw-r--r--methods/file.cc140
1 files changed, 137 insertions, 3 deletions
diff --git a/methods/file.cc b/methods/file.cc
index 71c564301..fc42c2968 100644
--- a/methods/file.cc
+++ b/methods/file.cc
@@ -1,10 +1,144 @@
+// -*- mode: cpp; mode: fold -*-
+// Description /*{{{*/
+// $Id: file.cc,v 1.3 1998/10/23 00:50:02 jgg Exp $
+/* ######################################################################
+
+ File URI method for APT
+
+ This simply checks that the file specified exists, if so the relevent
+ information is returned. If a .gz filename is specified then the file
+ name with .gz removed will also be checked and information about it
+ will be returned in Alt-*
+
+ ##################################################################### */
+ /*}}}*/
+// Include Files /*{{{*/
+#include <apt-pkg/fileutl.h>
+#include <strutl.h>
+
+#include <sys/stat.h>
+#include <unistd.h>
#include <stdio.h>
+ /*}}}*/
+
+// Fail - Generate a failure message /*{{{*/
+// ---------------------------------------------------------------------
+/* */
+void Fail(string URI)
+{
+ printf("400 URI Failure\n"
+ "URI: %s\n"
+ "Message: File does not exist\n\n",URI.c_str());
+}
+ /*}}}*/
int main()
{
+ setlinebuf(stdout);
+ SetNonBlock(STDIN_FILENO,true);
+
printf("100 Capabilities\n"
"Version: 1.0\n"
- "Pre-Scan: true\n\n");
- fflush(stdout);
- sleep(10);
+ "Pipeline: true\n\n");
+
+ vector<string> Messages;
+ while (1)
+ {
+ if (WaitFd(STDIN_FILENO) == false ||
+ ReadMessages(STDIN_FILENO,Messages) == false)
+ return 0;
+
+ while (Messages.empty() == false)
+ {
+ string Message = Messages.front();
+ Messages.erase(Messages.begin());
+
+ // Fetch the message number
+ char *End;
+ int Number = strtol(Message.c_str(),&End,10);
+ if (End == Message.c_str())
+ {
+ cerr << "Malformed message!" << endl;
+ return 100;
+ }
+
+ // We only understand 600 URI Fetch messages
+ if (Number != 600)
+ continue;
+
+ // Grab the URI bit
+ string URI = LookupTag(Message,"URI");
+
+ // Grab the filename
+ string::size_type Pos = URI.find(':');
+ if (Pos == string::npos)
+ {
+ Fail(URI);
+ continue;
+ }
+ string File = string(URI,Pos+1);
+
+ // Grab the modification time
+ time_t LastMod;
+ string LTime = LookupTag(Message,"Last-Modified");
+ if (LTime.empty() == false && StrToTime(LTime,LastMod) == false)
+ LTime = string();
+
+ // Start the reply message
+ string Result = "201 URI Done";
+ Result += "\nURI: " + URI;
+
+ // See if the file exists
+ struct stat Buf;
+ bool Ok = false;
+ if (stat(File.c_str(),&Buf) == 0)
+ {
+ char S[300];
+ sprintf(S,"\nSize: %ld",Buf.st_size);
+
+ Result += "\nFilename: " + File;
+ Result += S;
+ Result += "\nLast-Modified: " + TimeRFC1123(Buf.st_mtime);
+ if (LTime.empty() == false && LastMod == Buf.st_mtime)
+ Result += "\nIMS-Hit: true";
+
+ Ok = true;
+ }
+
+ // See if we can compute a file without a .gz exentsion
+ Pos = File.rfind(".gz");
+ if (Pos + 3 == File.length())
+ {
+ File = string(File,0,Pos);
+ if (stat(File.c_str(),&Buf) == 0)
+ {
+ char S[300];
+ sprintf(S,"\nAlt-Size: %ld",Buf.st_size);
+
+ Result += "\nAlt-Filename: " + File;
+ Result += S;
+ Result += "\nAlt-Last-Modified: " + TimeRFC1123(Buf.st_mtime);
+ if (LTime.empty() == false && LastMod == Buf.st_mtime)
+ Result += "\nAlt-IMS-Hit: true";
+
+ Ok = true;
+ }
+ }
+
+ // Did we find something?
+ if (Ok == false)
+ {
+ Fail(URI);
+ continue;
+ }
+ Result += "\n\n";
+
+ // Send the message
+ if (write(STDOUT_FILENO,Result.begin(),Result.length()) !=
+ (signed)Result.length())
+ return 100;
+ }
+ }
+
+ return 0;
}