]> git.saurik.com Git - apt.git/blame - apt-pkg/contrib/fileutl.h
fix regression that APT::Keep-Fds is not honored (closes: #730490)
[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>
578bfd0a 30
a3a03f5d 31#include <zlib.h>
32
a4f6bdc8
DK
33#ifndef APT_8_CLEANER_HEADERS
34using std::string;
35#endif
36
144c0969
JAK
37/* Define this for python-apt */
38#define APT_HAS_GZIP 1
39
032bd56f 40class FileFdPrivate;
8e06abb2 41class FileFd
578bfd0a
AL
42{
43 protected:
44 int iFd;
45
ddc1d8d0 46 enum LocalFlags {AutoClose = (1<<0),Fail = (1<<1),DelOnFail = (1<<2),
032bd56f 47 HitEof = (1<<3), Replace = (1<<4), Compressed = (1<<5) };
578bfd0a 48 unsigned long Flags;
8f3ba4e8
DK
49 std::string FileName;
50 std::string TemporaryFileName;
3184b4cf 51
578bfd0a 52 public:
257e8d66
DK
53 enum OpenMode {
54 ReadOnly = (1 << 0),
55 WriteOnly = (1 << 1),
56 ReadWrite = ReadOnly | WriteOnly,
57
58 Create = (1 << 2),
59 Exclusive = (1 << 3),
60 Atomic = Exclusive | (1 << 4),
61 Empty = (1 << 5),
62
63 WriteEmpty = ReadWrite | Create | Empty,
64 WriteExists = ReadWrite,
65 WriteAny = ReadWrite | Create,
66 WriteTemp = ReadWrite | Create | Exclusive,
67 ReadOnlyGzip,
68 WriteAtomic = ReadWrite | Create | Atomic
69 };
468720c5 70 enum CompressMode { Auto = 'A', None = 'N', Extension = 'E', Gzip = 'G', Bzip2 = 'B', Lzma = 'L', Xz = 'X' };
578bfd0a 71
650faab0 72 inline bool Read(void *To,unsigned long long Size,bool AllowEof)
f604cf55 73 {
650faab0 74 unsigned long long Jnk;
f604cf55
AL
75 if (AllowEof)
76 return Read(To,Size,&Jnk);
77 return Read(To,Size);
78 }
650faab0 79 bool Read(void *To,unsigned long long Size,unsigned long long *Actual = 0);
032bd56f 80 char* ReadLine(char *To, unsigned long long const Size);
650faab0 81 bool Write(const void *From,unsigned long long Size);
d68d65ad 82 bool static Write(int Fd, const void *From, unsigned long long Size);
650faab0
DK
83 bool Seek(unsigned long long To);
84 bool Skip(unsigned long long To);
85 bool Truncate(unsigned long long To);
86 unsigned long long Tell();
87 unsigned long long Size();
88 unsigned long long FileSize();
76a763e1 89 time_t ModificationTime();
650faab0
DK
90
91 /* You want to use 'unsigned long long' if you are talking about a file
92 to be able to support large files (>2 or >4 GB) properly.
93 This shouldn't happen all to often for the indexes, but deb's might be…
94 And as the auto-conversation converts a 'unsigned long *' to a 'bool'
95 instead of 'unsigned long long *' we need to provide this explicitely -
96 otherwise applications magically start to fail… */
97 __deprecated bool Read(void *To,unsigned long long Size,unsigned long *Actual)
98 {
99 unsigned long long R;
100 bool const T = Read(To, Size, &R);
101 *Actual = R;
102 return T;
103 }
104
52b47296
DK
105 bool Open(std::string FileName,unsigned int const Mode,CompressMode Compress,unsigned long const Perms = 0666);
106 bool Open(std::string FileName,unsigned int const Mode,APT::Configuration::Compressor const &compressor,unsigned long const Perms = 0666);
107 inline bool Open(std::string const &FileName,unsigned int const Mode, unsigned long const Perms = 0666) {
257e8d66
DK
108 return Open(FileName, Mode, None, Perms);
109 };
52b47296
DK
110 bool OpenDescriptor(int Fd, unsigned int const Mode, CompressMode Compress, bool AutoClose=false);
111 bool OpenDescriptor(int Fd, unsigned int const Mode, APT::Configuration::Compressor const &compressor, bool AutoClose=false);
112 inline bool OpenDescriptor(int Fd, unsigned int const Mode, bool AutoClose=false) {
bce778a3 113 return OpenDescriptor(Fd, Mode, None, AutoClose);
257e8d66 114 };
578bfd0a 115 bool Close();
b2e465d6
AL
116 bool Sync();
117
578bfd0a
AL
118 // Simple manipulators
119 inline int Fd() {return iFd;};
d0254ba7 120 inline void Fd(int fd) { OpenDescriptor(fd, ReadWrite);};
032bd56f 121 __deprecated gzFile gzFd();
699b209e 122
578bfd0a
AL
123 inline bool IsOpen() {return iFd >= 0;};
124 inline bool Failed() {return (Flags & Fail) == Fail;};
125 inline void EraseOnFailure() {Flags |= DelOnFail;};
126 inline void OpFail() {Flags |= Fail;};
ddc1d8d0 127 inline bool Eof() {return (Flags & HitEof) == HitEof;};
032bd56f 128 inline bool IsCompressed() {return (Flags & Compressed) == Compressed;};
8f3ba4e8 129 inline std::string &Name() {return FileName;};
c7b5ce1c 130
52b47296 131 FileFd(std::string FileName,unsigned int const Mode,unsigned long Perms = 0666) : iFd(-1), Flags(0), d(NULL)
13d87e2e 132 {
468720c5
DK
133 Open(FileName,Mode, None, Perms);
134 };
52b47296 135 FileFd(std::string FileName,unsigned int const Mode, CompressMode Compress, unsigned long Perms = 0666) : iFd(-1), Flags(0), d(NULL)
468720c5
DK
136 {
137 Open(FileName,Mode, Compress, Perms);
13d87e2e 138 };
032bd56f 139 FileFd() : iFd(-1), Flags(AutoClose), d(NULL) {};
52b47296 140 FileFd(int const Fd, unsigned int const Mode = ReadWrite, CompressMode Compress = None) : iFd(-1), Flags(0), d(NULL)
032bd56f
DK
141 {
142 OpenDescriptor(Fd, Mode, Compress);
143 };
144 FileFd(int const Fd, bool const AutoClose) : iFd(-1), Flags(0), d(NULL)
145 {
146 OpenDescriptor(Fd, ReadWrite, None, AutoClose);
147 };
8e06abb2 148 virtual ~FileFd();
468720c5
DK
149
150 private:
032bd56f 151 FileFdPrivate* d;
52b47296 152 bool OpenInternDescriptor(unsigned int const Mode, APT::Configuration::Compressor const &compressor);
ae635e3c
DK
153
154 // private helpers to set Fail flag and call _error->Error
155 bool FileFdErrno(const char* Function, const char* Description,...) __like_printf(3) __cold;
156 bool FileFdError(const char* Description,...) __like_printf(2) __cold;
578bfd0a
AL
157};
158
614adaa0 159bool RunScripts(const char *Cnf);
8b89e57f 160bool CopyFile(FileFd &From,FileFd &To);
8f3ba4e8
DK
161int GetLock(std::string File,bool Errors = true);
162bool FileExists(std::string File);
163bool RealFileExists(std::string File);
164bool DirectoryExists(std::string const &Path) __attrib_const;
165bool CreateDirectory(std::string const &Parent, std::string const &Path);
166time_t GetModificationTime(std::string const &Path);
b29c3712
DK
167
168/** \brief Ensure the existence of the given Path
169 *
170 * \param Parent directory of the Path directory - a trailing
171 * /apt/ will be removed before CreateDirectory call.
172 * \param Path which should exist after (successful) call
173 */
8f3ba4e8 174bool CreateAPTDirectoryIfNeeded(std::string const &Parent, std::string const &Path);
b29c3712 175
8f3ba4e8 176std::vector<std::string> GetListOfFilesInDir(std::string const &Dir, std::string const &Ext,
b3793d41 177 bool const &SortList, bool const &AllowNoExt=false);
8f3ba4e8 178std::vector<std::string> GetListOfFilesInDir(std::string const &Dir, std::vector<std::string> const &Ext,
b39c1859 179 bool const &SortList);
fbb2c7e0 180std::vector<std::string> GetListOfFilesInDir(std::string const &Dir, bool SortList);
8f3ba4e8 181std::string SafeGetCWD();
3b5421b4
AL
182void SetCloseExec(int Fd,bool Close);
183void SetNonBlock(int Fd,bool Block);
1084d58a 184bool WaitFd(int Fd,bool write = false,unsigned long timeout = 0);
75ef8f14 185pid_t ExecFork();
e45c4617 186pid_t ExecFork(std::set<int> keep_fds);
96ae6de5 187void MergeKeepFdsFromConfiguration(std::set<int> &keep_fds);
3826564e 188bool ExecWait(pid_t Pid,const char *Name,bool Reap = false);
578bfd0a 189
8ce4327b 190// File string manipulators
8f3ba4e8
DK
191std::string flNotDir(std::string File);
192std::string flNotFile(std::string File);
193std::string flNoLink(std::string File);
194std::string flExtension(std::string File);
195std::string flCombine(std::string Dir,std::string File);
8ce4327b 196
488011fa
MV
197// simple c++ glob
198std::vector<std::string> Glob(std::string const &pattern, int flags=0);
199
578bfd0a 200#endif