Lines Matching refs:service

46 // All service processes that init will fork+exec.
49 // maximum number of crashes within time CRITICAL_DEFAULT_CRASH_TIME for one service
73 // remove service socket list head node from OnDemand socket list before free OnDemand service socket
90 // check service in group
97 INIT_LOGE("Failed to create service name %s", name);
100 if (node->data.service != NULL) {
101 ReleaseService(node->data.service);
102 node->data.service = NULL;
104 Service *service = (Service *)calloc(1, sizeof(Service));
105 INIT_ERROR_CHECK(service != NULL, return NULL, "Failed to malloc for service");
106 node->data.service = service;
107 service->name = node->name;
108 service->status = SERVICE_IDLE;
109 service->cpuSet = NULL;
110 service->pid = -1;
111 service->context.type = INIT_CONTEXT_MAIN;
112 service->lastErrno = INIT_OK;
113 OH_ListInit(&service->extDataNode);
116 return service;
134 static void ExecuteServiceClear(Service *service)
139 ctx.serviceName = service->name;
144 void ReleaseService(Service *service)
146 INIT_CHECK(service != NULL, return);
147 FreeServiceArg(&service->pathArgs);
148 FreeServiceArg(&service->writePidArgs);
149 FreeServiceArg(&service->capsArgs);
150 FreeServiceArg(&service->permArgs);
151 FreeServiceArg(&service->permAclsArgs);
153 if (service->servPerm.caps != NULL) {
154 free(service->servPerm.caps);
155 service->servPerm.caps = NULL;
157 service->servPerm.capsCnt = 0;
158 if (service->servPerm.gIDArray != NULL) {
159 free(service->servPerm.gIDArray);
160 service->servPerm.gIDArray = NULL;
162 service->servPerm.gIDCnt = 0;
164 FreeServiceSocket(service->socketCfg);
165 FreeServiceFile(service->fileCfg);
167 if (service->apl != NULL) {
168 free(service->apl);
169 service->apl = NULL;
172 if (service->env != NULL) {
173 free(service->env);
174 service->env = NULL;
178 if (service->serviceJobs.jobsName[i] != NULL) {
179 free(service->serviceJobs.jobsName[i]);
181 service->serviceJobs.jobsName[i] = NULL;
183 if (service->cpuSet != NULL) {
184 free(service->cpuSet);
185 service->cpuSet = NULL;
187 if (service->restartArg != NULL) {
188 free(service->restartArg);
189 service->restartArg = NULL;
191 CloseServiceFds(service, true);
192 ExecuteServiceClear(service);
194 InitGroupNode *groupNode = GetGroupNode(NODE_TYPE_SERVICES, service->name);
195 INIT_CHECK(groupNode == NULL, groupNode->data.service = NULL);
196 free(service);
433 static int AddServiceSocket(cJSON *json, Service *service)
440 INIT_INFO_CHECK(sockopt != NULL, return SERVICE_FAILURE, "Failed to malloc for service %s", service->name);
447 sockopt->service = service;
478 if (service->socketCfg == NULL) {
479 service->socketCfg = sockopt;
481 sockopt->next = service->socketCfg->next;
482 service->socketCfg->next = sockopt;
510 static int AddServiceFile(cJSON *json, Service *service)
554 if (service->fileCfg == NULL) {
555 service->fileCfg = fileOpt;
557 fileOpt->next = service->fileCfg->next;
558 service->fileCfg->next = fileOpt;
634 static int GetServiceMode(Service *service, const cJSON *json)
647 service->startMode = START_MODE_NORMAL;
648 service->endMode = END_AFTER_EXEC;
651 service->startMode = GetMapValue(value,
656 service->endMode = GetMapValue(value,
662 static int GetServiceJobs(Service *service, cJSON *json)
670 if (service->serviceJobs.jobsName[i] != NULL) {
671 DelGroupNode(NODE_TYPE_JOBS, service->serviceJobs.jobsName[i]);
672 free(service->serviceJobs.jobsName[i]);
674 service->serviceJobs.jobsName[i] = strdup(jobName);
675 if (service->serviceJobs.jobsName[i] == NULL) {
738 static int GetCpuArgs(const cJSON *argJson, const char *name, Service *service)
749 if (count > 0 && service->cpuSet == NULL) {
750 service->cpuSet = malloc(sizeof(cpu_set_t));
751 INIT_ERROR_CHECK(service->cpuSet != NULL, return SERVICE_FAILURE, "Failed to malloc for cpuset");
753 CPU_ZERO(service->cpuSet);
759 INIT_LOGW("%s core number %d of CPU cores does not exist", service->name, cpus);
762 if (CPU_ISSET(cpus, service->cpuSet)) {
765 CPU_SET(cpus, service->cpuSet);
770 static int GetServiceSandbox(const cJSON *curItem, Service *service)
778 "Service : %s sandbox value only support number.", service->name);
781 MarkServiceWithoutSandbox(service);
783 MarkServiceWithSandbox(service);
830 void SetServicePathWithAsan(Service *service)
835 if (GetWrapServiceNameValue(service->name) != 0) {
839 int ret = strcpy_s(tmpPathName, MAX_ONE_ARG_LEN, service->pathArgs.argv[0]);
840 INIT_ERROR_CHECK(ret == 0, return, "Asan: failed to copy service path %s", service->pathArgs.argv[0]);
853 free(service->pathArgs.argv[0]);
854 service->pathArgs.argv[0] = strdup(tmpPathName);
855 INIT_ERROR_CHECK(service->pathArgs.argv[0] != NULL, return, "Asan: failed dup path.");
856 INIT_LOGI("Asan: replace module %s with %s successfully.", service->name, service->pathArgs.argv[0]);
862 static void ParseOneServiceArgs(const cJSON *curItem, Service *service)
864 GetServiceArgs(curItem, "writepid", MAX_WRITEPID_FILES, &service->writePidArgs);
865 GetServiceArgs(curItem, D_CAPS_STR_IN_CFG, MAX_WRITEPID_FILES, &service->capsArgs);
866 GetServiceArgs(curItem, "permission", MAX_WRITEPID_FILES, &service->permArgs);
867 GetServiceArgs(curItem, "permission_acls", MAX_WRITEPID_FILES, &service->permAclsArgs);
871 if (service->apl != NULL) {
872 free(service->apl);
874 service->apl = strdup(fieldStr);
875 INIT_CHECK(service->apl != NULL, return);
877 (void)GetCpuArgs(curItem, CPU_CORE_STR_IN_CFG, service);
880 static int SetConsoleValue(Service *service, const char *attrName, int value, int flag)
884 INIT_ERROR_CHECK(service != NULL, return SERVICE_FAILURE, "Set service attr failed! null ptr.");
886 service->attribute |= SERVICE_ATTR_CONSOLE;
888 service->attribute |= SERVICE_ATTR_KMSG;
893 static int GetServiceEnv(Service *service, const cJSON *json)
899 service->env = (ServiceEnv*)calloc(envCnt, sizeof(ServiceEnv));
900 INIT_ERROR_CHECK(service->env != NULL, return SERVICE_FAILURE, "calloc ServiceEnv memory failed!");
902 service->envCnt = envCnt;
909 int ret = strcpy_s(service->env[i].name, strLen + 1, name);
914 ret = strcpy_s(service->env[i].value, strLen + 1, value);
934 int ParseOneService(const cJSON *curItem, Service *service)
936 INIT_CHECK_RETURN_VALUE(curItem != NULL && service != NULL, SERVICE_FAILURE);
937 int ret = GetServiceArgs(curItem, "path", MAX_PATH_ARGS_CNT, &service->pathArgs);
938 INIT_ERROR_CHECK(ret == 0, return SERVICE_FAILURE, "Failed to get path for service %s", service->name);
939 if ((service->pathArgs.count > 0) && IsForbidden(service->pathArgs.argv[0])) {
940 INIT_LOGE("Service %s is forbidden.", service->name);
944 SetServicePathWithAsan(service);
946 ret = GetUid(cJSON_GetObjectItem(curItem, UID_STR_IN_CFG), &service->servPerm.uID);
947 INIT_ERROR_CHECK(ret == 0, return SERVICE_FAILURE, "Failed to get uid for service %s", service->name);
948 ret = GetServiceGids(curItem, service);
949 INIT_ERROR_CHECK(ret == 0, return SERVICE_FAILURE, "Failed to get gid for service %s", service->name);
951 ret = GetServiceAttr(curItem, service, ONCE_STR_IN_CFG, SERVICE_ATTR_ONCE, NULL);
952 INIT_ERROR_CHECK(ret == 0, return SERVICE_FAILURE, "Failed to get once flag for service %s", service->name);
953 ret = GetServiceAttr(curItem, service, IMPORTANT_STR_IN_CFG, SERVICE_ATTR_IMPORTANT, SetImportantValue);
954 INIT_ERROR_CHECK(ret == 0, return SERVICE_FAILURE, "Failed to get import flag for service %s", service->name);
955 ret = GetCritical(curItem, service, CRITICAL_STR_IN_CFG, SERVICE_ATTR_CRITICAL);
956 INIT_ERROR_CHECK(ret == 0, return SERVICE_FAILURE, "Failed to get critical flag for service %s", service->name);
957 ret = GetServiceAttr(curItem, service, DISABLED_STR_IN_CFG, SERVICE_ATTR_DISABLED, NULL);
958 INIT_ERROR_CHECK(ret == 0, return SERVICE_FAILURE, "Failed to get disabled flag for service %s", service->name);
959 ret = GetServiceAttr(curItem, service, CONSOLE_STR_IN_CFG, SERVICE_ATTR_CONSOLE, SetConsoleValue);
960 INIT_ERROR_CHECK(ret == 0, return SERVICE_FAILURE, "Failed to get console for service %s", service->name);
961 ret = GetServiceAttr(curItem, service, "notify-state", SERVICE_ATTR_NOTIFY_STATE, NULL);
962 INIT_ERROR_CHECK(ret == 0, return SERVICE_FAILURE, "Failed to get notify-state for service %s", service->name);
963 ret = GetServiceAttr(curItem, service, MODULE_UPDATE_STR_IN_CFG, SERVICE_ATTR_MODULE_UPDATE, NULL);
964 INIT_ERROR_CHECK(ret == 0, return SERVICE_FAILURE, "Failed to get module-update for service %s", service->name);
966 ParseOneServiceArgs(curItem, service);
967 ret = GetServiceEnv(service, curItem);
968 INIT_ERROR_CHECK(ret == 0, return SERVICE_FAILURE, "Failed to get env for service %s", service->name);
969 ret = GetServicePeriod(curItem, service, PERIOD_STR_IN_CFG, SERVICE_ATTR_PERIOD);
970 INIT_ERROR_CHECK(ret == 0, return SERVICE_FAILURE, "Failed to get period for service %s", service->name);
971 ret = GetServiceSandbox(curItem, service);
972 INIT_ERROR_CHECK(ret == 0, return SERVICE_FAILURE, "Failed to get sandbox for service %s", service->name);
973 ret = InitServiceCaps(curItem, service);
974 INIT_ERROR_CHECK(ret == 0, return SERVICE_FAILURE, "Failed to get caps for service %s", service->name);
975 ret = GetServiceOnDemand(curItem, service);
976 INIT_ERROR_CHECK(ret == 0, return SERVICE_FAILURE, "Failed to get ondemand flag for service %s", service->name);
977 ret = GetServiceSetuid(curItem, service);
978 INIT_ERROR_CHECK(ret == 0, return SERVICE_FAILURE, "Failed to get setuid flag for service %s", service->name);
979 ret = GetServiceMode(service, curItem);
980 INIT_ERROR_CHECK(ret == 0, return SERVICE_FAILURE, "Failed to get start/end mode for service %s", service->name);
981 ret = GetServiceJobs(service, cJSON_GetObjectItem(curItem, "jobs"));
982 INIT_ERROR_CHECK(ret == 0, return SERVICE_FAILURE, "Failed to get jobs for service %s", service->name);
1024 Service *service = (Service *)context;
1026 if (fd < 0 || service == NULL) {
1033 if (strcmp(service->name, "console") != 0) {
1034 INIT_LOGE("Process console event with invalid service %s, only console service should do this", service->name);
1038 if (ServiceStart(service, &service->pathArgs) != SERVICE_SUCCESS) {
1039 INIT_LOGE("Start console service failed");
1044 static int AddFileDescriptorToWatcher(int fd, Service *service)
1046 if (fd < 0 || service == NULL) {
1056 int ret = LE_StartWatcher(LE_GetDefaultLoop(), &watcher, &info, service);
1058 INIT_LOGE("Failed to watch console device for service \' %s \'", service->name);
1064 int WatchConsoleDevice(Service *service)
1066 if (service == NULL) {
1086 if (AddFileDescriptorToWatcher(fd, service) < 0) {
1104 INIT_LOGE("Failed to get service name");
1107 Service *service = GetServiceByName(fieldStr);
1108 if (service == NULL) {
1109 service = AddService(fieldStr);
1110 if (service == NULL) {
1111 INIT_LOGE("Failed to add service name %s", fieldStr);
1122 service->context.type = context->type;
1124 int ret = ParseOneService(curItem, service);
1126 INIT_LOGE("Service error %s parse config error.", service->name);
1127 service->lastErrno = INIT_ECFG;
1130 ret = ParseServiceSocket(curItem, service);
1131 INIT_CHECK(ret == 0, FreeServiceSocket(service->socketCfg); service->socketCfg = NULL);
1132 ret = ParseServiceFile(curItem, service);
1133 INIT_CHECK(ret == 0, FreeServiceFile(service->fileCfg); service->fileCfg = NULL);
1134 // Watch "/dev/console" node for starting console service ondemand.
1135 if ((strcmp(service->name, "console") == 0) && IsOnDemandService(service)) {
1136 if (WatchConsoleDevice(service) < 0) {
1142 * Execute service parsing hooks
1147 ret = GetCmdLinesFromJson(cJSON_GetObjectItem(curItem, "onrestart"), &service->restartArg);
1148 INIT_CHECK(ret == SERVICE_SUCCESS, service->restartArg = NULL);
1155 Service *service = GetServiceByName(fullServName);
1156 if (service != NULL) { // none parameter in fullServName
1157 return service;
1164 INIT_LOGE("Service error %s start service bt ext parameter .", fullServName);
1168 INIT_LOGI("Service info %s start service bt ext parameter %s.", dstPtr[0], fullServName);
1169 service = GetServiceByName(dstPtr[0]);
1170 if (service == NULL) {
1174 extraArgs->count = service->pathArgs.count + returnCount - 1;
1179 for (argc = 0; argc < (service->pathArgs.count - 1); argc++) {
1180 extraArgs->argv[argc] = strdup(service->pathArgs.argv[argc]);
1192 return service;
1198 Service *service = GetServiceByName(servName);
1199 if (service == NULL) {
1200 service = GetServiceByExtServName(servName, &extraArgs);
1202 INIT_ERROR_CHECK(service != NULL, FreeStringVector(extraArgs.argv, extraArgs.count);
1203 return, "Cannot find service %s.", servName);
1205 ServiceArgs *pathArgs = &service->pathArgs;
1209 if (ServiceStart(service, pathArgs) != SERVICE_SUCCESS) {
1219 Service *service = GetServiceByName(servName);
1220 INIT_ERROR_CHECK(service != NULL, return, "Cannot find service %s.", servName);
1222 if (ServiceStop(service) != SERVICE_SUCCESS) {
1229 int (*filter)(const Service *service, const char **exclude, int size))
1231 Service *service = GetServiceByName("appspawn");
1232 if (service != NULL && service->pid > 0) { // notify appspawn stop
1234 kill(service->pid, SIGTERM);
1235 service->pid = -1;
1241 Service *service = node->data.service;
1242 if (service == NULL) {
1246 INIT_LOGI("StopAllServices stop service %s ", service->name);
1247 if (filter != NULL && filter(service, exclude, size) != 0) {
1251 service->attribute |= (flags & SERVICE_ATTR_INVALID);
1252 int ret = ServiceStop(service);
1254 INIT_LOGE("Service %s stop failed!", service->name);
1278 Service *service = node->data.service;
1279 if (service != NULL && service->pid == pid) {
1280 return service;
1292 return groupNode->data.service;
1312 Service *service = GetServiceByPid(pid);
1313 if (service != NULL) {
1315 service->servPerm.gIDArray, service->servPerm.gIDCnt * sizeof(gid_t));
1317 return service->servPerm.gIDCnt;