From 561ab0db89ae9c4de1b37bac12d5ad8353848862 Mon Sep 17 00:00:00 2001 From: Arch Librarian Date: Mon, 20 Sep 2004 16:51:11 +0000 Subject: Added copy method Author: jgg Date: 1998-10-25 01:57:07 GMT Added copy method --- methods/copy.cc | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 methods/copy.cc (limited to 'methods/copy.cc') diff --git a/methods/copy.cc b/methods/copy.cc new file mode 100644 index 000000000..68253a64c --- /dev/null +++ b/methods/copy.cc @@ -0,0 +1,116 @@ +// -*- mode: cpp; mode: fold -*- +// Description /*{{{*/ +// $Id: copy.cc,v 1.1 1998/10/25 01:57:07 jgg Exp $ +/* ###################################################################### + + Copy URI - This method takes a uri like a file: uri and copies it + to the destination URI. + + ##################################################################### */ + /*}}}*/ +// Include Files /*{{{*/ +#include +#include +#include + +#include +#include +#include + /*}}}*/ + +// Fail - Generate a failure message /*{{{*/ +// --------------------------------------------------------------------- +/* */ +void Fail(string URI) +{ + string Err = "Undetermined Error"; + if (_error->empty() == false) + _error->PopMessage(Err); + + printf("400 URI Failure\n" + "URI: %s\n" + "Message: %s\n\n",URI.c_str(),Err.c_str()); + _error->Discard(); +} + /*}}}*/ + +int main() +{ + setlinebuf(stdout); + SetNonBlock(STDIN_FILENO,true); + + printf("100 Capabilities\n" + "Version: 1.0\n" + "Pipeline: true\n\n"); + + vector 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"); + string Target = LookupTag(Message,"Filename"); + + // Grab the filename + string::size_type Pos = URI.find(':'); + if (Pos == string::npos) + { + _error->Error("Invalid message"); + Fail(URI); + continue; + } + string File = string(URI,Pos+1); + + // Start the reply message + string Result = "201 URI Done"; + Result += "\nURI: " + URI; + Result += "\nFileName: " + Target; + + // See if the file exists + FileFd From(File,FileFd::ReadOnly); + FileFd To(Target,FileFd::WriteEmpty); + To.EraseOnFailure(); + if (_error->PendingError() == true) + { + Fail(URI); + continue; + } + + // Copy the file + if (CopyFile(From,To) == false) + { + Fail(URI); + continue; + } + + // Send the message + Result += "\n\n"; + if (write(STDOUT_FILENO,Result.begin(),Result.length()) != + (signed)Result.length()) + return 100; + } + } + + return 0; +} -- cgit v1.2.3