]> git.saurik.com Git - apt.git/blame - apt-pkg/contrib/fileutl.h
ensure lists/ files have correct permissions after apt-cdrom add
[apt.git] / apt-pkg / contrib / fileutl.h
CommitLineData
578bfd0a
AL
1// -*- mode: cpp; mode: fold -*-
2// Description /*{{{*/
233b185f 3// $Id: fileutl.h,v 1.26 2001/05/07 05:06:52 jgg Exp $
578bfd0a
AL
4/* ######################################################################
5
6 File Utilities
7
8 CopyFile - Buffered copy of a single file
9 GetLock - dpkg compatible lock file manipulation (fcntl)
10 FileExists - Returns true if the file exists
11 SafeGetCWD - Returns the CWD in a string with overrun protection
12
13 The file class is a handy abstraction for various functions+classes
14 that need to accept filenames.
15
16 This source is placed in the Public Domain, do with it what you will
17 It was originally written by Jason Gunthorpe.
18
19 ##################################################################### */
20 /*}}}*/
578bfd0a
AL
21#ifndef PKGLIB_FILEUTL_H
22#define PKGLIB_FILEUTL_H
23
1cd1c398 24#include <apt-pkg/macros.h>
699b209e 25#include <apt-pkg/aptconfiguration.h>
6c139d6e 26
578bfd0a 27#include <string>
46e39c8e 28#include <vector>
e45c4617 29#include <set>
453b82a3 30#include <time.h>
578bfd0a 31
a3a03f5d 32#include <zlib.h>
33
a4f6bdc8
DK
34#ifndef APT_8_CLEANER_HEADERS
35using std::string;
36#endif
37
144c0969
JAK
38/* Define this for python-apt */
39#define APT_HAS_GZIP 1
40
032bd56f 41class FileFdPrivate;
8e06abb2 42class FileFd
578bfd0a
AL
43{
44 protected:
45 int iFd;
46
ddc1d8d0 47 enum LocalFlags {AutoClose = (1<<0),Fail = (1<<1),DelOnFail = (1<<2),
032bd56f 48 HitEof = (1<<3), Replace = (1<<4), Compressed = (1<<5) };
578bfd0a 49 unsigned long Flags;
8f3ba4e8
DK
50 std::string FileName;
51 std::string TemporaryFileName;
3184b4cf 52
578bfd0a 53 public:
257e8d66
DK
54 enum OpenMode {
55 ReadOnly = (1 << 0),
56 WriteOnly = (1 << 1),
57 ReadWrite = ReadOnly | WriteOnly,
58
59 Create = (1 << 2),
60 Exclusive = (1 << 3),
61 Atomic = Exclusive | (1 << 4),
62 Empty = (1 << 5),
63
64 WriteEmpty = ReadWrite | Create | Empty,
65 WriteExists = ReadWrite,
66 WriteAny = ReadWrite | Create,
67 WriteTemp = ReadWrite | Create | Exclusive,
68 ReadOnlyGzip,
69 WriteAtomic = ReadWrite | Create | Atomic
70 };
468720c5 71 enum CompressMode { Auto = 'A', None = 'N', Extension = 'E', Gzip = 'G', Bzip2 = 'B', Lzma = 'L', Xz = 'X' };
578bfd0a 72
650faab0 73 inline bool Read(void *To,unsigned long long Size,bool AllowEof)
f604cf55 74 {
650faab0 75 unsigned long long Jnk;
f604cf55
AL
76 if (AllowEof)
77 return Read(To,Size,&Jnk);
78 return Read(To,Size);
79 }
650faab0 80 bool Read(void *To,unsigned long long Size,unsigned long long *Actual = 0);
032bd56f 81 char* ReadLine(char *To, unsigned long long const Size);
650faab0 82 bool Write(const void *From,unsigned long long Size);
d68d65ad 83 bool static Write(int Fd, const void *From, unsigned long long Size);
650faab0
DK
84 bool Seek(unsigned long long To);
85 bool Skip(unsigned long long To);
86 bool Truncate(unsigned long long To);
87 unsigned long long Tell();
ca7fd76c 88 // the size of the file content (compressed files will be uncompressed first)
650faab0 89 unsigned long long Size();
ca7fd76c 90 // the size of the file itself
650faab0 91 unsigned long long FileSize();
76a763e1 92 time_t ModificationTime();
650faab0
DK
93
94 /* You want to use 'unsigned long long' if you are talking about a file
95 to be able to support large files (>2 or >4 GB) properly.
96 This shouldn't happen all to often for the indexes, but deb's might be…
97 And as the auto-conversation converts a 'unsigned long *' to a 'bool'
98 instead of 'unsigned long long *' we need to provide this explicitely -
99 otherwise applications magically start to fail… */
453b82a3 100 bool Read(void *To,unsigned long long Size,unsigned long *Actual) APT_DEPRECATED
650faab0
DK
101 {
102 unsigned long long R;
103 bool const T = Read(To, Size, &R);
104 *Actual = R;
105 return T;
106 }
107
e5f3f8c1
MV
108 bool Open(std::string FileName,unsigned int const Mode,CompressMode Compress,unsigned long const AccessMode = 0666);
109 bool Open(std::string FileName,unsigned int const Mode,APT::Configuration::Compressor const &compressor,unsigned long const AccessMode = 0666);
110 inline bool Open(std::string const &FileName,unsigned int const Mode, unsigned long const AccessMode = 0666) {
111 return Open(FileName, Mode, None, AccessMode);
257e8d66 112 };
52b47296
DK
113 bool OpenDescriptor(int Fd, unsigned int const Mode, CompressMode Compress, bool AutoClose=false);
114 bool OpenDescriptor(int Fd, unsigned int const Mode, APT::Configuration::Compressor const &compressor, bool AutoClose=false);
115 inline bool OpenDescriptor(int Fd, unsigned int const Mode, bool AutoClose=false) {
bce778a3 116 return OpenDescriptor(Fd, Mode, None, AutoClose);
257e8d66 117 };
578bfd0a 118 bool Close();
b2e465d6
AL
119 bool Sync();
120
578bfd0a
AL
121 // Simple manipulators
122 inline int Fd() {return iFd;};
d0254ba7 123 inline void Fd(int fd) { OpenDescriptor(fd, ReadWrite);};
a02db58f 124 gzFile gzFd() APT_DEPRECATED APT_PURE;
699b209e 125
578bfd0a
AL
126 inline bool IsOpen() {return iFd >= 0;};
127 inline bool Failed() {return (Flags & Fail) == Fail;};
128 inline void EraseOnFailure() {Flags |= DelOnFail;};
129 inline void OpFail() {Flags |= Fail;};
ddc1d8d0 130 inline bool Eof() {return (Flags & HitEof) == HitEof;};
032bd56f 131 inline bool IsCompressed() {return (Flags & Compressed) == Compressed;};
8f3ba4e8 132 inline std::string &Name() {return FileName;};
c7b5ce1c 133
e5f3f8c1 134 FileFd(std::string FileName,unsigned int const Mode,unsigned long AccessMode = 0666) : iFd(-1), Flags(0), d(NULL)
13d87e2e 135 {
e5f3f8c1 136 Open(FileName,Mode, None, AccessMode);
468720c5 137 };
e5f3f8c1 138 FileFd(std::string FileName,unsigned int const Mode, CompressMode Compress, unsigned long AccessMode = 0666) : iFd(-1), Flags(0), d(NULL)
468720c5 139 {
e5f3f8c1 140 Open(FileName,Mode, Compress, AccessMode);
13d87e2e 141 };
032bd56f 142 FileFd() : iFd(-1), Flags(AutoClose), d(NULL) {};
52b47296 143 FileFd(int const Fd, unsigned int const Mode = ReadWrite, CompressMode Compress = None) : iFd(-1), Flags(0), d(NULL)
032bd56f
DK
144 {
145 OpenDescriptor(Fd, Mode, Compress);
146 };
147 FileFd(int const Fd, bool const AutoClose) : iFd(-1), Flags(0), d(NULL)
148 {
149 OpenDescriptor(Fd, ReadWrite, None, AutoClose);
150 };
8e06abb2 151 virtual ~FileFd();
468720c5
DK
152
153 private:
032bd56f 154 FileFdPrivate* d;
ce62f1de 155 APT_HIDDEN bool OpenInternDescriptor(unsigned int const Mode, APT::Configuration::Compressor const &compressor);
ae635e3c
DK
156
157 // private helpers to set Fail flag and call _error->Error
ce62f1de
DK
158 APT_HIDDEN bool FileFdErrno(const char* Function, const char* Description,...) APT_PRINTF(3) APT_COLD;
159 APT_HIDDEN bool FileFdError(const char* Description,...) APT_PRINTF(2) APT_COLD;
578bfd0a
AL
160};
161
614adaa0 162bool RunScripts(const char *Cnf);
8b89e57f 163bool CopyFile(FileFd &From,FileFd &To);
8f3ba4e8
DK
164int GetLock(std::string File,bool Errors = true);
165bool FileExists(std::string File);
166bool RealFileExists(std::string File);
453b82a3 167bool DirectoryExists(std::string const &Path) APT_CONST;
8f3ba4e8
DK
168bool CreateDirectory(std::string const &Parent, std::string const &Path);
169time_t GetModificationTime(std::string const &Path);
c1409d1b 170bool Rename(std::string From, std::string To);
b29c3712 171
68e01721 172std::string GetTempDir();
0d29b9d4
MV
173FileFd* GetTempFile(std::string const &Prefix = "",
174 bool ImmediateUnlink = true);
68e01721 175
b29c3712
DK
176/** \brief Ensure the existence of the given Path
177 *
178 * \param Parent directory of the Path directory - a trailing
179 * /apt/ will be removed before CreateDirectory call.
180 * \param Path which should exist after (successful) call
181 */
8f3ba4e8 182bool CreateAPTDirectoryIfNeeded(std::string const &Parent, std::string const &Path);
b29c3712 183
8f3ba4e8 184std::vector<std::string> GetListOfFilesInDir(std::string const &Dir, std::string const &Ext,
b3793d41 185 bool const &SortList, bool const &AllowNoExt=false);
8f3ba4e8 186std::vector<std::string> GetListOfFilesInDir(std::string const &Dir, std::vector<std::string> const &Ext,
b39c1859 187 bool const &SortList);
fbb2c7e0 188std::vector<std::string> GetListOfFilesInDir(std::string const &Dir, bool SortList);
8f3ba4e8 189std::string SafeGetCWD();
3b5421b4
AL
190void SetCloseExec(int Fd,bool Close);
191void SetNonBlock(int Fd,bool Block);
1084d58a 192bool WaitFd(int Fd,bool write = false,unsigned long timeout = 0);
75ef8f14 193pid_t ExecFork();
e45c4617 194pid_t ExecFork(std::set<int> keep_fds);
96ae6de5 195void MergeKeepFdsFromConfiguration(std::set<int> &keep_fds);
3826564e 196bool ExecWait(pid_t Pid,const char *Name,bool Reap = false);
578bfd0a 197
479a2beb 198// check if the given file starts with a PGP cleartext signature
fe5804fc 199bool StartsWithGPGClearTextSignature(std::string const &FileName);
0854ad8b 200
d84da499
DK
201/** change file attributes to requested known good values
202 *
203 * The method skips the user:group setting if not root.
204 *
205 * @param requester is printed as functionname in error cases
206 * @param file is the file to be modified
207 * @param user is the (new) owner of the file, e.g. _apt
208 * @param group is the (new) group owning the file, e.g. root
209 * @param mode is the access mode of the file, e.g. 0644
210 */
211bool ChangeOwnerAndPermissionOfFile(char const * const requester, char const * const file, char const * const user, char const * const group, mode_t const mode);
212
13a28d85
JAK
213/**
214 * \brief Drop privileges
215 *
216 * Drop the privileges to the user _apt (or the one specified in
217 * APT::Sandbox::User). This does not set the supplementary group
218 * ids up correctly, it only uses the default group. Also prevent
219 * the process from gaining any new privileges afterwards, at least
220 * on Linux.
221 *
222 * \return true on success, false on failure with _error set
223 */
373fa2b4 224bool DropPrivileges();
fc1a78d8 225
8ce4327b 226// File string manipulators
8f3ba4e8
DK
227std::string flNotDir(std::string File);
228std::string flNotFile(std::string File);
229std::string flNoLink(std::string File);
230std::string flExtension(std::string File);
231std::string flCombine(std::string Dir,std::string File);
8ce4327b 232
53ac87ac
MV
233/** \brief Takes a file path and returns the absolute path
234 */
235std::string flAbsPath(std::string File);
236
8d01b9d6
MV
237// simple c++ glob
238std::vector<std::string> Glob(std::string const &pattern, int flags=0);
0854ad8b 239
7ad2a347
MV
240/** \brief Popen() implementation that execv() instead of using a shell
241 *
242 * \param Args the execv style command to run
243 * \param FileFd is a referenz to the FileFd to use for input or output
244 * \param Child a reference to the integer that stores the child pid
245 * Note that you must call ExecWait() or similar to cleanup
246 * \param Mode is either FileFd::ReadOnly or FileFd::WriteOnly
247 * \return true on success, false on failure with _error set
248 */
249bool Popen(const char* Args[], FileFd &Fd, pid_t &Child, FileFd::OpenMode Mode);
250
251
578bfd0a 252#endif