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