blob: 1ba6ef02ac19e34306954a9bf4d34907ff2eb7b8 [file] [log] [blame]
San Mehatc41d1c82009-05-14 14:58:45 -07001#include <errno.h>
Olivier Baillyb93e5812010-11-17 11:47:23 -08002#include <string.h>
San Mehatc41d1c82009-05-14 14:58:45 -07003
4#include <sysutils/ServiceManager.h>
5
6#define LOG_TAG "Service"
7#include <cutils/log.h>
8#include <cutils/properties.h>
9
10ServiceManager::ServiceManager() {
11}
12
13int ServiceManager::start(const char *name) {
14 if (isRunning(name)) {
San Mehat7e8529a2010-03-25 09:31:42 -070015 SLOGW("Service '%s' is already running", name);
San Mehatc41d1c82009-05-14 14:58:45 -070016 return 0;
17 }
18
San Mehat7e8529a2010-03-25 09:31:42 -070019 SLOGD("Starting service '%s'", name);
San Mehatc41d1c82009-05-14 14:58:45 -070020 property_set("ctl.start", name);
21
22 int count = 200;
23 while(count--) {
24 sched_yield();
25 if (isRunning(name))
26 break;
27 }
28 if (!count) {
San Mehat7e8529a2010-03-25 09:31:42 -070029 SLOGW("Timed out waiting for service '%s' to start", name);
San Mehatc41d1c82009-05-14 14:58:45 -070030 errno = ETIMEDOUT;
31 return -1;
32 }
San Mehat7e8529a2010-03-25 09:31:42 -070033 SLOGD("Sucessfully started '%s'", name);
San Mehatc41d1c82009-05-14 14:58:45 -070034 return 0;
35}
36
37int ServiceManager::stop(const char *name) {
38 if (!isRunning(name)) {
San Mehat7e8529a2010-03-25 09:31:42 -070039 SLOGW("Service '%s' is already stopped", name);
San Mehatc41d1c82009-05-14 14:58:45 -070040 return 0;
41 }
42
San Mehat7e8529a2010-03-25 09:31:42 -070043 SLOGD("Stopping service '%s'", name);
San Mehatc41d1c82009-05-14 14:58:45 -070044 property_set("ctl.stop", name);
45
46 int count = 200;
47 while(count--) {
48 sched_yield();
49 if (!isRunning(name))
50 break;
51 }
52
53 if (!count) {
San Mehat7e8529a2010-03-25 09:31:42 -070054 SLOGW("Timed out waiting for service '%s' to stop", name);
San Mehatc41d1c82009-05-14 14:58:45 -070055 errno = ETIMEDOUT;
56 return -1;
57 }
San Mehat7e8529a2010-03-25 09:31:42 -070058 SLOGD("Sucessfully stopped '%s'", name);
San Mehatc41d1c82009-05-14 14:58:45 -070059 return 0;
60}
61
62bool ServiceManager::isRunning(const char *name) {
63 char propVal[PROPERTY_VALUE_MAX];
64 char propName[255];
65
66 snprintf(propName, sizeof(propVal), "init.svc.%s", name);
67
68
69 if (property_get(propName, propVal, NULL)) {
70 if (!strcmp(propVal, "running"))
71 return true;
72 }
73 return false;
74}