blob: 60b161aae0f6c1c8b15da2cb491906661afcc4db [file] [log] [blame]
San Mehatc41d1c82009-05-14 14:58:45 -07001#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
9ServiceManager::ServiceManager() {
10}
11
12int ServiceManager::start(const char *name) {
13 if (isRunning(name)) {
San Mehat7e8529a2010-03-25 09:31:42 -070014 SLOGW("Service '%s' is already running", name);
San Mehatc41d1c82009-05-14 14:58:45 -070015 return 0;
16 }
17
San Mehat7e8529a2010-03-25 09:31:42 -070018 SLOGD("Starting service '%s'", name);
San Mehatc41d1c82009-05-14 14:58:45 -070019 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) {
San Mehat7e8529a2010-03-25 09:31:42 -070028 SLOGW("Timed out waiting for service '%s' to start", name);
San Mehatc41d1c82009-05-14 14:58:45 -070029 errno = ETIMEDOUT;
30 return -1;
31 }
San Mehat7e8529a2010-03-25 09:31:42 -070032 SLOGD("Sucessfully started '%s'", name);
San Mehatc41d1c82009-05-14 14:58:45 -070033 return 0;
34}
35
36int ServiceManager::stop(const char *name) {
37 if (!isRunning(name)) {
San Mehat7e8529a2010-03-25 09:31:42 -070038 SLOGW("Service '%s' is already stopped", name);
San Mehatc41d1c82009-05-14 14:58:45 -070039 return 0;
40 }
41
San Mehat7e8529a2010-03-25 09:31:42 -070042 SLOGD("Stopping service '%s'", name);
San Mehatc41d1c82009-05-14 14:58:45 -070043 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) {
San Mehat7e8529a2010-03-25 09:31:42 -070053 SLOGW("Timed out waiting for service '%s' to stop", name);
San Mehatc41d1c82009-05-14 14:58:45 -070054 errno = ETIMEDOUT;
55 return -1;
56 }
San Mehat7e8529a2010-03-25 09:31:42 -070057 SLOGD("Sucessfully stopped '%s'", name);
San Mehatc41d1c82009-05-14 14:58:45 -070058 return 0;
59}
60
61bool 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}