summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/uinfo.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/uinfo.cc')
-rw-r--r--winsup/cygwin/uinfo.cc85
1 files changed, 85 insertions, 0 deletions
diff --git a/winsup/cygwin/uinfo.cc b/winsup/cygwin/uinfo.cc
index a2a46a03f..5eb76b100 100644
--- a/winsup/cygwin/uinfo.cc
+++ b/winsup/cygwin/uinfo.cc
@@ -389,3 +389,88 @@ cygheap_user::env_name (const char *name, size_t namelen)
(void) domain ();
return pwinname;
}
+
+int NO_COPY etc::curr_ix = -1;
+bool NO_COPY etc::sawchange[MAX_ETC_FILES];
+const NO_COPY char *etc::fn[MAX_ETC_FILES];
+FILETIME NO_COPY etc::last_modified[MAX_ETC_FILES];
+
+int
+etc::init (int n, const char *etc_fn)
+{
+ if (n >= 0)
+ /* ok */;
+ else if (++curr_ix < MAX_ETC_FILES)
+ n = curr_ix;
+ else
+ api_fatal ("internal error");
+
+ fn[n] = etc_fn;
+ sawchange[n] = false;
+ paranoid_printf ("curr_ix %d, n %d", curr_ix, n);
+ return curr_ix;
+}
+
+bool
+etc::dir_changed (int n)
+{
+ bool res = sawchange[n];
+
+ if (!res)
+ {
+ static HANDLE NO_COPY changed_h;
+ if (!changed_h)
+ {
+ path_conv pwd ("/etc");
+ changed_h = FindFirstChangeNotification (pwd, FALSE,
+ FILE_NOTIFY_CHANGE_LAST_WRITE);
+ if (changed_h == INVALID_HANDLE_VALUE)
+ system_printf ("Can't open /etc for checking, %E", (char *) pwd,
+ changed_h);
+ }
+
+ if (changed_h == INVALID_HANDLE_VALUE)
+ res = true;
+ else if (WaitForSingleObject (changed_h, 0) == WAIT_OBJECT_0)
+ {
+ (void) FindNextChangeNotification (changed_h);
+ memset (sawchange, true, sizeof sawchange);
+ res = true;
+ }
+ }
+
+ paranoid_printf ("%s res %d", fn[n], res);
+ return res;
+}
+
+bool
+etc::file_changed (int n)
+{
+ bool res = false;
+ if (!fn[n])
+ res = true;
+ else if (dir_changed (n))
+ {
+ HANDLE h;
+ WIN32_FIND_DATA data;
+
+ if ((h = FindFirstFile (fn[n], &data)) == INVALID_HANDLE_VALUE)
+ res = true;
+ else
+ {
+ FindClose (h);
+ if (CompareFileTime (&data.ftLastWriteTime, last_modified + n) > 0)
+ res = true;
+ }
+ }
+ sawchange[n] = false;
+ paranoid_printf ("%s res %d", fn[n], res);
+ return res;
+}
+
+void
+etc::set_last_modified (int n, FILETIME& ft)
+{
+ last_modified[n] = ft;
+ sawchange[n] = false;
+}