提交 d6793472 编写于 作者: X xionglei6

init: fix service control extra bugs

Signed-off-by: Nxionglei6 <xionglei6@huawei.com>
上级 c4bb8408
......@@ -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
......
......@@ -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;
}
......
......@@ -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.");
......
......@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册