diff --git a/services/init/include/init_service.h b/services/init/include/init_service.h index d3adb2be518066feb2a32e3cc44795c70e2c630b..ef19acf86b7556e52b04776793922bf844feca73 100755 --- a/services/init/include/init_service.h +++ b/services/init/include/init_service.h @@ -101,7 +101,7 @@ void NotifyServiceChange(const char *serviceName, const char *change); int IsForbidden(const char *fieldStr); int SetImportantValue(Service *curServ, const char *attrName, int value, int flag); int GetServiceCaps(const cJSON *curArrItem, Service *curServ); -int ServiceExec(Service *service); +int ServiceExec(const Service *service); #ifdef __cplusplus #if __cplusplus diff --git a/services/init/init_service_manager.c b/services/init/init_service_manager.c index 5475543532606385b014918c1a1707d616995054..cfac8fe81561cad7f41c67f8b4386862a402616f 100755 --- a/services/init/init_service_manager.c +++ b/services/init/init_service_manager.c @@ -680,6 +680,9 @@ void StartServiceByName(const char *servName, bool checkDynamic) if (ServiceStart(service) != SERVICE_SUCCESS) { INIT_LOGE("Service %s start failed!", servName); } + FreeStringVector(service->extraArgs.argv, service->extraArgs.count); + service->extraArgs.argv = NULL; + service->extraArgs.count = 0; return; } @@ -729,13 +732,19 @@ static int SetServiceExtraArgs(Service *service, const char *fullServName) char **extArgv = SplitStringExt(tmpServName, "|", &returnCount, MAX_PATH_ARGS_CNT); free(tmpServName); INIT_ERROR_CHECK(extArgv != NULL && returnCount > 0, return -1, "Split servName: %s failed", fullServName); - service->extraArgs.count = returnCount - 1; + service->extraArgs.count = service->pathArgs.count + returnCount - 1; service->extraArgs.argv = (char **)calloc(service->extraArgs.count, sizeof(char *)); INIT_ERROR_CHECK(service->extraArgs.argv != NULL, FreeStringVector(extArgv, returnCount); return -1, "Failed calloc err=%d", errno); - for (int i = 0; i < service->extraArgs.count; i++) { - service->extraArgs.argv[i] = strdup(extArgv[i + 1]); + int argc; + for (argc = 0; argc < (service->pathArgs.count - 1); argc++) { + service->extraArgs.argv[argc] = strdup(service->pathArgs.argv[argc]); } + int extArgc; + for (extArgc = 0; extArgc < (returnCount - 1); extArgc++) { + service->extraArgs.argv[extArgc + argc] = strdup(extArgv[extArgc + 1]); + } + service->extraArgs.argv[service->extraArgs.count] = NULL; FreeStringVector(extArgv, returnCount); return 0; } diff --git a/services/init/lite/init_service.c b/services/init/lite/init_service.c index 4a7f0c9d3bf0f36280067bd8778f0c2abe6223c4..cc53ef5c9a3df72ff4a986633fcb0d94a51acea5 100755 --- a/services/init/lite/init_service.c +++ b/services/init/lite/init_service.c @@ -62,7 +62,7 @@ int SetImportantValue(Service *service, const char *attrName, int value, int fla return SERVICE_SUCCESS; } -int ServiceExec(Service *service) +int ServiceExec(const Service *service) { INIT_ERROR_CHECK(service != NULL && service->pathArgs.count > 0, return SERVICE_FAILURE, "Exec service failed! null ptr."); diff --git a/services/init/standard/init_service.c b/services/init/standard/init_service.c index ca19d63785379c341642ea0073c97e150515e89f..d93ddf98f5681f2b774b7c11e284518ca431ab28 100755 --- a/services/init/standard/init_service.c +++ b/services/init/standard/init_service.c @@ -57,7 +57,7 @@ int SetImportantValue(Service *service, const char *attrName, int value, int fla return SERVICE_SUCCESS; } -int ServiceExec(Service *service) +int ServiceExec(const Service *service) { INIT_ERROR_CHECK(service != NULL && service->pathArgs.count > 0, return SERVICE_FAILURE, "Exec service failed! null ptr."); @@ -70,25 +70,8 @@ int ServiceExec(Service *service) INIT_CHECK_ONLY_ELOG(unsetenv("UV_THREADPOOL_SIZE") == 0, "set UV_THREADPOOL_SIZE error : %d.", errno); // L2 Can not be reset env if (service->extraArgs.argv != NULL && service->extraArgs.count > 0) { - char **argv = (char **)calloc(service->pathArgs.count + service->extraArgs.count, sizeof(char *)); - INIT_ERROR_CHECK(argv != NULL, FreeStringVector(service->extraArgs.argv, service->extraArgs.count); - return SERVICE_FAILURE, "Failed calloc argv"); - int tArgc = service->pathArgs.count + service->extraArgs.count; - int argc = 0; - for (argc = 0; argc < service->pathArgs.count - 1; argc++) { - argv[argc] = strdup(service->pathArgs.argv[argc]); - } - int eArgc = 0; - for (eArgc = 0; eArgc < service->extraArgs.count; eArgc++) { - argv[argc + eArgc] = strdup(service->extraArgs.argv[eArgc]); - } - argv[tArgc] = NULL; - INIT_CHECK_ONLY_ELOG(execv(argv[0], argv) == 0, + INIT_CHECK_ONLY_ELOG(execv(service->extraArgs.argv[0], service->extraArgs.argv) == 0, "service %s execve failed! err %d.", service->name, errno); - FreeStringVector(argv, tArgc); - FreeStringVector(service->extraArgs.argv, service->extraArgs.count); - service->extraArgs.argv = NULL; - service->extraArgs.count = 0; } else { INIT_CHECK_ONLY_ELOG(execv(service->pathArgs.argv[0], service->pathArgs.argv) == 0, "service %s execve failed! err %d.", service->name, errno);