mirror of
https://github.com/zeek/zeek.git
synced 2025-10-02 22:58:20 +00:00
Move ScannedFile class and associated globals into ScannedFile.h and out of Net.h and scan.l
This commit is contained in:
parent
01ce18894b
commit
d608e7c9a5
7 changed files with 120 additions and 91 deletions
|
@ -255,6 +255,7 @@ set(MAIN_SRCS
|
||||||
NFA.cc
|
NFA.cc
|
||||||
Net.cc
|
Net.cc
|
||||||
NetVar.cc
|
NetVar.cc
|
||||||
|
Notifier.cc
|
||||||
Obj.cc
|
Obj.cc
|
||||||
OpaqueVal.cc
|
OpaqueVal.cc
|
||||||
Options.cc
|
Options.cc
|
||||||
|
@ -270,12 +271,12 @@ set(MAIN_SRCS
|
||||||
RuleAction.cc
|
RuleAction.cc
|
||||||
RuleCondition.cc
|
RuleCondition.cc
|
||||||
RuleMatcher.cc
|
RuleMatcher.cc
|
||||||
SmithWaterman.cc
|
ScannedFile.cc
|
||||||
Scope.cc
|
Scope.cc
|
||||||
ScriptCoverageManager.cc
|
ScriptCoverageManager.cc
|
||||||
SerializationFormat.cc
|
SerializationFormat.cc
|
||||||
Sessions.cc
|
Sessions.cc
|
||||||
Notifier.cc
|
SmithWaterman.cc
|
||||||
Stats.cc
|
Stats.cc
|
||||||
Stmt.cc
|
Stmt.cc
|
||||||
Tag.cc
|
Tag.cc
|
||||||
|
|
|
@ -397,9 +397,6 @@ void net_delete()
|
||||||
delete zeek::detail::ip_anonymizer[i];
|
delete zeek::detail::ip_anonymizer[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
std::list<ScannedFile> files_scanned;
|
|
||||||
std::vector<std::string> sig_files;
|
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
bool reading_live = false;
|
bool reading_live = false;
|
||||||
|
@ -461,6 +458,3 @@ bool& is_parsing = zeek::net::is_parsing;
|
||||||
const zeek::Packet*& current_pkt = zeek::net::current_pkt;
|
const zeek::Packet*& current_pkt = zeek::net::current_pkt;
|
||||||
int& current_dispatched = zeek::net::current_dispatched;
|
int& current_dispatched = zeek::net::current_dispatched;
|
||||||
double& current_timestamp = zeek::net::current_timestamp;
|
double& current_timestamp = zeek::net::current_timestamp;
|
||||||
|
|
||||||
std::list<zeek::net::detail::ScannedFile>& files_scanned = zeek::net::detail::files_scanned;
|
|
||||||
std::vector<std::string>& sig_files = zeek::net::detail::sig_files;
|
|
||||||
|
|
30
src/Net.h
30
src/Net.h
|
@ -11,6 +11,8 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <optional>
|
#include <optional>
|
||||||
|
|
||||||
|
#include "ScannedFile.h"
|
||||||
|
|
||||||
ZEEK_FORWARD_DECLARE_NAMESPACED(IOSource, zeek, iosource);
|
ZEEK_FORWARD_DECLARE_NAMESPACED(IOSource, zeek, iosource);
|
||||||
ZEEK_FORWARD_DECLARE_NAMESPACED(PktSrc, zeek, iosource);
|
ZEEK_FORWARD_DECLARE_NAMESPACED(PktSrc, zeek, iosource);
|
||||||
ZEEK_FORWARD_DECLARE_NAMESPACED(PktDumper, zeek, iosource);
|
ZEEK_FORWARD_DECLARE_NAMESPACED(PktDumper, zeek, iosource);
|
||||||
|
@ -44,30 +46,6 @@ extern zeek::iosource::PktDumper* pkt_dumper; // where to save packets
|
||||||
// on future timers).
|
// on future timers).
|
||||||
extern bool have_pending_timers;
|
extern bool have_pending_timers;
|
||||||
|
|
||||||
|
|
||||||
// Script file we have already scanned (or are in the process of scanning).
|
|
||||||
// They are identified by normalized realpath.
|
|
||||||
struct ScannedFile {
|
|
||||||
int include_level;
|
|
||||||
bool skipped; // This ScannedFile was @unload'd.
|
|
||||||
bool prefixes_checked; // If loading prefixes for this file has been tried.
|
|
||||||
std::string name;
|
|
||||||
std::string canonical_path; // normalized, absolute path via realpath()
|
|
||||||
|
|
||||||
ScannedFile(int arg_include_level,
|
|
||||||
std::string arg_name, bool arg_skipped = false,
|
|
||||||
bool arg_prefixes_checked = false);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compares the canonical path of this file against every canonical path
|
|
||||||
* in files_scanned and returns whether there's any match.
|
|
||||||
*/
|
|
||||||
bool AlreadyScanned() const;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern std::list<ScannedFile> files_scanned;
|
|
||||||
extern std::vector<std::string> sig_files;
|
|
||||||
|
|
||||||
} // namespace detail
|
} // namespace detail
|
||||||
|
|
||||||
// Functions to temporarily suspend processing of live input (network packets
|
// Functions to temporarily suspend processing of live input (network packets
|
||||||
|
@ -144,7 +122,3 @@ extern bool& is_parsing [[deprecated("Remove in v4.1. Use zeek::net::is_parsing.
|
||||||
extern const zeek::Packet*& current_pkt [[deprecated("Remove in v4.1. Use zeek::net::current_pkt.")]];
|
extern const zeek::Packet*& current_pkt [[deprecated("Remove in v4.1. Use zeek::net::current_pkt.")]];
|
||||||
extern int& current_dispatched [[deprecated("Remove in v4.1. Use zeek::net::current_dispatched.")]];
|
extern int& current_dispatched [[deprecated("Remove in v4.1. Use zeek::net::current_dispatched.")]];
|
||||||
extern double& current_timestamp [[deprecated("Remove in v4.1. Use zeek::net::current_timestamp.")]];
|
extern double& current_timestamp [[deprecated("Remove in v4.1. Use zeek::net::current_timestamp.")]];
|
||||||
|
|
||||||
using ScannedFile [[deprecated("Remove in v4.1. Use zeek::net::detail::ScannedFile.")]] = zeek::net::detail::ScannedFile;
|
|
||||||
extern std::list<zeek::net::detail::ScannedFile>& files_scanned [[deprecated("Remove in v4.1. Use zeek::net::detail::files_scanned.")]];
|
|
||||||
extern std::vector<std::string>& sig_files [[deprecated("Remove in v4.1. Use zeek::net::detail::sig_files.")]];
|
|
||||||
|
|
56
src/ScannedFile.cc
Normal file
56
src/ScannedFile.cc
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
#include "ScannedFile.h"
|
||||||
|
|
||||||
|
#include <sys/errno.h>
|
||||||
|
#include <limits.h> // for PATH_MAX
|
||||||
|
|
||||||
|
#include "DebugLogger.h"
|
||||||
|
#include "Reporter.h"
|
||||||
|
|
||||||
|
namespace zeek::detail {
|
||||||
|
|
||||||
|
std::list<ScannedFile> files_scanned;
|
||||||
|
std::vector<std::string> sig_files;
|
||||||
|
|
||||||
|
ScannedFile::ScannedFile(int arg_include_level,
|
||||||
|
std::string arg_name,
|
||||||
|
bool arg_skipped,
|
||||||
|
bool arg_prefixes_checked)
|
||||||
|
: include_level(arg_include_level),
|
||||||
|
skipped(arg_skipped),
|
||||||
|
prefixes_checked(arg_prefixes_checked),
|
||||||
|
name(std::move(arg_name))
|
||||||
|
{
|
||||||
|
if ( name == canonical_stdin_path )
|
||||||
|
canonical_path = canonical_stdin_path;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
char buf[PATH_MAX];
|
||||||
|
auto res = realpath(name.data(), buf);
|
||||||
|
|
||||||
|
if ( ! res )
|
||||||
|
zeek::reporter->FatalError("failed to get realpath() of %s: %s",
|
||||||
|
name.data(), strerror(errno));
|
||||||
|
|
||||||
|
canonical_path = res;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ScannedFile::AlreadyScanned() const
|
||||||
|
{
|
||||||
|
auto rval = false;
|
||||||
|
|
||||||
|
for ( const auto& it : files_scanned )
|
||||||
|
if ( it.canonical_path == canonical_path )
|
||||||
|
{
|
||||||
|
rval = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
DBG_LOG(zeek::DBG_SCRIPTS, "AlreadyScanned result (%d) %s", rval, canonical_path.data());
|
||||||
|
return rval;
|
||||||
|
}
|
||||||
|
|
||||||
|
} // namespace zeek::detail
|
||||||
|
|
||||||
|
std::list<zeek::detail::ScannedFile>& files_scanned = zeek::detail::files_scanned;
|
||||||
|
std::vector<std::string>& sig_files = zeek::detail::sig_files;
|
44
src/ScannedFile.h
Normal file
44
src/ScannedFile.h
Normal file
|
@ -0,0 +1,44 @@
|
||||||
|
// See the file "COPYING" in the main distribution directory for copyright.
|
||||||
|
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
#include <list>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace zeek::detail {
|
||||||
|
|
||||||
|
// Script file we have already scanned (or are in the process of scanning).
|
||||||
|
// They are identified by normalized realpath.
|
||||||
|
class ScannedFile {
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
ScannedFile(int arg_include_level,
|
||||||
|
std::string arg_name, bool arg_skipped = false,
|
||||||
|
bool arg_prefixes_checked = false);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compares the canonical path of this file against every canonical path
|
||||||
|
* in files_scanned and returns whether there's any match.
|
||||||
|
*/
|
||||||
|
bool AlreadyScanned() const;
|
||||||
|
|
||||||
|
int include_level;
|
||||||
|
bool skipped; // This ScannedFile was @unload'd.
|
||||||
|
bool prefixes_checked; // If loading prefixes for this file has been tried.
|
||||||
|
std::string name;
|
||||||
|
std::string canonical_path; // normalized, absolute path via realpath()
|
||||||
|
|
||||||
|
static auto constexpr canonical_stdin_path = "<stdin>";
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
extern std::list<ScannedFile> files_scanned;
|
||||||
|
extern std::vector<std::string> sig_files;
|
||||||
|
|
||||||
|
} // namespace zeek::detail
|
||||||
|
|
||||||
|
using ScannedFile [[deprecated("Remove in v4.1. Use zeek::detail::ScannedFile.")]] = zeek::detail::ScannedFile;
|
||||||
|
extern std::list<zeek::detail::ScannedFile>& files_scanned [[deprecated("Remove in v4.1. Use zeek::detail::files_scanned.")]];
|
||||||
|
extern std::vector<std::string>& sig_files [[deprecated("Remove in v4.1. Use zeek::detail::sig_files.")]];
|
65
src/scan.l
65
src/scan.l
|
@ -34,6 +34,7 @@
|
||||||
#include "Net.h"
|
#include "Net.h"
|
||||||
#include "Traverse.h"
|
#include "Traverse.h"
|
||||||
#include "module_util.h"
|
#include "module_util.h"
|
||||||
|
#include "ScannedFile.h"
|
||||||
|
|
||||||
#include "analyzer/Analyzer.h"
|
#include "analyzer/Analyzer.h"
|
||||||
#include "zeekygen/Manager.h"
|
#include "zeekygen/Manager.h"
|
||||||
|
@ -347,7 +348,7 @@ when return TOK_WHEN;
|
||||||
zeek::reporter->Error("failed to find file associated with @load-sigs %s",
|
zeek::reporter->Error("failed to find file associated with @load-sigs %s",
|
||||||
file);
|
file);
|
||||||
else
|
else
|
||||||
zeek::net::detail::sig_files.push_back(zeek::util::copy_string(path.c_str()));
|
zeek::detail::sig_files.push_back(zeek::util::copy_string(path.c_str()));
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 0:
|
case 0:
|
||||||
|
@ -404,8 +405,8 @@ when return TOK_WHEN;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
// All we have to do is pretend we've already scanned it.
|
// All we have to do is pretend we've already scanned it.
|
||||||
zeek::net::detail::ScannedFile sf(file_stack.length(), std::move(path), true);
|
zeek::detail::ScannedFile sf(file_stack.length(), std::move(path), true);
|
||||||
zeek::net::detail::files_scanned.push_back(std::move(sf));
|
zeek::detail::files_scanned.push_back(std::move(sf));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -571,8 +572,6 @@ YYLTYPE zeek::detail::GetCurrentLocation()
|
||||||
return currloc;
|
return currloc;
|
||||||
}
|
}
|
||||||
|
|
||||||
static auto constexpr canonical_stdin_path = "<stdin>";
|
|
||||||
|
|
||||||
static int load_files(const char* orig_file)
|
static int load_files(const char* orig_file)
|
||||||
{
|
{
|
||||||
std::string file_path = find_relative_script_file(orig_file);
|
std::string file_path = find_relative_script_file(orig_file);
|
||||||
|
@ -599,7 +598,7 @@ static int load_files(const char* orig_file)
|
||||||
if ( zeek::util::streq(orig_file, "-") )
|
if ( zeek::util::streq(orig_file, "-") )
|
||||||
{
|
{
|
||||||
f = stdin;
|
f = stdin;
|
||||||
file_path = canonical_stdin_path;
|
file_path = zeek::detail::ScannedFile::canonical_stdin_path;
|
||||||
|
|
||||||
if ( zeek::detail::g_policy_debug )
|
if ( zeek::detail::g_policy_debug )
|
||||||
{
|
{
|
||||||
|
@ -622,7 +621,7 @@ static int load_files(const char* orig_file)
|
||||||
zeek::reporter->FatalError("can't open %s", file_path.c_str());
|
zeek::reporter->FatalError("can't open %s", file_path.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
zeek::net::detail::ScannedFile sf(file_stack.length(), file_path);
|
zeek::detail::ScannedFile sf(file_stack.length(), file_path);
|
||||||
|
|
||||||
if ( sf.AlreadyScanned() )
|
if ( sf.AlreadyScanned() )
|
||||||
{
|
{
|
||||||
|
@ -632,7 +631,7 @@ static int load_files(const char* orig_file)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
zeek::net::detail::files_scanned.push_back(std::move(sf));
|
zeek::detail::files_scanned.push_back(std::move(sf));
|
||||||
|
|
||||||
if ( zeek::detail::g_policy_debug && ! file_path.empty() )
|
if ( zeek::detail::g_policy_debug && ! file_path.empty() )
|
||||||
{
|
{
|
||||||
|
@ -889,13 +888,12 @@ int yywrap()
|
||||||
// file name is discarded. If the prefix is non-empty, it gets placed
|
// file name is discarded. If the prefix is non-empty, it gets placed
|
||||||
// in front of the flattened path, separated with another '.'
|
// in front of the flattened path, separated with another '.'
|
||||||
bool found_prefixed_files = false;
|
bool found_prefixed_files = false;
|
||||||
for ( auto it = zeek::net::detail::files_scanned.begin();
|
for ( auto& scanned_file : zeek::detail::files_scanned )
|
||||||
it != zeek::net::detail::files_scanned.end(); ++it )
|
|
||||||
{
|
{
|
||||||
if ( it->skipped || it->prefixes_checked )
|
if ( scanned_file.skipped || scanned_file.prefixes_checked )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
it->prefixes_checked = true;
|
scanned_file.prefixes_checked = true;
|
||||||
// Prefixes are pushed onto a stack, so iterate backwards.
|
// Prefixes are pushed onto a stack, so iterate backwards.
|
||||||
for ( int i = zeek::detail::zeek_script_prefixes.size() - 1; i >= 0; --i )
|
for ( int i = zeek::detail::zeek_script_prefixes.size() - 1; i >= 0; --i )
|
||||||
{
|
{
|
||||||
|
@ -903,7 +901,7 @@ int yywrap()
|
||||||
if ( ! zeek::detail::zeek_script_prefixes[i][0] )
|
if ( ! zeek::detail::zeek_script_prefixes[i][0] )
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
std::string canon = zeek::util::detail::without_zeekpath_component(it->name);
|
std::string canon = zeek::util::detail::without_zeekpath_component(scanned_file.name);
|
||||||
std::string flat = zeek::util::detail::flatten_script_name(canon, zeek::detail::zeek_script_prefixes[i]);
|
std::string flat = zeek::util::detail::flatten_script_name(canon, zeek::detail::zeek_script_prefixes[i]);
|
||||||
std::string path = find_relative_script_file(flat);
|
std::string path = find_relative_script_file(flat);
|
||||||
|
|
||||||
|
@ -914,7 +912,7 @@ int yywrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
//printf("====== prefix search ======\n");
|
//printf("====== prefix search ======\n");
|
||||||
//printf("File : %s\n", it->name.c_str());
|
//printf("File : %s\n", scanned_file.name.c_str());
|
||||||
//printf("Canon : %s\n", canon.c_str());
|
//printf("Canon : %s\n", canon.c_str());
|
||||||
//printf("Flat : %s\n", flat.c_str());
|
//printf("Flat : %s\n", flat.c_str());
|
||||||
//printf("Found : %s\n", path.empty() ? "F" : "T");
|
//printf("Found : %s\n", path.empty() ? "F" : "T");
|
||||||
|
@ -1027,42 +1025,3 @@ FileInfo::~FileInfo()
|
||||||
if ( restore_module != "" )
|
if ( restore_module != "" )
|
||||||
zeek::detail::current_module = restore_module;
|
zeek::detail::current_module = restore_module;
|
||||||
}
|
}
|
||||||
|
|
||||||
zeek::net::detail::ScannedFile::ScannedFile(int arg_include_level,
|
|
||||||
std::string arg_name,
|
|
||||||
bool arg_skipped,
|
|
||||||
bool arg_prefixes_checked)
|
|
||||||
: include_level(arg_include_level),
|
|
||||||
skipped(arg_skipped),
|
|
||||||
prefixes_checked(arg_prefixes_checked),
|
|
||||||
name(std::move(arg_name))
|
|
||||||
{
|
|
||||||
if ( name == canonical_stdin_path )
|
|
||||||
canonical_path = canonical_stdin_path;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char buf[PATH_MAX];
|
|
||||||
auto res = realpath(name.data(), buf);
|
|
||||||
|
|
||||||
if ( ! res )
|
|
||||||
zeek::reporter->FatalError("failed to get realpath() of %s: %s",
|
|
||||||
name.data(), strerror(errno));
|
|
||||||
|
|
||||||
canonical_path = res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool zeek::net::detail::ScannedFile::AlreadyScanned() const
|
|
||||||
{
|
|
||||||
auto rval = false;
|
|
||||||
|
|
||||||
for ( const auto& it : zeek::net::detail::files_scanned )
|
|
||||||
if ( it.canonical_path == canonical_path )
|
|
||||||
{
|
|
||||||
rval = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
DBG_LOG(zeek::DBG_SCRIPTS, "AlreadyScanned result (%d) %s", rval, canonical_path.data());
|
|
||||||
return rval;
|
|
||||||
}
|
|
||||||
|
|
|
@ -46,6 +46,7 @@ extern "C" {
|
||||||
#include "Trigger.h"
|
#include "Trigger.h"
|
||||||
#include "Hash.h"
|
#include "Hash.h"
|
||||||
#include "Func.h"
|
#include "Func.h"
|
||||||
|
#include "ScannedFile.h"
|
||||||
|
|
||||||
#include "supervisor/Supervisor.h"
|
#include "supervisor/Supervisor.h"
|
||||||
#include "threading/Manager.h"
|
#include "threading/Manager.h"
|
||||||
|
@ -712,7 +713,7 @@ zeek::detail::SetupResult setup(int argc, char** argv,
|
||||||
all_signature_files.emplace_back(std::move(sf));
|
all_signature_files.emplace_back(std::move(sf));
|
||||||
|
|
||||||
// Append signature files defined in @load-sigs
|
// Append signature files defined in @load-sigs
|
||||||
for ( const auto& sf : zeek::net::detail::sig_files )
|
for ( const auto& sf : zeek::detail::sig_files )
|
||||||
all_signature_files.emplace_back(sf);
|
all_signature_files.emplace_back(sf);
|
||||||
|
|
||||||
if ( ! all_signature_files.empty() )
|
if ( ! all_signature_files.empty() )
|
||||||
|
@ -850,7 +851,7 @@ zeek::detail::SetupResult setup(int argc, char** argv,
|
||||||
if ( zeek_script_loaded )
|
if ( zeek_script_loaded )
|
||||||
{
|
{
|
||||||
// Queue events reporting loaded scripts.
|
// Queue events reporting loaded scripts.
|
||||||
for ( const auto& file : zeek::net::detail::files_scanned )
|
for ( const auto& file : zeek::detail::files_scanned )
|
||||||
{
|
{
|
||||||
if ( file.skipped )
|
if ( file.skipped )
|
||||||
continue;
|
continue;
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue