/* * SystemBackendPosix.cpp * * Copyright (C) 2008 Matthias Schiffer * * This program 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 Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. * See the GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program. If not, see . */ #include "SystemBackendPosix.h" #include #include #include namespace Mad { namespace Modules { namespace SystemBackendPosix { void SystemBackendPosix::getFSInfo(std::vector *fsInfo) throw(Core::Exception) { application->getThreadManager()->detach(); FILE *pipe = popen("/bin/df -P -k", "r"); if(!pipe) throw(Core::Exception(Core::Exception::NOT_AVAILABLE)); char buffer[1024]; std::string output; while(!feof(pipe)) { if(fgets(buffer, sizeof(buffer), pipe) != 0) output += buffer; } pclose(pipe); if(!fsInfo) return; fsInfo->clear(); std::istringstream stream(output); std::string str; std::getline(stream, str); // ignore first line while(!stream.eof()) { std::getline(stream, str); char *fsName = new char[str.length()+1]; char *mountedOn = new char[str.length()+1]; Common::SystemManager::FSInfo info; if(std::sscanf(str.c_str(), "%s %lld %lld %lld %*d%% %s", fsName, &info.total, &info.used, &info.available, mountedOn) == 5) { info.fsName = fsName; info.mountedOn = mountedOn; fsInfo->push_back(info); } delete [] fsName; delete [] mountedOn; } return; } void SystemBackendPosix::shutdown() throw(Core::Exception) { application->getThreadManager()->detach(); if(system("/sbin/halt") != 0) throw(Core::Exception(Core::Exception::NOT_AVAILABLE)); } void SystemBackendPosix::reboot() throw(Core::Exception) { application->getThreadManager()->detach(); if(system("/sbin/reboot") != 0) throw(Core::Exception(Core::Exception::NOT_AVAILABLE)); } } } }