]>
git.saurik.com Git - apt.git/blob - methods/copy.cc
b1c0fe3601cc8d4308502ad808c481802d72ba19
1 // -*- mode: cpp; mode: fold -*-
3 // $Id: copy.cc,v 1.3 1998/10/26 07:11:52 jgg Exp $
4 /* ######################################################################
6 Copy URI - This method takes a uri like a file: uri and copies it
7 to the destination file.
9 ##################################################################### */
11 // Include Files /*{{{*/
12 #include <apt-pkg/fileutl.h>
14 #include <apt-pkg/error.h>
22 // Fail - Generate a failure message /*{{{*/
23 // ---------------------------------------------------------------------
27 string Err
= "Undetermined Error";
28 if (_error
->empty() == false)
29 _error
->PopMessage(Err
);
31 printf("400 URI Failure\n"
33 "Message: %s\n\n",URI
.c_str(),Err
.c_str());
41 SetNonBlock(STDIN_FILENO
,true);
43 printf("100 Capabilities\n"
45 "Pipeline: true\n\n");
47 vector
<string
> Messages
;
50 if (WaitFd(STDIN_FILENO
) == false ||
51 ReadMessages(STDIN_FILENO
,Messages
) == false)
54 while (Messages
.empty() == false)
56 string Message
= Messages
.front();
57 Messages
.erase(Messages
.begin());
59 // Fetch the message number
61 int Number
= strtol(Message
.c_str(),&End
,10);
62 if (End
== Message
.c_str())
64 cerr
<< "Malformed message!" << endl
;
68 // We only understand 600 URI Fetch messages
73 string URI
= LookupTag(Message
,"URI");
74 string Target
= LookupTag(Message
,"Filename");
77 string::size_type Pos
= URI
.find(':');
78 if (Pos
== string::npos
)
80 _error
->Error("Invalid message");
84 string File
= string(URI
,Pos
+1);
86 // Start the reply message
87 string Result
= "201 URI Done";
88 Result
+= "\nURI: " + URI
;
89 Result
+= "\nFileName: " + Target
;
91 // See if the file exists
92 FileFd
From(File
,FileFd::ReadOnly
);
93 FileFd
To(Target
,FileFd::WriteEmpty
);
95 if (_error
->PendingError() == true)
102 if (CopyFile(From
,To
) == false)
111 // Transfer the modification times
113 if (stat(File
.c_str(),&Buf
) != 0)
115 _error
->Errno("stat","Failed to stat");
119 struct utimbuf TimeBuf
;
120 TimeBuf
.actime
= Buf
.st_atime
;
121 TimeBuf
.modtime
= Buf
.st_mtime
;
122 if (utime(Target
.c_str(),&TimeBuf
) != 0)
125 _error
->Errno("utime","Failed to set modification time");
132 if (write(STDOUT_FILENO
,Result
.begin(),Result
.length()) !=
133 (signed)Result
.length())