summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--project2/basics/preload.cpp6
-rw-r--r--project2/cgi/testCgi.cpp5
-rw-r--r--project2/common/Jamfile.jam1
-rw-r--r--project2/common/library.cpp11
-rw-r--r--project2/common/library.h5
-rw-r--r--project2/common/optionsSource.h8
-rw-r--r--project2/common/scripts.h3
-rw-r--r--project2/processes/processStream.cpp9
-rw-r--r--project2/url/curlHelper.h5
-rw-r--r--project2/xml/transformText.cpp7
10 files changed, 37 insertions, 23 deletions
diff --git a/project2/basics/preload.cpp b/project2/basics/preload.cpp
index b701d8d..104dc22 100644
--- a/project2/basics/preload.cpp
+++ b/project2/basics/preload.cpp
@@ -1,5 +1,6 @@
#include <pch.hpp>
#include <options.h>
+#include <library.h>
#include <boost/filesystem/path.hpp>
#include <map>
#include <dlfcn.h>
@@ -23,8 +24,9 @@ class Preload {
Logger()->messagebf(LOG_DEBUG, "Loaded library '%s'", librarypath.as<std::string>());
}
else {
- Logger()->messagebf(LOG_ERR, "Failed to load library '%s' (%s)", librarypath.as<std::string>(), dlerror());
- throw std::runtime_error("module load failed");
+ const char * dlerr = dlerror();
+ Logger()->messagebf(LOG_ERR, "Failed to load library '%s' (%s)", librarypath.as<std::string>(), dlerr);
+ throw LoadLibraryFailed(librarypath, dlerr);
}
libs[librarypath.as<std::string>()] = boost::shared_ptr<void>(handle, &dlclose);
diff --git a/project2/cgi/testCgi.cpp b/project2/cgi/testCgi.cpp
index 80c3f01..6644102 100644
--- a/project2/cgi/testCgi.cpp
+++ b/project2/cgi/testCgi.cpp
@@ -32,6 +32,11 @@ class TestInput : public cgicc::CgiInput, public CgiEnvInput {
OptionsSources::Add("_2", new CommandLineArguments(argc, argv,
[](const char * url) { urls.push_back(url); }));
}
+ ~TestInput()
+ {
+ OptionsSources::Remove("_1");
+ OptionsSources::Remove("_2");
+ }
std::string getenv(const std::string & varName) const
{
diff --git a/project2/common/Jamfile.jam b/project2/common/Jamfile.jam
index 541e714..93c9754 100644
--- a/project2/common/Jamfile.jam
+++ b/project2/common/Jamfile.jam
@@ -27,5 +27,6 @@ lib p2common :
: :
<include>.
<library>boost_system
+ <library>../lib//p2lib
;
diff --git a/project2/common/library.cpp b/project2/common/library.cpp
index 738803f..0c4a83b 100644
--- a/project2/common/library.cpp
+++ b/project2/common/library.cpp
@@ -1,27 +1,24 @@
#include <pch.hpp>
#include <dlfcn.h>
#include "scriptStorage.h"
-#include "exceptions.h"
#include "scripts.h"
#include "library.h"
#include "variables.h"
-SimpleMessageException(LoadLibraryFailed);
-SimpleMessageException(UnloadLibraryFailed);
-
Library::Library(ScriptNodePtr p) :
SourceObject(p),
- handle(dlopen(Variable(p, "path")(NULL), RTLD_NOW))
+ path(p, "path"),
+ handle(dlopen(path(NULL), RTLD_NOW))
{
if (!handle) {
- throw LoadLibraryFailed(dlerror());
+ throw LoadLibraryFailed(path(NULL), dlerror());
}
}
Library::~Library()
{
if (dlclose(handle)) {
- throw UnloadLibraryFailed(dlerror());
+ throw UnloadLibraryFailed(path(NULL), dlerror());
}
}
diff --git a/project2/common/library.h b/project2/common/library.h
index c6d9278..7db730b 100644
--- a/project2/common/library.h
+++ b/project2/common/library.h
@@ -2,6 +2,10 @@
#define LIBRARY_LOADER_H
#include "scriptLoader.h"
+#include "exceptions.h"
+
+SimpleMessage2Exception(LoadLibraryFailed);
+SimpleMessage2Exception(UnloadLibraryFailed);
class Library : public SourceObject {
public:
@@ -9,6 +13,7 @@ class Library : public SourceObject {
~Library();
private:
+ Variable path;
void * handle;
};
extern STORAGEOF(Library) libraries;
diff --git a/project2/common/optionsSource.h b/project2/common/optionsSource.h
index 53df0ea..97a3566 100644
--- a/project2/common/optionsSource.h
+++ b/project2/common/optionsSource.h
@@ -25,10 +25,10 @@ typedef boost::intrusive_ptr<OptionsSource> OptionsSourcePtr;
typedef PluginsSameBase<OptionsSource, std::string> OptionsSources;
#define DECLARE_OPTIONSSOURCE(Id, Inst) \
- static void init_optionsSource_##Type() __attribute__ ((constructor(200))); \
- static void init_optionsSource_##Type() { OptionsSources::Add(Id, Inst); } \
- static void kill_optionsSource_##Type() __attribute__ ((destructor(200))); \
- static void kill_optionsSource_##Type() { OptionsSources::Remove(Id); }
+ static void init_optionsSource() __attribute__ ((constructor(200))); \
+ static void init_optionsSource() { OptionsSources::Add(Id, Inst); } \
+ static void kill_optionsSource() __attribute__ ((destructor(200))); \
+ static void kill_optionsSource() { OptionsSources::Remove(Id); }
#endif
diff --git a/project2/common/scripts.h b/project2/common/scripts.h
index b7e9cdb..92151f6 100644
--- a/project2/common/scripts.h
+++ b/project2/common/scripts.h
@@ -30,6 +30,7 @@ class Scripts {
class ScriptNode : public IntrusivePtrBase {
public:
ScriptNode(ScriptReaderPtr);
+ virtual ~ScriptNode() { }
typedef std::vector<ScriptNodePtr> ScriptNodes;
typedef boost::function<void(const VariableType &)> LiteralCallback;
@@ -62,6 +63,8 @@ class ScriptNode : public IntrusivePtrBase {
class ScriptReader : public virtual IntrusivePtrBase {
public:
+ virtual ~ScriptReader() { }
+
virtual ScriptNodePtr root() const = 0;
virtual void load(const CommonObjects *, bool childrenOnly) const;
virtual bool isCurrent() const = 0;
diff --git a/project2/processes/processStream.cpp b/project2/processes/processStream.cpp
index f2c678f..1ed8388 100644
--- a/project2/processes/processStream.cpp
+++ b/project2/processes/processStream.cpp
@@ -23,13 +23,12 @@ class ProcessStream : public Stream, IHaveParameters {
void runStream(const Sink & sink, ExecContext * ec) const
{
- const char * callProc[parameters.size() + 2];
- callProc[0] = path(ec);
- int pidx = 1;
+ std::vector<std::string> callProc;
+ callProc.reserve(parameters.size() + 2);
+ callProc.push_back(path(ec));
BOOST_FOREACH(const Parameters::value_type & p, parameters) {
- callProc[pidx++] = p.second(ec);
+ callProc.push_back(p.second(ec));
}
- callProc[pidx] = NULL;
int fds[2];
popenrw(callProc, fds);
diff --git a/project2/url/curlHelper.h b/project2/url/curlHelper.h
index 10c6c69..76ac48f 100644
--- a/project2/url/curlHelper.h
+++ b/project2/url/curlHelper.h
@@ -6,8 +6,11 @@
class Curl : public CurlHandle {
public:
+ virtual ~Curl() { }
+
typedef boost::function2<size_t, const char *, size_t> ReadHandler;
typedef boost::function2<size_t, char *, size_t> SendHandler;
+
void performRead(const ReadHandler &);
void setReadHandler(const ReadHandler &);
void performSend(const SendHandler &);
@@ -23,7 +26,7 @@ typedef boost::intrusive_ptr<Curl> CurlPtr;
class CurlHelper {
public:
CurlHelper();
- ~CurlHelper();
+ virtual ~CurlHelper();
virtual CurlPtr newCurl(ExecContext *) const;
diff --git a/project2/xml/transformText.cpp b/project2/xml/transformText.cpp
index 179007d..f92e8ef 100644
--- a/project2/xml/transformText.cpp
+++ b/project2/xml/transformText.cpp
@@ -47,18 +47,17 @@ class TransformHtmlToText : public TransformImpl<HtmlDocument, TextDocument> {
xmlDoc * doc = const_cast<xmlDoc *>(cdoc->doc);
str->doc.clear();
int fds[2];
- std::vector<const char *> callLynx;
+ std::vector<std::string> callLynx;
callLynx.push_back("/usr/bin/lynx");
callLynx.push_back("-dump");
callLynx.push_back("-stdin");
std::string widthArg = "-width=" + width.as<std::string>();
- callLynx.push_back(widthArg.c_str());
+ callLynx.push_back(widthArg);
if (!links) {
callLynx.push_back("-nonumbers");
callLynx.push_back("-nolist");
}
- callLynx.push_back(NULL);
- popenrw(&callLynx.front(), fds);
+ popenrw(callLynx, fds);
FILE * lynxIn = fdopen(fds[0], "w");
// Fixed encoding as we want the result to go back into a ustring
htmlNodeDumpFileFormat(lynxIn, doc, xmlDocGetRootElement(doc), "utf-8", 0);