-
Notifications
You must be signed in to change notification settings - Fork 5
/
Copy pathincrontab.h
233 lines (199 loc) · 4.94 KB
/
incrontab.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
/// inotify cron table manipulator classes header
/**
* \file incrontab.h
*
* inotify cron system
*
* Copyright (C) 2006, 2007, 2008 Lukas Jelinek, <[email protected]>
*
* This program is free software; you can use it, redistribute
* it and/or modify it under the terms of the GNU General Public
* License, version 2 (see LICENSE-GPL).
*
*/
#ifndef _INCRONTAB_H_
#define _INCRONTAB_H_
#include <string>
#include <deque>
#include "strtok.h"
/*
/// Incron user table base directory
#define INCRON_USER_TABLE_BASE "/var/spool/incron/"
/// Incron system table base directory
#define INCRON_SYS_TABLE_BASE "/etc/incron.d/"
*/
/// Incron table entry class.
class IncronTabEntry
{
public:
/// Constructor.
/**
* Creates an empty entry for later use with Parse().
*
* \sa Parse()
*/
IncronTabEntry();
/// Constructor.
/**
* Creates an entry based on defined parameters.
*
* \param[in] rPath watched filesystem path
* \param[in] uMask event mask
* \param[in] rCmd command string
*/
IncronTabEntry(const std::string& rPath, uint32_t uMask, const std::string& rCmd);
/// Destructor.
~IncronTabEntry() {}
/// Converts the entry to string representation.
/**
* This method creates a string for use in a table file.
*
* \return string representation
*/
std::string ToString() const;
/// Parses a string and attempts to extract entry parameters.
/**
* \param[in] rStr parsed string
* \param[out] rEntry parametrized entry
* \return true = success, false = failure
*/
static bool Parse(const std::string& rStr, IncronTabEntry& rEntry);
/// Returns the watch filesystem path.
/**
* \return watch path
*/
inline const std::string& GetPath() const
{
return m_path;
}
/// Returns the event mask.
/**
* \return event mask
*/
inline int32_t GetMask() const
{
return m_uMask;
}
/// Returns the command string.
/**
* \return command string
*/
inline const std::string& GetCmd() const
{
return m_cmd;
}
/// Checks whether this entry has set loop-avoidance.
/**
* \return true = no loop, false = loop allowed
*/
inline bool IsNoLoop() const
{
return m_fNoLoop;
}
/// Add backslashes before spaces in the source path.
/**
* It also adds backslashes before all original backslashes
* of course.
*
* The source string is not modified and a copy is returned
* instead.
*
* This method is intended to be used for paths in user tables.
*
* \param[in] rPath path to be modified
* \return modified path
*/
static std::string GetSafePath(const std::string& rPath);
protected:
std::string m_path; ///< watch path
uint32_t m_uMask; ///< event mask
std::string m_cmd; ///< command string
bool m_fNoLoop; ///< no loop yes/no
};
/// Incron table class.
class IncronTab
{
public:
/// Constructor.
IncronTab() {}
/// Destructor.
~IncronTab() {}
/// Add an entry to the table.
/**
* \param[in] rEntry table entry
*/
inline void Add(const IncronTabEntry& rEntry)
{
m_tab.push_back(rEntry);
}
/// Removes all entries.
inline void Clear()
{
m_tab.clear();
}
/// Checks whether the table is empty.
/**
* \return true = empty, false = otherwise
*/
inline bool IsEmpty() const
{
return m_tab.empty();
}
/// Returns the count of entries.
/**
* \return count of entries
*/
inline int GetCount() const
{
return (int) m_tab.size();
}
/// Returns an entry.
/**
* \return reference to the entry for the given index
*
* \attention This method doesn't test index bounds. If you
* pass an invalid value the program may crash
* and/or behave unpredictible way!
*/
inline IncronTabEntry& GetEntry(int index)
{
return m_tab[index];
}
/// Loads the table.
/**
* \param[in] rPath path to a source table file
* \return true = success, false = failure
*/
bool Load(const std::string& rPath);
/// Saves the table.
/**
* \param[in] rPath path to a destination table file
* \return true = success, false = failure
*/
bool Save(const std::string& rPath);
/// Checks whether an user has permission to use incron.
/**
* \param[in] rUser user name
* \return true = permission OK, false = otherwise
*/
static bool CheckUser(const std::string& rUser);
/// Composes a path to an user incron table file.
/**
* \param[in] rUser user name
* \return path to the table file
*
* \attention No tests (existence, permission etc.) are done.
*/
static std::string GetUserTablePath(const std::string& rUser);
/// Composes a path to a system incron table file.
/**
* \param[in] rName table name (pseudouser)
* \return path to the table file
*
* \attention No tests (existence, permission etc.) are done.
*/
static std::string GetSystemTablePath(const std::string& rName);
protected:
std::deque<IncronTabEntry> m_tab; ///< incron table
};
#endif //_INCRONTAB_H_