diff options
Diffstat (limited to 'security/l0pht-watch/files/patch-check_tmp.c')
-rw-r--r-- | security/l0pht-watch/files/patch-check_tmp.c | 74 |
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); */ + |