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