Match-id-58ded49300187904b332c0e336002c8cc6bd1dbf

This commit is contained in:
BianTanggui
2020-06-11 10:40:04 +08:00
parent 9518551aa9
commit 5002aebf9a

View File

@@ -14,7 +14,13 @@
#define CMD_INDEX 1
#define FINAL_FILE_INDEX 2
#define TEMP_FILE_INDEX 3
#define PATH_VALUE "/usr/local/bin/ascend-docker-runtime"
#define ASCEND_RUNTIME_PATH_VALUE "/usr/local/bin/ascend-docker-runtime"
#define ASCEND_RUNTIME_PATH_KEY "path"
#define ASCEND_RUNTIME_ARGS_KEY "runtimeArgs"
#define RUNTIME_KEY "runtimes"
#define ASCEND_RUNTIME_NAME "ascend"
#define DEFALUT_KEY "default-runtime"
#define DEFAULT_VALUE "ascend"
void ReadJsonFile(const FILE *pf, char *text, int maxBufferSize)
{
@@ -31,80 +37,200 @@ void ReadJsonFile(const FILE *pf, char *text, int maxBufferSize)
text[size] = '\0';
}
int CreateNode(cJSON *runtimes)
{
cJSON *node = cJSON_GetObjectItem(runtimes, "ascend");
if (node != NULL) {
return 0;
}
cJSON *newItem = NULL;
newItem = cJSON_CreateObject();
if (newItem == NULL) {
return -1;
}
cJSON_AddItemToObject(runtimes, "ascend", newItem);
cJSON *paraArray = NULL;
paraArray = cJSON_CreateArray();
if (paraArray == NULL) {
return -1;
}
cJSON_AddItemToObject(newItem, "path", cJSON_CreateString(PATH_VALUE));
cJSON_AddItemToObject(newItem, "runtimeArgs", paraArray);
return 0;
}
int CreateRuntimes(cJSON *root)
{
cJSON *runtimes = cJSON_CreateObject();
if (runtimes == NULL) {
return -1;
}
cJSON_AddItemToObject(root, "runtimes", runtimes);
return CreateNode(runtimes);
}
cJSON *CreateContent()
cJSON *CreateAscendRuntimeInfo()
{
cJSON *root = NULL;
root = cJSON_CreateObject();
if (root == NULL) {
fprintf(stderr, "create ascend runtime info root err\n");
return NULL;
}
int ret = CreateRuntimes(root);
if (ret != 0) {
cJSON *newString = NULL;
newString = cJSON_CreateString(ASCEND_RUNTIME_PATH_VALUE);
if (newString == NULL) {
fprintf(stderr, "create ascend runtime info path value err\n");
cJSON_Delete(root);
return NULL;
}
cJSON *paraArray = NULL;
paraArray = cJSON_CreateArray();
if (paraArray == NULL) {
fprintf(stderr, "create ascend runtime info args err\n");
cJSON_Delete(root);
cJSON_Delete(newString);
return NULL;
}
cJSON_AddItemToObject(root, ASCEND_RUNTIME_PATH_KEY, newString);
cJSON_AddItemToObject(root, ASCEND_RUNTIME_ARGS_KEY, paraArray);
return root;
}
cJSON *CreateRuntimes()
{
cJSON *ascendRuntime = NULL;
ascendRuntime = CreateAscendRuntimeInfo();
if (ascendRuntime == NULL) {
fprintf(stderr, "create ascendruntime err\n");
return NULL;
}
cJSON *runtimes = NULL;
runtimes = cJSON_CreateObject();
if (runtimes == NULL) {
fprintf(stderr, "create runtimes err\n");
cJSON_Delete(ascendRuntime);
return NULL;
}
cJSON_AddItemToObject(runtimes, ASCEND_RUNTIME_NAME, ascendRuntime);
return runtimes;
}
int DelJsonContent(cJSON *root, const char *key)
{
cJSON *existItem = NULL;
existItem = cJSON_GetObjectItem(root, key);
if (existItem == NULL) {
return 0;
}
cJSON *removedItem = NULL;
removedItem = cJSON_DetachItemViaPointer(root, existItem);
if (removedItem == NULL) {
fprintf(stderr, "remove %s failed\n", key);
return -1;
}
cJSON_Delete(removedItem);
return 0;
}
cJSON *CreateContent()
{
/* 插入ascend runtime */
cJSON *runtimes = NULL;
runtimes = CreateRuntimes();
if (runtimes == NULL) {
fprintf(stderr, "create runtimes err\n");
return NULL;
}
cJSON *defaultRuntime = NULL;
defaultRuntime = cJSON_CreateString(DEFAULT_VALUE);
if (defaultRuntime == NULL) {
cJSON_Delete(runtimes);
return NULL;
}
cJSON *root = NULL;
root = cJSON_CreateObject();
if (root == NULL) {
/* ascendRuntime已经挂载到runtimes上了再释放会coredump */
fprintf(stderr, "create root err\n");
cJSON_Delete(runtimes);
cJSON_Delete(defaultRuntime);
return NULL;
}
cJSON_AddItemToObject(root, RUNTIME_KEY, runtimes);
cJSON_AddItemToObject(root, DEFALUT_KEY, defaultRuntime);
return root;
}
cJSON *ModifyContent(const FILE *pf)
{
char jsonStr[MAX_JSON_FILE_SIZE] = {0x0};
ReadJsonFile(pf, &jsonStr[0], MAX_JSON_FILE_SIZE);
cJSON *root = NULL;
root = cJSON_Parse(jsonStr);
if (root == NULL) {
fprintf(stderr, "Error before: [%s]\n", cJSON_GetErrorPtr());
return NULL;
}
/* 插入ascend runtime */
cJSON *runtimes = NULL;
runtimes = cJSON_GetObjectItem(root, "runtimes");
if (runtimes == NULL) {
runtimes = CreateRuntimes();
if (runtimes == NULL) {
cJSON_Delete(root);
return NULL;
}
cJSON_AddItemToObject(root, RUNTIME_KEY, runtimes);
} else {
int ret = DelJsonContent(runtimes, ASCEND_RUNTIME_NAME);
if (ret != 0) {
cJSON_Delete(root);
return NULL;
}
cJSON *ascendRuntime = NULL;
ascendRuntime = CreateAscendRuntimeInfo();
if (ascendRuntime == NULL) {
cJSON_Delete(root);
return NULL;
}
cJSON_AddItemToObject(runtimes, ASCEND_RUNTIME_NAME, ascendRuntime);
}
/* 插入defaul runtime */
int ret = DelJsonContent(root, DEFALUT_KEY);
if (ret != 0) {
cJSON_Delete(root);
return NULL;
}
cJSON *defaultRuntime = cJSON_CreateString(DEFAULT_VALUE);
if (defaultRuntime == NULL) {
cJSON_Delete(root);
return NULL;
}
cJSON_AddItemToObject(root, DEFALUT_KEY, defaultRuntime);
return root;
}
cJSON *InsertContent(const FILE *pf)
cJSON *RemoveContent(const FILE *pf)
{
char jsonStr[MAX_JSON_FILE_SIZE] = {0x0};
ReadJsonFile(pf, &jsonStr[0], MAX_JSON_FILE_SIZE);
cJSON *root = NULL;
root = cJSON_Parse(jsonStr);
if (!root) {
if (root == NULL) {
fprintf(stderr, "Error before: [%s]\n", cJSON_GetErrorPtr());
return NULL;
}
cJSON *runtimes = NULL;
runtimes = cJSON_GetObjectItem(root, "runtimes");
int ret;
if (runtimes == NULL) {
ret = CreateRuntimes(root);
} else {
ret = CreateNode(runtimes);
}
/* 去除default runtimes */
int ret = DelJsonContent(root, DEFALUT_KEY);
if (ret != 0) {
cJSON_Delete(root);
return NULL;
}
/* 去除runtimes */
cJSON *runtimes = NULL;
runtimes = cJSON_GetObjectItem(root, RUNTIME_KEY);
if (runtimes == NULL) {
fprintf(stderr, "no runtime key found\n");
cJSON_Delete(root);
return NULL;
}
ret = DelJsonContent(runtimes, DEFAULT_VALUE);
if (ret != 0) {
cJSON_Delete(root);
return NULL;
}
return root;
}
@@ -117,7 +243,7 @@ int DetectAndCreateJsonFile(const char *filePath, const char *tempPath)
if (pf == NULL) {
root = CreateContent();
} else {
root = InsertContent(pf);
root = ModifyContent(pf);
fclose(pf);
}
@@ -140,46 +266,6 @@ int DetectAndCreateJsonFile(const char *filePath, const char *tempPath)
return 0;
}
cJSON *GetNewContent(const FILE *pf)
{
char jsonStr[MAX_JSON_FILE_SIZE] = {0x0};
ReadJsonFile(pf, &jsonStr[0], MAX_JSON_FILE_SIZE);
cJSON *root = NULL;
root = cJSON_Parse(jsonStr);
if (!root) {
fprintf(stderr, "Error before: [%s]\n", cJSON_GetErrorPtr());
return NULL;
}
cJSON *runtimes = NULL;
runtimes = cJSON_GetObjectItem(root, "runtimes");
if (runtimes == NULL) {
fprintf(stderr, "no runtime key found\n");
cJSON_Delete(root);
return NULL;
}
cJSON *ascend = NULL;
ascend = cJSON_GetObjectItem(runtimes, "ascend");
if (ascend == NULL) {
fprintf(stderr, "no ascend key found\n");
cJSON_Delete(root);
return NULL;
}
cJSON *removedItem = NULL;
removedItem = cJSON_DetachItemViaPointer(runtimes, ascend);
if (removedItem == NULL) {
fprintf(stderr, "remove runtime failed\n");
cJSON_Delete(root);
return NULL;
}
cJSON_Delete(removedItem);
return root;
}
int CreateRevisedJsonFile(const char *filePath, const char *tempPath)
{
FILE *pf = NULL;
@@ -189,7 +275,7 @@ int CreateRevisedJsonFile(const char *filePath, const char *tempPath)
return -1;
}
cJSON *newContent = NULL;
newContent = GetNewContent(pf);
newContent = RemoveContent(pf);
fclose(pf);
if (newContent == NULL) {
@@ -224,6 +310,5 @@ int main(int argc, char *argv[])
if (strcmp(argv[CMD_INDEX], ADD_CMD) == 0) {
return DetectAndCreateJsonFile(argv[FINAL_FILE_INDEX], argv[TEMP_FILE_INDEX]);
}
return CreateRevisedJsonFile(argv[FINAL_FILE_INDEX], argv[TEMP_FILE_INDEX]);
}
return CreateRevisedJsonFile(argv[FINAL_FILE_INDEX], argv[TEMP_FILE_INDEX]);
}