1263851Sjkim/****************************************************************************** 2263851Sjkim * 3263851Sjkim * Module Name: cfsize - Common get file size function 4263851Sjkim * 5263851Sjkim *****************************************************************************/ 6263851Sjkim 7263851Sjkim/* 8306536Sjkim * Copyright (C) 2000 - 2016, Intel Corp. 9263851Sjkim * All rights reserved. 10263851Sjkim * 11263851Sjkim * Redistribution and use in source and binary forms, with or without 12263851Sjkim * modification, are permitted provided that the following conditions 13263851Sjkim * are met: 14263851Sjkim * 1. Redistributions of source code must retain the above copyright 15263851Sjkim * notice, this list of conditions, and the following disclaimer, 16263851Sjkim * without modification. 17263851Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18263851Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 19263851Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 20263851Sjkim * including a substantially similar Disclaimer requirement for further 21263851Sjkim * binary redistribution. 22263851Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 23263851Sjkim * of any contributors may be used to endorse or promote products derived 24263851Sjkim * from this software without specific prior written permission. 25263851Sjkim * 26263851Sjkim * Alternatively, this software may be distributed under the terms of the 27263851Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 28263851Sjkim * Software Foundation. 29263851Sjkim * 30263851Sjkim * NO WARRANTY 31263851Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32263851Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33263851Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34263851Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35263851Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36263851Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37263851Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38263851Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39263851Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40263851Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41263851Sjkim * POSSIBILITY OF SUCH DAMAGES. 42263851Sjkim */ 43263851Sjkim 44272444Sjkim#include <contrib/dev/acpica/include/acpi.h> 45272444Sjkim#include <contrib/dev/acpica/include/accommon.h> 46272444Sjkim#include <contrib/dev/acpica/include/acapps.h> 47263851Sjkim#include <stdio.h> 48263851Sjkim 49263851Sjkim#define _COMPONENT ACPI_TOOLS 50263851Sjkim ACPI_MODULE_NAME ("cmfsize") 51263851Sjkim 52263851Sjkim 53263851Sjkim/******************************************************************************* 54263851Sjkim * 55263851Sjkim * FUNCTION: CmGetFileSize 56263851Sjkim * 57263851Sjkim * PARAMETERS: File - Open file descriptor 58263851Sjkim * 59263851Sjkim * RETURN: File Size. On error, -1 (ACPI_UINT32_MAX) 60263851Sjkim * 61263851Sjkim * DESCRIPTION: Get the size of a file. Uses seek-to-EOF. File must be open. 62272444Sjkim * Does not disturb the current file pointer. 63263851Sjkim * 64263851Sjkim ******************************************************************************/ 65263851Sjkim 66263851SjkimUINT32 67263851SjkimCmGetFileSize ( 68272444Sjkim ACPI_FILE File) 69263851Sjkim{ 70263851Sjkim long FileSize; 71263851Sjkim long CurrentOffset; 72272444Sjkim ACPI_STATUS Status; 73263851Sjkim 74263851Sjkim 75263851Sjkim /* Save the current file pointer, seek to EOF to obtain file size */ 76263851Sjkim 77272444Sjkim CurrentOffset = AcpiOsGetFileOffset (File); 78263851Sjkim if (CurrentOffset < 0) 79263851Sjkim { 80263851Sjkim goto OffsetError; 81263851Sjkim } 82263851Sjkim 83272444Sjkim Status = AcpiOsSetFileOffset (File, 0, ACPI_FILE_END); 84272444Sjkim if (ACPI_FAILURE (Status)) 85263851Sjkim { 86263851Sjkim goto SeekError; 87263851Sjkim } 88263851Sjkim 89272444Sjkim FileSize = AcpiOsGetFileOffset (File); 90263851Sjkim if (FileSize < 0) 91263851Sjkim { 92263851Sjkim goto OffsetError; 93263851Sjkim } 94263851Sjkim 95263851Sjkim /* Restore original file pointer */ 96263851Sjkim 97272444Sjkim Status = AcpiOsSetFileOffset (File, CurrentOffset, ACPI_FILE_BEGIN); 98272444Sjkim if (ACPI_FAILURE (Status)) 99263851Sjkim { 100263851Sjkim goto SeekError; 101263851Sjkim } 102263851Sjkim 103263851Sjkim return ((UINT32) FileSize); 104263851Sjkim 105263851Sjkim 106263851SjkimOffsetError: 107272444Sjkim AcpiLogError ("Could not get file offset"); 108263851Sjkim return (ACPI_UINT32_MAX); 109263851Sjkim 110263851SjkimSeekError: 111272444Sjkim AcpiLogError ("Could not set file offset"); 112263851Sjkim return (ACPI_UINT32_MAX); 113263851Sjkim} 114