mirror of
https://github.com/zeek/zeek.git
synced 2025-10-07 17:18:20 +00:00
@load now supports loading a directory.
With a directory "foo" somewhere in BROPATH, "@load foo" now checks if there's a file "foo/__load__.bro". If so, it reads that file in. (If not, Bro reports the same error as before, complaining that it can't read a directory).
This commit is contained in:
parent
5c0704eec8
commit
fac328685b
8 changed files with 43 additions and 12 deletions
|
@ -343,7 +343,7 @@ vector<ParseLocationRec> parse_location_string(const string& s)
|
||||||
plr.type = plrUnknown;
|
plr.type = plrUnknown;
|
||||||
|
|
||||||
FILE* throwaway = search_for_file(filename.c_str(), "bro",
|
FILE* throwaway = search_for_file(filename.c_str(), "bro",
|
||||||
&full_filename);
|
&full_filename, true);
|
||||||
if ( ! throwaway )
|
if ( ! throwaway )
|
||||||
{
|
{
|
||||||
debug_msg("No such policy file: %s.\n", filename.c_str());
|
debug_msg("No such policy file: %s.\n", filename.c_str());
|
||||||
|
|
|
@ -295,7 +295,7 @@ void OSFingerprint::load_config(const char* file)
|
||||||
uint32 ln=0;
|
uint32 ln=0;
|
||||||
char buf[MAXLINE];
|
char buf[MAXLINE];
|
||||||
char* p;
|
char* p;
|
||||||
FILE* c = search_for_file( file, "osf", 0);
|
FILE* c = search_for_file( file, "osf", 0, false);
|
||||||
|
|
||||||
if (!c)
|
if (!c)
|
||||||
{
|
{
|
||||||
|
|
|
@ -195,7 +195,7 @@ bool RuleMatcher::ReadFiles(const name_list& files)
|
||||||
|
|
||||||
for ( int i = 0; i < files.length(); ++i )
|
for ( int i = 0; i < files.length(); ++i )
|
||||||
{
|
{
|
||||||
rules_in = search_for_file( files[i], "sig", 0);
|
rules_in = search_for_file( files[i], "sig", 0, false);
|
||||||
if ( ! rules_in )
|
if ( ! rules_in )
|
||||||
{
|
{
|
||||||
error("Can't open signature file", files[i]);
|
error("Can't open signature file", files[i]);
|
||||||
|
|
|
@ -557,7 +557,7 @@ static int load_files_with_prefix(const char* orig_file)
|
||||||
else
|
else
|
||||||
strcpy(new_filename, file);
|
strcpy(new_filename, file);
|
||||||
|
|
||||||
f = search_for_file(new_filename, "bro", &full_filename);
|
f = search_for_file(new_filename, "bro", &full_filename, true);
|
||||||
delete [] new_filename;
|
delete [] new_filename;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
37
src/util.cc
37
src/util.cc
|
@ -868,21 +868,45 @@ const char* bro_prefixes()
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
FILE* open_file(const char* filename, const char** full_filename)
|
static const char* PACKAGE_LOADER = "__load__.bro";
|
||||||
|
|
||||||
|
// If filename is pointing to a directory that contains a file called
|
||||||
|
// PACKAGE_LOADER, returns the files path. Otherwise returns filename itself.
|
||||||
|
// In both cases, the returned string is newly allocated.
|
||||||
|
static const char* check_for_dir(const char* filename, bool load_pkgs)
|
||||||
{
|
{
|
||||||
|
if ( load_pkgs && is_dir(filename) )
|
||||||
|
{
|
||||||
|
char init_filename_buf[1024];
|
||||||
|
safe_snprintf(init_filename_buf, sizeof(init_filename_buf),
|
||||||
|
"%s/%s", filename, PACKAGE_LOADER);
|
||||||
|
|
||||||
|
if ( access(init_filename_buf, R_OK) == 0 )
|
||||||
|
return copy_string(init_filename_buf);
|
||||||
|
}
|
||||||
|
|
||||||
|
return copy_string(filename);
|
||||||
|
}
|
||||||
|
|
||||||
|
FILE* open_file(const char* filename, const char** full_filename, bool load_pkgs)
|
||||||
|
{
|
||||||
|
filename = check_for_dir(filename, load_pkgs);
|
||||||
|
|
||||||
if ( full_filename )
|
if ( full_filename )
|
||||||
*full_filename = copy_string(filename);
|
*full_filename = copy_string(filename);
|
||||||
|
|
||||||
FILE* f = fopen(filename, "r");
|
FILE* f = fopen(filename, "r");
|
||||||
|
|
||||||
|
delete [] filename;
|
||||||
|
|
||||||
return f;
|
return f;
|
||||||
}
|
}
|
||||||
|
|
||||||
FILE* search_for_file(const char* filename, const char* ext,
|
FILE* search_for_file(const char* filename, const char* ext,
|
||||||
const char** full_filename)
|
const char** full_filename, bool load_pkgs)
|
||||||
{
|
{
|
||||||
if ( filename[0] == '/' || filename[0] == '.' )
|
if ( filename[0] == '/' || filename[0] == '.' )
|
||||||
return open_file(filename, full_filename);
|
return open_file(filename, full_filename, load_pkgs);
|
||||||
|
|
||||||
char path[1024], full_filename_buf[1024];
|
char path[1024], full_filename_buf[1024];
|
||||||
safe_strncpy(path, bro_path(), sizeof(path));
|
safe_strncpy(path, bro_path(), sizeof(path));
|
||||||
|
@ -905,13 +929,12 @@ FILE* search_for_file(const char* filename, const char* ext,
|
||||||
"%s/%s.%s", dir_beginning, filename, ext);
|
"%s/%s.%s", dir_beginning, filename, ext);
|
||||||
if ( access(full_filename_buf, R_OK) == 0 &&
|
if ( access(full_filename_buf, R_OK) == 0 &&
|
||||||
! is_dir(full_filename_buf) )
|
! is_dir(full_filename_buf) )
|
||||||
return open_file(full_filename_buf, full_filename);
|
return open_file(full_filename_buf, full_filename, load_pkgs);
|
||||||
|
|
||||||
safe_snprintf(full_filename_buf, sizeof(full_filename_buf),
|
safe_snprintf(full_filename_buf, sizeof(full_filename_buf),
|
||||||
"%s/%s", dir_beginning, filename);
|
"%s/%s", dir_beginning, filename);
|
||||||
if ( access(full_filename_buf, R_OK) == 0 &&
|
if ( access(full_filename_buf, R_OK) == 0 )
|
||||||
! is_dir(full_filename_buf) )
|
return open_file(full_filename_buf, full_filename, load_pkgs);
|
||||||
return open_file(full_filename_buf, full_filename);
|
|
||||||
|
|
||||||
dir_beginning = ++dir_ending;
|
dir_beginning = ++dir_ending;
|
||||||
}
|
}
|
||||||
|
|
|
@ -190,7 +190,7 @@ extern int int_list_cmp(const void* v1, const void* v2);
|
||||||
extern const char* bro_path();
|
extern const char* bro_path();
|
||||||
extern const char* bro_prefixes();
|
extern const char* bro_prefixes();
|
||||||
extern FILE* search_for_file(const char* filename, const char* ext,
|
extern FILE* search_for_file(const char* filename, const char* ext,
|
||||||
const char** full_filename);
|
const char** full_filename, bool load_pkgs);
|
||||||
|
|
||||||
// Renames the given file to a new temporary name, and opens a new file with
|
// Renames the given file to a new temporary name, and opens a new file with
|
||||||
// the original name. Returns new file or NULL on error. Inits rotate_info if
|
// the original name. Returns new file or NULL on error. Inits rotate_info if
|
||||||
|
|
1
testing/btest/Baseline/core.load-pkg/output
Normal file
1
testing/btest/Baseline/core.load-pkg/output
Normal file
|
@ -0,0 +1 @@
|
||||||
|
Foo loaded
|
7
testing/btest/core/load-pkg.bro
Normal file
7
testing/btest/core/load-pkg.bro
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# @TEST-EXEC: mkdir foo
|
||||||
|
# @TEST-EXEC: echo "@load foo/test.bro" >foo/__load__.bro
|
||||||
|
# @TEST-EXEC: cp %INPUT foo/test.bro
|
||||||
|
# @TEST-EXEC: bro -l foo >output 2>1
|
||||||
|
# @TEST-EXEC: btest-diff output
|
||||||
|
|
||||||
|
print "Foo loaded";
|
Loading…
Add table
Add a link
Reference in a new issue