]> git.saurik.com Git - apt.git/blame - apt-pkg/contrib/fileutl.h
reset HOME, USER(NAME), TMPDIR & SHELL in DropPrivileges
[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 43{
fa89055f
DK
44 friend class FileFdPrivate;
45 friend class GzipFileFdPrivate;
46 friend class Bz2FileFdPrivate;
47 friend class LzmaFileFdPrivate;
e3fbd54c 48 friend class Lz4FileFdPrivate;
fa89055f
DK
49 friend class DirectFileFdPrivate;
50 friend class PipedFileFdPrivate;
578bfd0a
AL
51 protected:
52 int iFd;
53
ddc1d8d0 54 enum LocalFlags {AutoClose = (1<<0),Fail = (1<<1),DelOnFail = (1<<2),
032bd56f 55 HitEof = (1<<3), Replace = (1<<4), Compressed = (1<<5) };
578bfd0a 56 unsigned long Flags;
8f3ba4e8
DK
57 std::string FileName;
58 std::string TemporaryFileName;
3184b4cf 59
578bfd0a 60 public:
257e8d66
DK
61 enum OpenMode {
62 ReadOnly = (1 << 0),
63 WriteOnly = (1 << 1),
64 ReadWrite = ReadOnly | WriteOnly,
65
66 Create = (1 << 2),
67 Exclusive = (1 << 3),
68 Atomic = Exclusive | (1 << 4),
69 Empty = (1 << 5),
88749b5d 70 BufferedWrite = (1 << 6),
257e8d66
DK
71
72 WriteEmpty = ReadWrite | Create | Empty,
73 WriteExists = ReadWrite,
74 WriteAny = ReadWrite | Create,
75 WriteTemp = ReadWrite | Create | Exclusive,
76 ReadOnlyGzip,
77 WriteAtomic = ReadWrite | Create | Atomic
78 };
e3fbd54c 79 enum CompressMode { Auto = 'A', None = 'N', Extension = 'E', Gzip = 'G', Bzip2 = 'B', Lzma = 'L', Xz = 'X', Lz4='4' };
578bfd0a 80
650faab0 81 inline bool Read(void *To,unsigned long long Size,bool AllowEof)
f604cf55 82 {
650faab0 83 unsigned long long Jnk;
f604cf55
AL
84 if (AllowEof)
85 return Read(To,Size,&Jnk);
86 return Read(To,Size);
87 }
650faab0 88 bool Read(void *To,unsigned long long Size,unsigned long long *Actual = 0);
61db4824 89 bool static Read(int const Fd, void *To, unsigned long long Size, unsigned long long * const Actual = 0);
032bd56f 90 char* ReadLine(char *To, unsigned long long const Size);
766761fd 91 bool Flush();
650faab0 92 bool Write(const void *From,unsigned long long Size);
d68d65ad 93 bool static Write(int Fd, const void *From, unsigned long long Size);
650faab0
DK
94 bool Seek(unsigned long long To);
95 bool Skip(unsigned long long To);
96 bool Truncate(unsigned long long To);
97 unsigned long long Tell();
ca7fd76c 98 // the size of the file content (compressed files will be uncompressed first)
650faab0 99 unsigned long long Size();
ca7fd76c 100 // the size of the file itself
650faab0 101 unsigned long long FileSize();
76a763e1 102 time_t ModificationTime();
650faab0
DK
103
104 /* You want to use 'unsigned long long' if you are talking about a file
105 to be able to support large files (>2 or >4 GB) properly.
106 This shouldn't happen all to often for the indexes, but deb's might be…
107 And as the auto-conversation converts a 'unsigned long *' to a 'bool'
d04e44ac 108 instead of 'unsigned long long *' we need to provide this explicitly -
650faab0 109 otherwise applications magically start to fail… */
5dd00edb 110 bool Read(void *To,unsigned long long Size,unsigned long *Actual) APT_DEPRECATED_MSG("The Actual variable you pass in should be an unsigned long long")
650faab0
DK
111 {
112 unsigned long long R;
113 bool const T = Read(To, Size, &R);
114 *Actual = R;
115 return T;
116 }
117
e5f3f8c1
MV
118 bool Open(std::string FileName,unsigned int const Mode,CompressMode Compress,unsigned long const AccessMode = 0666);
119 bool Open(std::string FileName,unsigned int const Mode,APT::Configuration::Compressor const &compressor,unsigned long const AccessMode = 0666);
120 inline bool Open(std::string const &FileName,unsigned int const Mode, unsigned long const AccessMode = 0666) {
121 return Open(FileName, Mode, None, AccessMode);
257e8d66 122 };
52b47296
DK
123 bool OpenDescriptor(int Fd, unsigned int const Mode, CompressMode Compress, bool AutoClose=false);
124 bool OpenDescriptor(int Fd, unsigned int const Mode, APT::Configuration::Compressor const &compressor, bool AutoClose=false);
125 inline bool OpenDescriptor(int Fd, unsigned int const Mode, bool AutoClose=false) {
bce778a3 126 return OpenDescriptor(Fd, Mode, None, AutoClose);
257e8d66 127 };
578bfd0a 128 bool Close();
b2e465d6
AL
129 bool Sync();
130
578bfd0a
AL
131 // Simple manipulators
132 inline int Fd() {return iFd;};
d0254ba7 133 inline void Fd(int fd) { OpenDescriptor(fd, ReadWrite);};
5dd00edb 134 gzFile gzFd() APT_DEPRECATED_MSG("Implementation detail, do not use to be able to support bzip2, xz and co") APT_PURE;
699b209e 135
578bfd0a
AL
136 inline bool IsOpen() {return iFd >= 0;};
137 inline bool Failed() {return (Flags & Fail) == Fail;};
138 inline void EraseOnFailure() {Flags |= DelOnFail;};
139 inline void OpFail() {Flags |= Fail;};
ddc1d8d0 140 inline bool Eof() {return (Flags & HitEof) == HitEof;};
032bd56f 141 inline bool IsCompressed() {return (Flags & Compressed) == Compressed;};
8f3ba4e8 142 inline std::string &Name() {return FileName;};
6c55f07a
DK
143
144 FileFd(std::string FileName,unsigned int const Mode,unsigned long AccessMode = 0666);
145 FileFd(std::string FileName,unsigned int const Mode, CompressMode Compress, unsigned long AccessMode = 0666);
146 FileFd();
147 FileFd(int const Fd, unsigned int const Mode = ReadWrite, CompressMode Compress = None);
148 FileFd(int const Fd, bool const AutoClose);
8e06abb2 149 virtual ~FileFd();
468720c5
DK
150
151 private:
6c55f07a
DK
152 FileFdPrivate * d;
153 APT_HIDDEN FileFd & operator=(const FileFd &);
ce62f1de 154 APT_HIDDEN bool OpenInternDescriptor(unsigned int const Mode, APT::Configuration::Compressor const &compressor);
ae635e3c
DK
155
156 // private helpers to set Fail flag and call _error->Error
ce62f1de
DK
157 APT_HIDDEN bool FileFdErrno(const char* Function, const char* Description,...) APT_PRINTF(3) APT_COLD;
158 APT_HIDDEN bool FileFdError(const char* Description,...) APT_PRINTF(2) APT_COLD;
578bfd0a
AL
159};
160
614adaa0 161bool RunScripts(const char *Cnf);
8b89e57f 162bool CopyFile(FileFd &From,FileFd &To);
ce1f3a2c 163bool RemoveFile(char const * const Function, std::string const &FileName);
8f3ba4e8
DK
164int GetLock(std::string File,bool Errors = true);
165bool FileExists(std::string File);
166bool RealFileExists(std::string File);
9445fa62 167bool DirectoryExists(std::string const &Path);
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();
dd6da7d2 173std::string GetTempDir(std::string const &User);
c9443c01
DK
174FileFd* GetTempFile(std::string const &Prefix = "",
175 bool ImmediateUnlink = true,
176 FileFd * const TmpFd = NULL);
68e01721 177
b29c3712
DK
178/** \brief Ensure the existence of the given Path
179 *
180 * \param Parent directory of the Path directory - a trailing
181 * /apt/ will be removed before CreateDirectory call.
182 * \param Path which should exist after (successful) call
183 */
8f3ba4e8 184bool CreateAPTDirectoryIfNeeded(std::string const &Parent, std::string const &Path);
b29c3712 185
8f3ba4e8 186std::vector<std::string> GetListOfFilesInDir(std::string const &Dir, std::string const &Ext,
b3793d41 187 bool const &SortList, bool const &AllowNoExt=false);
8f3ba4e8 188std::vector<std::string> GetListOfFilesInDir(std::string const &Dir, std::vector<std::string> const &Ext,
b39c1859 189 bool const &SortList);
fbb2c7e0 190std::vector<std::string> GetListOfFilesInDir(std::string const &Dir, bool SortList);
8f3ba4e8 191std::string SafeGetCWD();
3b5421b4
AL
192void SetCloseExec(int Fd,bool Close);
193void SetNonBlock(int Fd,bool Block);
1084d58a 194bool WaitFd(int Fd,bool write = false,unsigned long timeout = 0);
75ef8f14 195pid_t ExecFork();
e45c4617 196pid_t ExecFork(std::set<int> keep_fds);
96ae6de5 197void MergeKeepFdsFromConfiguration(std::set<int> &keep_fds);
3826564e 198bool ExecWait(pid_t Pid,const char *Name,bool Reap = false);
578bfd0a 199
479a2beb 200// check if the given file starts with a PGP cleartext signature
fe5804fc 201bool StartsWithGPGClearTextSignature(std::string const &FileName);
0854ad8b 202
d84da499
DK
203/** change file attributes to requested known good values
204 *
205 * The method skips the user:group setting if not root.
206 *
207 * @param requester is printed as functionname in error cases
208 * @param file is the file to be modified
209 * @param user is the (new) owner of the file, e.g. _apt
210 * @param group is the (new) group owning the file, e.g. root
211 * @param mode is the access mode of the file, e.g. 0644
212 */
213bool ChangeOwnerAndPermissionOfFile(char const * const requester, char const * const file, char const * const user, char const * const group, mode_t const mode);
214
13a28d85
JAK
215/**
216 * \brief Drop privileges
217 *
218 * Drop the privileges to the user _apt (or the one specified in
219 * APT::Sandbox::User). This does not set the supplementary group
220 * ids up correctly, it only uses the default group. Also prevent
221 * the process from gaining any new privileges afterwards, at least
222 * on Linux.
223 *
224 * \return true on success, false on failure with _error set
225 */
373fa2b4 226bool DropPrivileges();
fc1a78d8 227
8ce4327b 228// File string manipulators
8f3ba4e8
DK
229std::string flNotDir(std::string File);
230std::string flNotFile(std::string File);
231std::string flNoLink(std::string File);
232std::string flExtension(std::string File);
233std::string flCombine(std::string Dir,std::string File);
8ce4327b 234
53ac87ac
MV
235/** \brief Takes a file path and returns the absolute path
236 */
237std::string flAbsPath(std::string File);
bbd8308c
DK
238/** \brief removes superfluous /./ and // from path */
239APT_HIDDEN std::string flNormalize(std::string file);
53ac87ac 240
8d01b9d6
MV
241// simple c++ glob
242std::vector<std::string> Glob(std::string const &pattern, int flags=0);
0854ad8b 243
7ad2a347
MV
244/** \brief Popen() implementation that execv() instead of using a shell
245 *
246 * \param Args the execv style command to run
247 * \param FileFd is a referenz to the FileFd to use for input or output
248 * \param Child a reference to the integer that stores the child pid
249 * Note that you must call ExecWait() or similar to cleanup
250 * \param Mode is either FileFd::ReadOnly or FileFd::WriteOnly
0ecceb5b
JAK
251 * \param CaptureStderr True if we should capture stderr in addition to stdout.
252 * (default: True).
7ad2a347
MV
253 * \return true on success, false on failure with _error set
254 */
0ecceb5b 255bool Popen(const char* Args[], FileFd &Fd, pid_t &Child, FileFd::OpenMode Mode, bool CaptureStderr);
7ad2a347
MV
256bool Popen(const char* Args[], FileFd &Fd, pid_t &Child, FileFd::OpenMode Mode);
257
258
578bfd0a 259#endif