Home | History | Annotate | Download | only in src
      1 #include <errno.h>
      2 
      3 #include <sysutils/ServiceManager.h>
      4 
      5 #define LOG_TAG "Service"
      6 #include <cutils/log.h>
      7 #include <cutils/properties.h>
      8 
      9 ServiceManager::ServiceManager() {
     10 }
     11 
     12 int ServiceManager::start(const char *name) {
     13     if (isRunning(name)) {
     14         SLOGW("Service '%s' is already running", name);
     15         return 0;
     16     }
     17 
     18     SLOGD("Starting service '%s'", name);
     19     property_set("ctl.start", name);
     20 
     21     int count = 200;
     22     while(count--) {
     23         sched_yield();
     24         if (isRunning(name))
     25             break;
     26     }
     27     if (!count) {
     28         SLOGW("Timed out waiting for service '%s' to start", name);
     29         errno = ETIMEDOUT;
     30         return -1;
     31     }
     32     SLOGD("Sucessfully started '%s'", name);
     33     return 0;
     34 }
     35 
     36 int ServiceManager::stop(const char *name) {
     37     if (!isRunning(name)) {
     38         SLOGW("Service '%s' is already stopped", name);
     39         return 0;
     40     }
     41 
     42     SLOGD("Stopping service '%s'", name);
     43     property_set("ctl.stop", name);
     44 
     45     int count = 200;
     46     while(count--) {
     47         sched_yield();
     48         if (!isRunning(name))
     49             break;
     50     }
     51 
     52     if (!count) {
     53         SLOGW("Timed out waiting for service '%s' to stop", name);
     54         errno = ETIMEDOUT;
     55         return -1;
     56     }
     57     SLOGD("Sucessfully stopped '%s'", name);
     58     return 0;
     59 }
     60 
     61 bool ServiceManager::isRunning(const char *name) {
     62     char propVal[PROPERTY_VALUE_MAX];
     63     char propName[255];
     64 
     65     snprintf(propName, sizeof(propVal), "init.svc.%s", name);
     66 
     67 
     68     if (property_get(propName, propVal, NULL)) {
     69         if (!strcmp(propVal, "running"))
     70             return true;
     71     }
     72     return false;
     73 }
     74