diff --git a/src/runtime/isula/isula_rt_ops.c b/src/runtime/isula/isula_rt_ops.c index 481b5136a365adccd779207c834f9f82373a4b6c..c7300d6f7342cdf30caebe35adeb4fefb61c5975 100644 --- a/src/runtime/isula/isula_rt_ops.c +++ b/src/runtime/isula/isula_rt_ops.c @@ -89,63 +89,71 @@ static void file_read_int(const char *fname, int *val) free(sint); } -static char *get_err_message(const char *workdir, const char *file) +static void get_err_message(char *buf, int buf_size, const char *workdir, const char *file) { char fname[PATH_MAX] = {0}; FILE *fp = NULL; char *pline = NULL; + char *lines[3] = {0}; size_t length = 0; if (snprintf(fname, sizeof(fname), "%s/%s", workdir, file) < 0) { ERROR("failed make full path %s/%s", workdir, file); - return NULL; + return; } fp = util_fopen(fname, "r"); if (fp == NULL) { - return NULL; + return; } while (getline(&pline, &length, fp) != -1) { if (pline == NULL) { - return NULL; + break; } if (strings_contains_word(pline, "error")) { - return pline; + if (lines[0] == NULL) { + lines[0] = pline; + pline = NULL; + continue; + } + if (lines[1] == NULL) { + lines[1] = pline; + pline = NULL; + continue; + } + if (lines[2] == NULL) { + lines[2] = pline; + pline = NULL; + break; + } } } - if (pline != NULL) { - free(pline); + if (lines[2] != NULL) { + (void)snprintf(buf, buf_size, "%s%s%s", lines[0], lines[1], lines[2]); + } else if (lines[1] != NULL) { + (void)snprintf(buf, buf_size, "%s%s", lines[0], lines[1]); + } else if (lines[0] != NULL) { + (void)snprintf(buf, buf_size, "%s", lines[0]); } - return NULL; + + UTIL_FREE_AND_SET_NULL(pline); + UTIL_FREE_AND_SET_NULL(lines[0]); + UTIL_FREE_AND_SET_NULL(lines[1]); + UTIL_FREE_AND_SET_NULL(lines[2]); } static void show_shim_runtime_errlog(const char *workdir) { char buf[BUFSIZ] = {0}; - char *log1 = NULL; - char *log2 = NULL; - - log1 = get_err_message(workdir, "shim-log.json"); - if (log1 != NULL) { - ERROR("shim-log error %s", log1); - } else { - log1 = util_strdup_s("NULL"); - } + char buf1[BUFSIZ/2] = {0}; + char buf2[BUFSIZ/2] = {0}; - log2 = get_err_message(workdir, "log.json"); - if (log2 != NULL) { - ERROR("runtime-log error %s", log2); - } else { - log2 = util_strdup_s("NULL"); - } - - (void)snprintf(buf, sizeof(buf), "shim-log error: %s\nruntime-log error: %s\n", log1, log2); + get_err_message(buf1, BUFSIZ/2, workdir, "shim-log.json"); + get_err_message(buf2, BUFSIZ/2, workdir, "log.json"); + (void)snprintf(buf, sizeof(buf), "shim-log error: %s\nruntime-log error: %s\n", buf1, buf2); isulad_set_error_message(buf); - - UTIL_FREE_AND_SET_NULL(log1); - UTIL_FREE_AND_SET_NULL(log2); } bool rt_isula_detect(const char *runtime)