aboutsummaryrefslogtreecommitdiff
path: root/security/l0pht-watch/files/patch-check_tmp.c
diff options
context:
space:
mode:
Diffstat (limited to 'security/l0pht-watch/files/patch-check_tmp.c')
-rw-r--r--security/l0pht-watch/files/patch-check_tmp.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/security/l0pht-watch/files/patch-check_tmp.c b/security/l0pht-watch/files/patch-check_tmp.c
new file mode 100644
index 000000000000..eb73a0d7650b
--- /dev/null
+++ b/security/l0pht-watch/files/patch-check_tmp.c
@@ -0,0 +1,74 @@
+--- check_tmp.c.orig Fri Sep 24 15:33:35 1999
++++ check_tmp.c Tue Jul 18 16:18:59 2000
+@@ -37,7 +37,13 @@
+ char error_buffer[256];
+ #endif
+ #endif
+-
++
++#if (__FreeBSD_version >= 500011) || (__FreeBSD_version >= 410000 && __FreeBSD_version < 500000)
++ struct kevent ev;
++ int fd;
++ struct timespec ts = { 0, 0 };
++ int kq = -1;
++#endif
+
+ struct listStruct *list = NULL;
+
+@@ -178,6 +184,21 @@
+ exit(1);
+ }
+
++#if (__FreeBSD_version >= 500011) || (__FreeBSD_version >= 410000 && __FreeBSD_version < 500000)
++ /* Set up the KQ on the target directory */
++ fd = dirfd(dirp);
++
++ kq = kqueue();
++ if (kq < 0)
++ err(1, "kqueue");
++
++ ev.ident = fd;
++ ev.filter = EVFILT_VNODE;
++ ev.flags = EV_ADD | EV_ENABLE | EV_CLEAR;
++ ev.fflags = NOTE_WRITE;
++ kevent(kq, &ev, 1, NULL, 0, &ts);
++#endif
++
+ /* steup the first element of the list */
+ while ((dp = readdir(dirp)) != NULL){
+ if (!list) /* first time */
+@@ -266,6 +287,10 @@
+ rewinddir(dirp);
+
+ while (1){
++
++#if (__FreeBSD_version >= 500011) || (__FreeBSD_version >= 410000 && __FreeBSD_version < 500000)
++ if (ev.fflags & NOTE_WRITE) {
++#endif
+ while ((dp = readdir(dirp)) != NULL){
+ if (!(checknode(list, watchdir, dp->d_name))){
+ if (replacewatchflag){
+@@ -352,11 +377,22 @@
+ /* closedir(dirp); */
+ }
+ }
+-#ifdef 0
++#if 0
+ walklist(list);
+ #endif
+ list = prunelist(list);
+ rewinddir(dirp);
++
++#if (__FreeBSD_version >= 500011) || (__FreeBSD_version >= 410000 && __FreeBSD_version < 500000)
++ /* Reset event so we don't trigger on the rewinddir */
++ kevent(kq, &ev, 1, NULL, 0, &ts);
++
++ /* Block until the directory changes */
++ if (kevent(kq, NULL, 0, &ev, 1, NULL) < 0)
++ err(1, "kevent");
++
++ }
++#endif
+ }
+ /* closedir(dirp); */
+