/* Copyright 2022 The ChromiumOS Authors * Use of this source code is governed by a BSD-style license that can be * found in the LICENSE file. */ #include "2common.h" #include "2return_codes.h" #include "subprocess.h" #include "cbfstool.h" static const char *get_cbfstool_path(void) { static const char *cbfstool = NULL; if (cbfstool) return cbfstool; const char *env_cbfstool = getenv(ENV_CBFSTOOL); if (env_cbfstool && env_cbfstool[0] != '\0') { cbfstool = strdup(env_cbfstool); return cbfstool; } cbfstool = DEFAULT_CBFSTOOL; return cbfstool; } vb2_error_t cbfstool_truncate(const char *file, const char *region, size_t *new_size) { int status; char output_buffer[128]; const char *cbfstool = get_cbfstool_path(); struct subprocess_target output = { .type = TARGET_BUFFER_NULL_TERMINATED, .buffer = { .buf = output_buffer, .size = sizeof(output_buffer), }, }; const char *const argv[] = { cbfstool, file, "truncate", "-r", region, NULL, }; status = subprocess_run(argv, &subprocess_null, &output, &subprocess_null); if (status < 0) { fprintf(stderr, "%s(): cbfstool invocation failed: %m\n", __func__); exit(1); } /* Positive exit code means something is wrong with image. Return zero as new size, because it might be problem with missing CBFS.*/ if (status > 0) { *new_size = 0; return VB2_ERROR_CBFSTOOL; } if (sscanf(output_buffer, "%zi", new_size) != 1) { VB2_DEBUG("Failed to parse command output. Unexpected " "output.\n"); *new_size = 0; return VB2_ERROR_CBFSTOOL; } return VB2_SUCCESS; }