195857638SErik Schmauss // SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0 2e2b9035fSLv Zheng /****************************************************************************** 3e2b9035fSLv Zheng * 4e527db8fSColin Ian King * Module Name: cmfsize - Common get file size function 5e2b9035fSLv Zheng * 6*612c2932SBob Moore * Copyright (C) 2000 - 2023, Intel Corp. 7e2b9035fSLv Zheng * 895857638SErik Schmauss *****************************************************************************/ 9e2b9035fSLv Zheng 10e2b9035fSLv Zheng #include <acpi/acpi.h> 11e2b9035fSLv Zheng #include "accommon.h" 12e2b9035fSLv Zheng #include "acapps.h" 13e2b9035fSLv Zheng 14e2b9035fSLv Zheng #define _COMPONENT ACPI_TOOLS 15e2b9035fSLv Zheng ACPI_MODULE_NAME("cmfsize") 16e2b9035fSLv Zheng 17e2b9035fSLv Zheng /******************************************************************************* 18e2b9035fSLv Zheng * 19e2b9035fSLv Zheng * FUNCTION: cm_get_file_size 20e2b9035fSLv Zheng * 21e2b9035fSLv Zheng * PARAMETERS: file - Open file descriptor 22e2b9035fSLv Zheng * 23e2b9035fSLv Zheng * RETURN: File Size. On error, -1 (ACPI_UINT32_MAX) 24e2b9035fSLv Zheng * 25e2b9035fSLv Zheng * DESCRIPTION: Get the size of a file. Uses seek-to-EOF. File must be open. 263c9349c9SLv Zheng * Does not disturb the current file pointer. 27e2b9035fSLv Zheng * 28e2b9035fSLv Zheng ******************************************************************************/ cm_get_file_size(ACPI_FILE file)293c9349c9SLv Zhengu32 cm_get_file_size(ACPI_FILE file) 30e2b9035fSLv Zheng { 31e2b9035fSLv Zheng long file_size; 32e2b9035fSLv Zheng long current_offset; 333c9349c9SLv Zheng acpi_status status; 34e2b9035fSLv Zheng 35e2b9035fSLv Zheng /* Save the current file pointer, seek to EOF to obtain file size */ 36e2b9035fSLv Zheng 37dd99cbccSLv Zheng current_offset = ftell(file); 38e2b9035fSLv Zheng if (current_offset < 0) { 39e2b9035fSLv Zheng goto offset_error; 40e2b9035fSLv Zheng } 41e2b9035fSLv Zheng 42dd99cbccSLv Zheng status = fseek(file, 0, SEEK_END); 433c9349c9SLv Zheng if (ACPI_FAILURE(status)) { 44e2b9035fSLv Zheng goto seek_error; 45e2b9035fSLv Zheng } 46e2b9035fSLv Zheng 47dd99cbccSLv Zheng file_size = ftell(file); 48e2b9035fSLv Zheng if (file_size < 0) { 49e2b9035fSLv Zheng goto offset_error; 50e2b9035fSLv Zheng } 51e2b9035fSLv Zheng 52e2b9035fSLv Zheng /* Restore original file pointer */ 53e2b9035fSLv Zheng 54dd99cbccSLv Zheng status = fseek(file, current_offset, SEEK_SET); 553c9349c9SLv Zheng if (ACPI_FAILURE(status)) { 56e2b9035fSLv Zheng goto seek_error; 57e2b9035fSLv Zheng } 58e2b9035fSLv Zheng 59e2b9035fSLv Zheng return ((u32)file_size); 60e2b9035fSLv Zheng 61e2b9035fSLv Zheng offset_error: 62dd99cbccSLv Zheng fprintf(stderr, "Could not get file offset\n"); 63e2b9035fSLv Zheng return (ACPI_UINT32_MAX); 64e2b9035fSLv Zheng 65e2b9035fSLv Zheng seek_error: 66dd99cbccSLv Zheng fprintf(stderr, "Could not set file offset\n"); 67e2b9035fSLv Zheng return (ACPI_UINT32_MAX); 68e2b9035fSLv Zheng } 69