00001
00003
00016 #ifndef _USERTABLE_H_
00017 #define _USERTABLE_H_
00018
00019 #include <map>
00020 #include <deque>
00021 #include <sys/poll.h>
00022
00023 #include "inotify-cxx.h"
00024 #include "incrontab.h"
00025
00026
00027 class UserTable;
00028
00030 typedef std::map<std::string, UserTable*> SUT_MAP;
00031
00033 typedef void (*proc_done_cb)(InotifyWatch*);
00034
00036 typedef struct
00037 {
00038 proc_done_cb onDone;
00039 InotifyWatch* pWatch;
00040 } ProcData_t;
00041
00043 typedef std::map<int, UserTable*> FDUT_MAP;
00044
00046 typedef std::map<InotifyWatch*, IncronTabEntry*> IWCE_MAP;
00047
00049 typedef std::map<pid_t, ProcData_t> PROC_MAP;
00050
00052
00055 class EventDispatcher
00056 {
00057 public:
00059
00065 EventDispatcher(int iPipeFd, Inotify* pIn, InotifyWatch* pSys, InotifyWatch* pUser);
00066
00068 ~EventDispatcher();
00069
00071
00074 bool ProcessEvents();
00075
00077
00080 void Register(UserTable* pTab);
00081
00083
00086 void Unregister(UserTable* pTab);
00087
00089
00092 inline size_t GetSize() const
00093 {
00094 return m_size;
00095 }
00096
00098
00101 inline struct pollfd* GetPollData()
00102 {
00103 return m_pPoll;
00104 }
00105
00107 void Rebuild();
00108
00110
00113 inline void Clear()
00114 {
00115 m_maps.clear();
00116 }
00117
00118 private:
00119 int m_iPipeFd;
00120 int m_iMgmtFd;
00121 Inotify* m_pIn;
00122 InotifyWatch* m_pSys;
00123 InotifyWatch* m_pUser;
00124 FDUT_MAP m_maps;
00125 size_t m_size;
00126 struct pollfd* m_pPoll;
00127
00129 void ProcessMgmtEvents();
00130 };
00131
00132
00134
00139 class UserTable
00140 {
00141 public:
00143
00148 UserTable(EventDispatcher* pEd, const std::string& rUser, bool fSysTable);
00149
00151 virtual ~UserTable();
00152
00154
00159 void Load();
00160
00162
00166 void Dispose();
00167
00169
00172 void OnEvent(InotifyEvent& rEvt);
00173
00175
00179 static void FinishDone();
00180
00182
00189 bool MayAccess(const std::string& rPath, bool fNoFollow) const;
00190
00192
00195 bool IsSystem() const;
00196
00198
00201 Inotify* GetInotify()
00202 {
00203 return &m_in;
00204 }
00205
00207
00217 inline static bool CheckUser(const char* user)
00218 {
00219 struct passwd* pw = getpwnam(user);
00220 if (pw == NULL)
00221 return false;
00222
00223 return IncronTab::CheckUser(user);
00224 }
00225
00227
00230 void RunAsUser(char* const* argv) const;
00231
00232 private:
00233 Inotify m_in;
00234 EventDispatcher* m_pEd;
00235 std::string m_user;
00236 bool m_fSysTable;
00237 IncronTab m_tab;
00238 IWCE_MAP m_map;
00239
00240 static PROC_MAP s_procMap;
00241
00243
00247 IncronTabEntry* FindEntry(InotifyWatch* pWatch);
00248
00250
00256 bool PrepareArgs(const std::string& rCmd, int& argc, char**& argv);
00257
00259
00263 void CleanupArgs(int argc, char** argv);
00264
00265 };
00266
00267 #endif //_USERTABLE_H_