/* This file is part of Metaproxy.
- Copyright (C) 2005-2010 Index Data
+ Copyright (C) Index Data
Metaproxy is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
#include <yaz/log.h>
#include <unistd.h>
+#include <signal.h>
#include <sys/wait.h>
#include <sstream>
class CGI::Rep {
friend class CGI;
std::list<CGI::Exec> exec_map;
+ std::map<pid_t,pid_t> children;
+ boost::mutex m_mutex;
+ public:
+ ~Rep();
};
}
}
}
+yf::CGI::Rep::~Rep()
+{
+ std::map<pid_t,pid_t>::const_iterator it;
+ boost::mutex::scoped_lock lock(m_mutex);
+
+ for (it = children.begin(); it != children.end(); it++)
+ kill(it->second, SIGTERM);
+}
+
yf::CGI::~CGI()
-{ // must have a destructor because of boost::scoped_ptr
+{
}
void yf::CGI::process(mp::Package &package) const
{
Z_GDU *zgdu_req = package.request().get();
Z_GDU *zgdu_res = 0;
-
+
if (!zgdu_req)
return;
-
+
if (zgdu_req->which != Z_GDU_HTTP_Request)
{
package.move();
package.response() = zgdu_res;
break;
default: /* parent */
+ if (pid)
+ {
+ boost::mutex::scoped_lock lock(m_p->m_mutex);
+ m_p->children[pid] = pid;
+ }
waitpid(pid, &status, 0);
+ if (pid)
+ {
+ boost::mutex::scoped_lock lock(m_p->m_mutex);
+ m_p->children.erase(pid);
+ }
zgdu_res = odr.create_HTTP_Response(
package.session(), zgdu_req->u.HTTP_Request, 200);
package.response() = zgdu_res;
package.move();
}
-void yf::CGI::configure(const xmlNode *ptr, bool test_only)
+void yf::CGI::configure(const xmlNode *ptr, bool test_only, const char *path)
{
for (ptr = ptr->children; ptr; ptr = ptr->next)
{
exec.program = mp::xml::get_text(attr->children);
else
throw mp::filter::FilterException
- ("Bad attribute "
+ ("Bad attribute "
+ std::string((const char *) attr->name)
+ " in cgi section");
}
}
else
{
- throw mp::filter::FilterException("Bad element "
+ throw mp::filter::FilterException("Bad element "
+ std::string((const char *)
ptr->name));
}