]>
git.saurik.com Git - apt.git/blob - apt-pkg/contrib/fileutl.cc
1 // -*- mode: cpp; mode: fold -*-
3 // $Id: fileutl.cc,v 1.5 1998/07/15 05:56:43 jgg Exp $
4 /* ######################################################################
8 CopyFile - Buffered copy of a single file
9 GetLock - dpkg compatible lock file manipulation (fcntl)
11 This source is placed in the Public Domain, do with it what you will
12 It was originally written by Jason Gunthorpe.
14 ##################################################################### */
16 // Include Files /*{{{*/
18 #pragma implementation "apt-pkg/fileutl.h"
20 #include <apt-pkg/fileutl.h>
21 #include <apt-pkg/error.h>
25 #include <sys/fcntl.h>
26 #include <sys/types.h>
29 // CopyFile - Buffered copy of a file /*{{{*/
30 // ---------------------------------------------------------------------
31 /* The caller is expected to set things so that failure causes erasure */
32 bool CopyFile(File From
,File To
)
34 if (From
.IsOpen() == false || To
.IsOpen() == false)
37 // Buffered copy between fds
38 unsigned char *Buf
= new unsigned char[64000];
40 while ((Size
= read(From
.Fd(),Buf
,64000)) > 0)
42 if (To
.Write(Buf
,Size
) == false)
53 // GetLock - Gets a lock file /*{{{*/
54 // ---------------------------------------------------------------------
55 /* This will create an empty file of the given name and lock it. Once this
56 is done all other calls to GetLock in any other process will fail with
57 -1. The return result is the fd of the file, the call should call
58 close at some time. */
59 int GetLock(string File
,bool Errors
)
61 int FD
= open(File
.c_str(),O_RDWR
| O_CREAT
| O_TRUNC
,0640);
65 _error
->Errno("open","Could not open lock file %s",File
.c_str());
69 // Aquire a write lock
72 fl
.l_whence
= SEEK_SET
;
75 if (fcntl(FD
,F_SETLK
,&fl
) == -1)
78 _error
->Errno("open","Could not get lock %s",File
.c_str());
86 // FileExists - Check if a file exists /*{{{*/
87 // ---------------------------------------------------------------------
89 bool FileExists(string File
)
92 if (stat(File
.c_str(),&Buf
) != 0)
97 // SafeGetCWD - This is a safer getcwd that returns a dynamic string /*{{{*/
98 // ---------------------------------------------------------------------
99 /* We return / on failure. */
102 // Stash the current dir.
105 if (getcwd(S
,sizeof(S
)) == 0)
111 // File::File - Open a file /*{{{*/
112 // ---------------------------------------------------------------------
113 /* The most commonly used open mode combinations are given with Mode */
114 File::File(string FileName
,OpenMode Mode
, unsigned long Perms
)
120 iFd
= open(FileName
.c_str(),O_RDONLY
);
124 unlink(FileName
.c_str());
125 iFd
= open(FileName
.c_str(),O_RDWR
| O_CREAT
| O_EXCL
,Perms
);
129 iFd
= open(FileName
.c_str(),O_RDWR
);
134 _error
->Errno("open","Could not open file %s",FileName
.c_str());
136 this->FileName
= FileName
;
139 // File::~File - Closes the file /*{{{*/
140 // ---------------------------------------------------------------------
141 /* If the proper modes are selected then we close the Fd and possibly
142 unlink the file on error. */
148 // File::Read - Read a bit of the file /*{{{*/
149 // ---------------------------------------------------------------------
151 bool File::Read(void *To
,unsigned long Size
)
153 if (read(iFd
,To
,Size
) != (signed)Size
)
156 return _error
->Errno("read","Read error");
162 // File::Write - Write to the file /*{{{*/
163 // ---------------------------------------------------------------------
165 bool File::Write(void *From
,unsigned long Size
)
167 if (write(iFd
,From
,Size
) != (signed)Size
)
170 return _error
->Errno("write","Write error");
176 // File::Seek - Seek in the file /*{{{*/
177 // ---------------------------------------------------------------------
179 bool File::Seek(unsigned long To
)
181 if (lseek(iFd
,To
,SEEK_SET
) != (signed)To
)
184 return _error
->Error("Unable to seek to %u",To
);
190 // File::Size - Return the size of the file /*{{{*/
191 // ---------------------------------------------------------------------
193 unsigned long File::Size()
196 if (fstat(iFd
,&Buf
) != 0)
197 return _error
->Errno("fstat","Unable to determine the file size");
201 // File::Close - Close the file if the close flag is set /*{{{*/
202 // ---------------------------------------------------------------------
207 if ((Flags
& AutoClose
) == AutoClose
)
208 if (iFd
>= 0 && close(iFd
) != 0)
209 Res
&= _error
->Errno("close","Problem closing the file");
212 if ((Flags
& Fail
) == Fail
&& (Flags
& DelOnFail
) == DelOnFail
&&
213 FileName
.empty() == false)
214 if (unlink(FileName
.c_str()) != 0)
215 Res
&= _error
->Warning("unlnk","Problem unlinking the file");