summaryrefslogtreecommitdiffstats
path: root/src/Common
diff options
context:
space:
mode:
Diffstat (limited to 'src/Common')
-rw-r--r--src/Common/Backends/SystemBackendPosix.h14
-rw-r--r--src/Common/Exception.cpp2
-rw-r--r--src/Common/Exception.h2
-rw-r--r--src/Common/RequestHandlers/StatusRequestHandler.cpp2
-rw-r--r--src/Common/SystemBackend.cpp18
-rw-r--r--src/Common/SystemBackend.h6
6 files changed, 41 insertions, 3 deletions
diff --git a/src/Common/Backends/SystemBackendPosix.h b/src/Common/Backends/SystemBackendPosix.h
index aa2b9be..9efd59f 100644
--- a/src/Common/Backends/SystemBackendPosix.h
+++ b/src/Common/Backends/SystemBackendPosix.h
@@ -33,7 +33,7 @@ namespace Mad {
namespace Common {
namespace Backends {
-class SystemBackendPosix {
+class SystemBackendPosix : public SystemBackend {
private:
static SystemBackendPosix backend;
static std::map<pid_t, sigc::slot<void, int> > processes;
@@ -46,9 +46,21 @@ class SystemBackendPosix {
setChildHandler();
}
+ protected:
+ virtual bool doShutdown() {return exec(sigc::slot<void, int>(), "/sbin/halt");}
+ virtual bool doReboot() {return exec(sigc::slot<void, int>(), "/sbin/reboot");}
+
public:
~SystemBackendPosix();
+ static void registerBackend() {
+ SystemBackend::registerBackend(&backend);
+ }
+
+ static void unregisterBackend() {
+ SystemBackend::unregisterBackend(&backend);
+ }
+
static bool exec(sigc::slot<void, int> resultHandler, const std::string &filename, const std::vector<std::string> &argv = std::vector<std::string>(),
const std::vector<std::string> &env = std::vector<std::string>());
};
diff --git a/src/Common/Exception.cpp b/src/Common/Exception.cpp
index 9366fe7..67eb1d9 100644
--- a/src/Common/Exception.cpp
+++ b/src/Common/Exception.cpp
@@ -42,6 +42,8 @@ std::string Exception::strerror() const {
return ret + "Not available";
case NOT_FINISHED:
return ret + "Not finished";
+ case NOT_IMPLEMENTED:
+ return ret + "Not implemented";
case INTERNAL_ERRNO:
return ret + std::strerror(subCode);
case INTERNAL_GNUTLS:
diff --git a/src/Common/Exception.h b/src/Common/Exception.h
index 9862f9b..7b86fbd 100644
--- a/src/Common/Exception.h
+++ b/src/Common/Exception.h
@@ -28,7 +28,7 @@ namespace Common {
class Exception {
public:
enum ErrorCode {
- SUCCESS = 0x0000, UNEXPECTED_PACKET = 0x0001, INVALID_ACTION = 0x0002, NOT_AVAILABLE = 0x0003, NOT_FINISHED = 0x0004,
+ SUCCESS = 0x0000, UNEXPECTED_PACKET = 0x0001, INVALID_ACTION = 0x0002, NOT_AVAILABLE = 0x0003, NOT_FINISHED = 0x0004, NOT_IMPLEMENTED = 0x0005,
INTERNAL_ERRNO = 0x0010, INTERNAL_GNUTLS = 0x0011,
INVALID_ADDRESS = 0x0020,
ALREADY_IDENTIFIED = 0x0030, UNKNOWN_DAEMON = 0x0031
diff --git a/src/Common/RequestHandlers/StatusRequestHandler.cpp b/src/Common/RequestHandlers/StatusRequestHandler.cpp
index ad37964..dbdf9e1 100644
--- a/src/Common/RequestHandlers/StatusRequestHandler.cpp
+++ b/src/Common/RequestHandlers/StatusRequestHandler.cpp
@@ -31,7 +31,7 @@ namespace RequestHandlers {
void StatusRequestHandler::handlePacket(Net::Connection *connection, const Net::Packet &packet) {
if(packet.getType() != Net::Packet::STATUS) {
Logger::log(Logger::ERROR, "Received an unexpected packet.");
- connection->send(Net::Packets::ErrorPacket(Net::Packet::ERROR, packet.getRequestId(), Common::Exception(Common::Exception::UNEXPECTED_PACKET)));
+ connection->send(Net::Packets::ErrorPacket(Net::Packet::ERROR, packet.getRequestId(), Exception(Exception::UNEXPECTED_PACKET)));
signalFinished().emit();
return;
diff --git a/src/Common/SystemBackend.cpp b/src/Common/SystemBackend.cpp
index 0d4b2b7..c017356 100644
--- a/src/Common/SystemBackend.cpp
+++ b/src/Common/SystemBackend.cpp
@@ -52,5 +52,23 @@ SystemBackend::LoadInfo SystemBackend::getLoadInfo() {
return ret;
}
+bool SystemBackend::shutdown() {
+ bool ret = false;
+
+ for(std::set<SystemBackend*>::iterator backend = backends.begin(); backend != backends.end() && !ret; ++backend)
+ ret = (*backend)->doShutdown();
+
+ return ret;
+}
+
+bool SystemBackend::reboot() {
+ bool ret = false;
+
+ for(std::set<SystemBackend*>::iterator backend = backends.begin(); backend != backends.end() && !ret; ++backend)
+ ret = (*backend)->doReboot();
+
+ return ret;
+}
+
}
}
diff --git a/src/Common/SystemBackend.h b/src/Common/SystemBackend.h
index c531224..d9506a9 100644
--- a/src/Common/SystemBackend.h
+++ b/src/Common/SystemBackend.h
@@ -85,6 +85,9 @@ class SystemBackend {
return ret;
}
+ virtual bool doShutdown() {return false;}
+ virtual bool doReboot() {return false;}
+
virtual int getPriority() const {
return 0;
}
@@ -95,6 +98,9 @@ class SystemBackend {
static UptimeInfo getUptimeInfo();
static MemoryInfo getMemoryInfo();
static LoadInfo getLoadInfo();
+
+ static bool shutdown();
+ static bool reboot();
};
}