162306a36Sopenharmony_ci// SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0
262306a36Sopenharmony_ci/******************************************************************************
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Module Name: cmfsize - Common get file size function
562306a36Sopenharmony_ci *
662306a36Sopenharmony_ci * Copyright (C) 2000 - 2023, Intel Corp.
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci *****************************************************************************/
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <acpi/acpi.h>
1162306a36Sopenharmony_ci#include "accommon.h"
1262306a36Sopenharmony_ci#include "acapps.h"
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#define _COMPONENT          ACPI_TOOLS
1562306a36Sopenharmony_ciACPI_MODULE_NAME("cmfsize")
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci/*******************************************************************************
1862306a36Sopenharmony_ci *
1962306a36Sopenharmony_ci * FUNCTION:    cm_get_file_size
2062306a36Sopenharmony_ci *
2162306a36Sopenharmony_ci * PARAMETERS:  file                    - Open file descriptor
2262306a36Sopenharmony_ci *
2362306a36Sopenharmony_ci * RETURN:      File Size. On error, -1 (ACPI_UINT32_MAX)
2462306a36Sopenharmony_ci *
2562306a36Sopenharmony_ci * DESCRIPTION: Get the size of a file. Uses seek-to-EOF. File must be open.
2662306a36Sopenharmony_ci *              Does not disturb the current file pointer.
2762306a36Sopenharmony_ci *
2862306a36Sopenharmony_ci ******************************************************************************/
2962306a36Sopenharmony_ciu32 cm_get_file_size(ACPI_FILE file)
3062306a36Sopenharmony_ci{
3162306a36Sopenharmony_ci	long file_size;
3262306a36Sopenharmony_ci	long current_offset;
3362306a36Sopenharmony_ci	acpi_status status;
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	/* Save the current file pointer, seek to EOF to obtain file size */
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	current_offset = ftell(file);
3862306a36Sopenharmony_ci	if (current_offset < 0) {
3962306a36Sopenharmony_ci		goto offset_error;
4062306a36Sopenharmony_ci	}
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ci	status = fseek(file, 0, SEEK_END);
4362306a36Sopenharmony_ci	if (ACPI_FAILURE(status)) {
4462306a36Sopenharmony_ci		goto seek_error;
4562306a36Sopenharmony_ci	}
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci	file_size = ftell(file);
4862306a36Sopenharmony_ci	if (file_size < 0) {
4962306a36Sopenharmony_ci		goto offset_error;
5062306a36Sopenharmony_ci	}
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci	/* Restore original file pointer */
5362306a36Sopenharmony_ci
5462306a36Sopenharmony_ci	status = fseek(file, current_offset, SEEK_SET);
5562306a36Sopenharmony_ci	if (ACPI_FAILURE(status)) {
5662306a36Sopenharmony_ci		goto seek_error;
5762306a36Sopenharmony_ci	}
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	return ((u32)file_size);
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cioffset_error:
6262306a36Sopenharmony_ci	fprintf(stderr, "Could not get file offset\n");
6362306a36Sopenharmony_ci	return (ACPI_UINT32_MAX);
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ciseek_error:
6662306a36Sopenharmony_ci	fprintf(stderr, "Could not set file offset\n");
6762306a36Sopenharmony_ci	return (ACPI_UINT32_MAX);
6862306a36Sopenharmony_ci}
69