xref: /openbmc/linux/tools/power/acpi/common/cmfsize.c (revision 612c2932)
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 Zheng u32 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