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