git: b8b4094a465f - main - security/zeek: Patch to provide tail -F semantics for input framework MODE_STREAM
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Fri, 01 Jul 2022 21:20:04 UTC
The branch main has been updated by leres:
URL: https://cgit.FreeBSD.org/ports/commit/?id=b8b4094a465f9fcc646b4d1f01871f8f220cfc92
commit b8b4094a465f9fcc646b4d1f01871f8f220cfc92
Author: Craig Leres <leres@FreeBSD.org>
AuthorDate: 2022-07-01 21:19:09 +0000
Commit: Craig Leres <leres@FreeBSD.org>
CommitDate: 2022-07-01 21:19:09 +0000
security/zeek: Patch to provide tail -F semantics for input framework MODE_STREAM
This is a backport of this github pull request:
https://github.com/zeek/zeek/pull/2097
---
security/zeek/Makefile | 1 +
.../zeek/files/patch-src_input_readers_raw_Raw.cc | 117 +++++++++++++++++++++
.../zeek/files/patch-src_input_readers_raw_Raw.h | 10 ++
3 files changed, 128 insertions(+)
diff --git a/security/zeek/Makefile b/security/zeek/Makefile
index b7291f9d8155..8c32993625ae 100644
--- a/security/zeek/Makefile
+++ b/security/zeek/Makefile
@@ -2,6 +2,7 @@
PORTNAME= zeek
PORTVERSION= 4.0.7
+PORTREVISION= 1
CATEGORIES= security
MASTER_SITES= https://download.zeek.org/
DISTFILES= ${DISTNAME}${EXTRACT_SUFX}
diff --git a/security/zeek/files/patch-src_input_readers_raw_Raw.cc b/security/zeek/files/patch-src_input_readers_raw_Raw.cc
new file mode 100644
index 000000000000..ac3198ce5f04
--- /dev/null
+++ b/security/zeek/files/patch-src_input_readers_raw_Raw.cc
@@ -0,0 +1,117 @@
+--- src/input/readers/raw/Raw.cc.orig 2022-07-01 19:51:26 UTC
++++ src/input/readers/raw/Raw.cc
+@@ -34,6 +34,7 @@ Raw::Raw(ReaderFrontend *frontend) : ReaderBackend(fro
+ firstrun = true;
+ mtime = 0;
+ ino = 0;
++ dev = 0;
+ forcekill = false;
+ offset = 0;
+ separator.assign( (const char*) BifConst::InputRaw::record_separator->Bytes(),
+@@ -278,12 +279,32 @@ bool Raw::OpenInput()
+ else
+ {
+ file = std::unique_ptr<FILE, int(*)(FILE*)>(fopen(fname.c_str(), "r"), fclose);
++ if ( ! file && Info().mode == MODE_STREAM )
++ {
++ // Watch /dev/null until the file appears
++ file = std::unique_ptr<FILE, int (*)(FILE*)>(fopen("/dev/null", "r"), fclose);
++ }
++
+ if ( ! file )
+ {
+ Error(Fmt("Init: cannot open %s", fname.c_str()));
+ return false;
+ }
+
++ if ( Info().mode == MODE_STREAM )
++ {
++ struct stat sb;
++ if ( fstat(fileno(file.get()), &sb) == -1 )
++ {
++ // This is unlikely to fail
++ Error(Fmt("Could not get fstat for %s", fname.c_str()));
++ return false;
++ }
++ ino = sb.st_ino;
++ dev = sb.st_dev;
++ }
++
++
+ if ( ! SetFDFlags(fileno(file.get()), F_SETFD, FD_CLOEXEC) )
+ Warning(Fmt("Init: cannot set close-on-exec for %s", fname.c_str()));
+ }
+@@ -345,6 +366,7 @@ bool Raw::DoInit(const ReaderInfo& info, int num_field
+ fname = info.source;
+ mtime = 0;
+ ino = 0;
++ dev = 0;
+ execute = false;
+ firstrun = true;
+ int want_fields = 1;
+@@ -565,24 +587,58 @@ bool Raw::DoUpdate()
+
+ mtime = sb.st_mtime;
+ ino = sb.st_ino;
++ dev = sb.st_dev;
+ // file changed. reread.
+ //
+ // fallthrough
+ }
+
+ case MODE_MANUAL:
+- case MODE_STREAM:
+- if ( Info().mode == MODE_STREAM && file )
+- {
+- clearerr(file.get()); // remove end of file evil bits
+- break;
+- }
+-
+ CloseInput();
+ if ( ! OpenInput() )
+ return false;
+
+ break;
++
++ case MODE_STREAM:
++ // Clear possible EOF condition
++ if ( file )
++ clearerr(file.get());
++
++ // Done if reading from a pipe
++ if ( execute )
++ break;
++
++ // Check if the file has changed
++ struct stat sb;
++ if ( stat(fname.c_str(), &sb) == -1 )
++ // File was removed
++ break;
++
++ // Is it the same file?
++ if ( sb.st_ino == ino && sb.st_dev == dev )
++ break;
++
++ // File was replaced
++ FILE* tfile;
++ tfile = fopen(fname.c_str(), "r");
++ if ( ! tfile )
++ break;
++
++ // Stat newly opened file
++ if ( fstat(fileno(tfile), &sb) == -1 )
++ {
++ // This is unlikely to fail
++ Error(Fmt("Could not fstat %s", fname.c_str()));
++ return false;
++ }
++ file.reset(nullptr);
++ file = std::unique_ptr<FILE, int (*)(FILE*)>(tfile, fclose);
++ ino = sb.st_ino;
++ dev = sb.st_dev;
++ offset = 0;
++ bufpos = 0;
++ break;
+
+ default:
+ assert(false);
diff --git a/security/zeek/files/patch-src_input_readers_raw_Raw.h b/security/zeek/files/patch-src_input_readers_raw_Raw.h
new file mode 100644
index 000000000000..2dacf9bb7baa
--- /dev/null
+++ b/security/zeek/files/patch-src_input_readers_raw_Raw.h
@@ -0,0 +1,10 @@
+--- src/input/readers/raw/Raw.h.orig 2022-07-01 20:33:23 UTC
++++ src/input/readers/raw/Raw.h
+@@ -52,6 +52,7 @@ class Raw : public ReaderBackend { (private)
+ bool firstrun;
+ time_t mtime;
+ ino_t ino;
++ dev_t dev;
+
+ // options set from the script-level.
+ std::string separator;