Fix build on FreeBSD.

basename(3)/dirname(3) const-ness may vary w/ platform.
This commit is contained in:
Jon Siwek 2013-12-05 11:01:44 -06:00
parent 574018f478
commit 21df25d429
2 changed files with 60 additions and 32 deletions

View file

@ -971,35 +971,59 @@ FILE* open_package(string& path, const string& mode)
return 0; return 0;
} }
SafePathOp::SafePathOp(PathOpFn fn, const char* path, bool error_aborts) void SafePathOp::CheckValid(const char* result, const char* path,
bool error_aborts)
{ {
DoFunc(fn, path ? path : "", error_aborts); if ( result )
}
SafePathOp::SafePathOp(PathOpFn fn, const string& path, bool error_aborts)
{ {
DoFunc(fn, path, error_aborts); result = result;
}
void SafePathOp::DoFunc(PathOpFn fn, const string& path, bool error_aborts)
{
char* tmp = copy_string(path.c_str());
char* rval = fn(tmp);
if ( rval )
{
result = rval;
error = false; error = false;
} }
else else
{ {
if ( error_aborts ) if ( error_aborts )
reporter->InternalError("Path operation failed on %s: %s", reporter->InternalError("Path operation failed on %s: %s",
tmp ? tmp : "<null>", strerror(errno)); path ? path : "<null>", strerror(errno));
else else
error = true; error = true;
} }
}
SafeDirname::SafeDirname(const char* path, bool error_aborts)
: SafePathOp()
{
DoFunc(path ? path : "", error_aborts);
}
SafeDirname::SafeDirname(const string& path, bool error_aborts)
: SafePathOp()
{
DoFunc(path, error_aborts);
}
void SafeDirname::DoFunc(const string& path, bool error_aborts)
{
char* tmp = copy_string(path.c_str());
CheckValid(dirname(tmp), tmp, error_aborts);
delete [] tmp;
}
SafeBasename::SafeBasename(const char* path, bool error_aborts)
: SafePathOp()
{
DoFunc(path ? path : "", error_aborts);
}
SafeBasename::SafeBasename(const string& path, bool error_aborts)
: SafePathOp()
{
DoFunc(path, error_aborts);
}
void SafeBasename::DoFunc(const string& path, bool error_aborts)
{
char* tmp = copy_string(path.c_str());
CheckValid(basename(tmp), tmp, error_aborts);
delete [] tmp; delete [] tmp;
} }

View file

@ -224,34 +224,38 @@ extern std::string bro_prefixes();
class SafePathOp { class SafePathOp {
public: public:
typedef char*(*PathOpFn)(char*);
SafePathOp(PathOpFn fn, const char* path, bool error_aborts = true);
SafePathOp(PathOpFn fn, const std::string& path, bool error_aborts = true);
std::string result; std::string result;
bool error; bool error;
private: protected:
SafePathOp()
{ }
void CheckValid(const char* result, const char* path, bool error_aborts);
void DoFunc(PathOpFn fn, const std::string& path, bool error_aborts = true);
}; };
class SafeDirname : public SafePathOp { class SafeDirname : public SafePathOp {
public: public:
SafeDirname(const char* path, bool error_aborts = true) SafeDirname(const char* path, bool error_aborts = true);
: SafePathOp(&dirname, path, error_aborts) { } SafeDirname(const std::string& path, bool error_aborts = true);
SafeDirname(const std::string& path, bool error_aborts = true)
: SafePathOp(&dirname, path, error_aborts) { } private:
void DoFunc(const std::string& path, bool error_aborts = true);
}; };
class SafeBasename : public SafePathOp { class SafeBasename : public SafePathOp {
public: public:
SafeBasename(const char* path, bool error_aborts = true)
: SafePathOp(&basename, path, error_aborts) { } SafeBasename(const char* path, bool error_aborts = true);
SafeBasename(const std::string& path, bool error_aborts = true) SafeBasename(const std::string& path, bool error_aborts = true);
: SafePathOp(&basename, path, error_aborts) { }
private:
void DoFunc(const std::string& path, bool error_aborts = true);
}; };
std::string implode_string_vector(const std::vector<std::string>& v, std::string implode_string_vector(const std::vector<std::string>& v,