ServiceManager.cpp revision b93e5812faffd3b6c5fb349072413aace31918d8
1c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat#include <errno.h> 2b93e5812faffd3b6c5fb349072413aace31918d8Olivier Bailly#include <string.h> 3c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat 4c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat#include <sysutils/ServiceManager.h> 5c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat 6c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat#define LOG_TAG "Service" 7c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat#include <cutils/log.h> 8c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat#include <cutils/properties.h> 9c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat 10c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan MehatServiceManager::ServiceManager() { 11c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat} 12c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat 13c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehatint ServiceManager::start(const char *name) { 14c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat if (isRunning(name)) { 157e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGW("Service '%s' is already running", name); 16c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat return 0; 17c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat } 18c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat 197e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGD("Starting service '%s'", name); 20c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat property_set("ctl.start", name); 21c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat 22c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat int count = 200; 23c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat while(count--) { 24c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat sched_yield(); 25c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat if (isRunning(name)) 26c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat break; 27c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat } 28c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat if (!count) { 297e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGW("Timed out waiting for service '%s' to start", name); 30c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat errno = ETIMEDOUT; 31c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat return -1; 32c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat } 337e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGD("Sucessfully started '%s'", name); 34c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat return 0; 35c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat} 36c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat 37c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehatint ServiceManager::stop(const char *name) { 38c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat if (!isRunning(name)) { 397e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGW("Service '%s' is already stopped", name); 40c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat return 0; 41c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat } 42c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat 437e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGD("Stopping service '%s'", name); 44c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat property_set("ctl.stop", name); 45c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat 46c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat int count = 200; 47c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat while(count--) { 48c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat sched_yield(); 49c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat if (!isRunning(name)) 50c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat break; 51c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat } 52c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat 53c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat if (!count) { 547e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGW("Timed out waiting for service '%s' to stop", name); 55c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat errno = ETIMEDOUT; 56c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat return -1; 57c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat } 587e8529a8b528fd30586aa037f15a31b29582c537San Mehat SLOGD("Sucessfully stopped '%s'", name); 59c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat return 0; 60c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat} 61c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat 62c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehatbool ServiceManager::isRunning(const char *name) { 63c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat char propVal[PROPERTY_VALUE_MAX]; 64c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat char propName[255]; 65c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat 66c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat snprintf(propName, sizeof(propVal), "init.svc.%s", name); 67c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat 68c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat 69c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat if (property_get(propName, propVal, NULL)) { 70c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat if (!strcmp(propVal, "running")) 71c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat return true; 72c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat } 73c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat return false; 74c41d1c8074ed02acc9d1e749d81e0aafb5efbbfaSan Mehat} 75