1efcc2a30SJung-uk Kim /****************************************************************************** 2efcc2a30SJung-uk Kim * 3efcc2a30SJung-uk Kim * Module Name: aslfileio - File I/O support 4efcc2a30SJung-uk Kim * 5efcc2a30SJung-uk Kim *****************************************************************************/ 6efcc2a30SJung-uk Kim 7efcc2a30SJung-uk Kim /* 8*313a0c13SJung-uk Kim * Copyright (C) 2000 - 2014, Intel Corp. 9efcc2a30SJung-uk Kim * All rights reserved. 10efcc2a30SJung-uk Kim * 11efcc2a30SJung-uk Kim * Redistribution and use in source and binary forms, with or without 12efcc2a30SJung-uk Kim * modification, are permitted provided that the following conditions 13efcc2a30SJung-uk Kim * are met: 14efcc2a30SJung-uk Kim * 1. Redistributions of source code must retain the above copyright 15efcc2a30SJung-uk Kim * notice, this list of conditions, and the following disclaimer, 16efcc2a30SJung-uk Kim * without modification. 17efcc2a30SJung-uk Kim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18efcc2a30SJung-uk Kim * substantially similar to the "NO WARRANTY" disclaimer below 19efcc2a30SJung-uk Kim * ("Disclaimer") and any redistribution must be conditioned upon 20efcc2a30SJung-uk Kim * including a substantially similar Disclaimer requirement for further 21efcc2a30SJung-uk Kim * binary redistribution. 22efcc2a30SJung-uk Kim * 3. Neither the names of the above-listed copyright holders nor the names 23efcc2a30SJung-uk Kim * of any contributors may be used to endorse or promote products derived 24efcc2a30SJung-uk Kim * from this software without specific prior written permission. 25efcc2a30SJung-uk Kim * 26efcc2a30SJung-uk Kim * Alternatively, this software may be distributed under the terms of the 27efcc2a30SJung-uk Kim * GNU General Public License ("GPL") version 2 as published by the Free 28efcc2a30SJung-uk Kim * Software Foundation. 29efcc2a30SJung-uk Kim * 30efcc2a30SJung-uk Kim * NO WARRANTY 31efcc2a30SJung-uk Kim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32efcc2a30SJung-uk Kim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33efcc2a30SJung-uk Kim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34efcc2a30SJung-uk Kim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35efcc2a30SJung-uk Kim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36efcc2a30SJung-uk Kim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37efcc2a30SJung-uk Kim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38efcc2a30SJung-uk Kim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39efcc2a30SJung-uk Kim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40efcc2a30SJung-uk Kim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41efcc2a30SJung-uk Kim * POSSIBILITY OF SUCH DAMAGES. 42efcc2a30SJung-uk Kim */ 43efcc2a30SJung-uk Kim 44efcc2a30SJung-uk Kim #include <contrib/dev/acpica/compiler/aslcompiler.h> 45*313a0c13SJung-uk Kim #include <contrib/dev/acpica/include/acapps.h> 46efcc2a30SJung-uk Kim 47efcc2a30SJung-uk Kim #define _COMPONENT ACPI_COMPILER 48efcc2a30SJung-uk Kim ACPI_MODULE_NAME ("aslfileio") 49efcc2a30SJung-uk Kim 50efcc2a30SJung-uk Kim 51efcc2a30SJung-uk Kim /******************************************************************************* 52efcc2a30SJung-uk Kim * 53efcc2a30SJung-uk Kim * FUNCTION: FlFileError 54efcc2a30SJung-uk Kim * 55efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 56efcc2a30SJung-uk Kim * ErrorId - Index into error message array 57efcc2a30SJung-uk Kim * 58efcc2a30SJung-uk Kim * RETURN: None 59efcc2a30SJung-uk Kim * 60efcc2a30SJung-uk Kim * DESCRIPTION: Decode errno to an error message and add the entire error 61efcc2a30SJung-uk Kim * to the error log. 62efcc2a30SJung-uk Kim * 63efcc2a30SJung-uk Kim ******************************************************************************/ 64efcc2a30SJung-uk Kim 65efcc2a30SJung-uk Kim void 66efcc2a30SJung-uk Kim FlFileError ( 67efcc2a30SJung-uk Kim UINT32 FileId, 68efcc2a30SJung-uk Kim UINT8 ErrorId) 69efcc2a30SJung-uk Kim { 70efcc2a30SJung-uk Kim 71efcc2a30SJung-uk Kim sprintf (MsgBuffer, "\"%s\" (%s)", Gbl_Files[FileId].Filename, 72efcc2a30SJung-uk Kim strerror (errno)); 73efcc2a30SJung-uk Kim AslCommonError (ASL_ERROR, ErrorId, 0, 0, 0, 0, NULL, MsgBuffer); 74efcc2a30SJung-uk Kim } 75efcc2a30SJung-uk Kim 76efcc2a30SJung-uk Kim 77efcc2a30SJung-uk Kim /******************************************************************************* 78efcc2a30SJung-uk Kim * 79efcc2a30SJung-uk Kim * FUNCTION: FlOpenFile 80efcc2a30SJung-uk Kim * 81efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 82efcc2a30SJung-uk Kim * Filename - file pathname to open 83efcc2a30SJung-uk Kim * Mode - Open mode for fopen 84efcc2a30SJung-uk Kim * 85efcc2a30SJung-uk Kim * RETURN: None 86efcc2a30SJung-uk Kim * 87efcc2a30SJung-uk Kim * DESCRIPTION: Open a file. 88efcc2a30SJung-uk Kim * NOTE: Aborts compiler on any error. 89efcc2a30SJung-uk Kim * 90efcc2a30SJung-uk Kim ******************************************************************************/ 91efcc2a30SJung-uk Kim 92efcc2a30SJung-uk Kim void 93efcc2a30SJung-uk Kim FlOpenFile ( 94efcc2a30SJung-uk Kim UINT32 FileId, 95efcc2a30SJung-uk Kim char *Filename, 96efcc2a30SJung-uk Kim char *Mode) 97efcc2a30SJung-uk Kim { 98efcc2a30SJung-uk Kim FILE *File; 99efcc2a30SJung-uk Kim 100efcc2a30SJung-uk Kim 101efcc2a30SJung-uk Kim File = fopen (Filename, Mode); 102efcc2a30SJung-uk Kim if (!File) 103efcc2a30SJung-uk Kim { 104efcc2a30SJung-uk Kim FlFileError (FileId, ASL_MSG_OPEN); 105efcc2a30SJung-uk Kim AslAbort (); 106efcc2a30SJung-uk Kim } 107efcc2a30SJung-uk Kim 108efcc2a30SJung-uk Kim Gbl_Files[FileId].Filename = Filename; 109efcc2a30SJung-uk Kim Gbl_Files[FileId].Handle = File; 110efcc2a30SJung-uk Kim } 111efcc2a30SJung-uk Kim 112efcc2a30SJung-uk Kim 113efcc2a30SJung-uk Kim /******************************************************************************* 114efcc2a30SJung-uk Kim * 115efcc2a30SJung-uk Kim * FUNCTION: FlGetFileSize 116efcc2a30SJung-uk Kim * 117efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 118efcc2a30SJung-uk Kim * 119efcc2a30SJung-uk Kim * RETURN: File Size 120efcc2a30SJung-uk Kim * 121*313a0c13SJung-uk Kim * DESCRIPTION: Get current file size. Uses common seek-to-EOF function. 122*313a0c13SJung-uk Kim * File must be open. Aborts compiler on error. 123efcc2a30SJung-uk Kim * 124efcc2a30SJung-uk Kim ******************************************************************************/ 125efcc2a30SJung-uk Kim 126efcc2a30SJung-uk Kim UINT32 127efcc2a30SJung-uk Kim FlGetFileSize ( 128efcc2a30SJung-uk Kim UINT32 FileId) 129efcc2a30SJung-uk Kim { 130efcc2a30SJung-uk Kim UINT32 FileSize; 131efcc2a30SJung-uk Kim 132efcc2a30SJung-uk Kim 133*313a0c13SJung-uk Kim FileSize = CmGetFileSize (Gbl_Files[FileId].Handle); 134*313a0c13SJung-uk Kim if (FileSize == ACPI_UINT32_MAX) 135*313a0c13SJung-uk Kim { 136*313a0c13SJung-uk Kim AslAbort(); 137*313a0c13SJung-uk Kim } 138efcc2a30SJung-uk Kim 139efcc2a30SJung-uk Kim return (FileSize); 140efcc2a30SJung-uk Kim } 141efcc2a30SJung-uk Kim 142efcc2a30SJung-uk Kim 143efcc2a30SJung-uk Kim /******************************************************************************* 144efcc2a30SJung-uk Kim * 145efcc2a30SJung-uk Kim * FUNCTION: FlReadFile 146efcc2a30SJung-uk Kim * 147efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 148efcc2a30SJung-uk Kim * Buffer - Where to place the data 149efcc2a30SJung-uk Kim * Length - Amount to read 150efcc2a30SJung-uk Kim * 151efcc2a30SJung-uk Kim * RETURN: Status. AE_ERROR indicates EOF. 152efcc2a30SJung-uk Kim * 153efcc2a30SJung-uk Kim * DESCRIPTION: Read data from an open file. 154efcc2a30SJung-uk Kim * NOTE: Aborts compiler on any error. 155efcc2a30SJung-uk Kim * 156efcc2a30SJung-uk Kim ******************************************************************************/ 157efcc2a30SJung-uk Kim 158efcc2a30SJung-uk Kim ACPI_STATUS 159efcc2a30SJung-uk Kim FlReadFile ( 160efcc2a30SJung-uk Kim UINT32 FileId, 161efcc2a30SJung-uk Kim void *Buffer, 162efcc2a30SJung-uk Kim UINT32 Length) 163efcc2a30SJung-uk Kim { 164efcc2a30SJung-uk Kim UINT32 Actual; 165efcc2a30SJung-uk Kim 166efcc2a30SJung-uk Kim 167efcc2a30SJung-uk Kim /* Read and check for error */ 168efcc2a30SJung-uk Kim 169efcc2a30SJung-uk Kim Actual = fread (Buffer, 1, Length, Gbl_Files[FileId].Handle); 170efcc2a30SJung-uk Kim if (Actual < Length) 171efcc2a30SJung-uk Kim { 172efcc2a30SJung-uk Kim if (feof (Gbl_Files[FileId].Handle)) 173efcc2a30SJung-uk Kim { 174efcc2a30SJung-uk Kim /* End-of-file, just return error */ 175efcc2a30SJung-uk Kim 176efcc2a30SJung-uk Kim return (AE_ERROR); 177efcc2a30SJung-uk Kim } 178efcc2a30SJung-uk Kim 179efcc2a30SJung-uk Kim FlFileError (FileId, ASL_MSG_READ); 180efcc2a30SJung-uk Kim AslAbort (); 181efcc2a30SJung-uk Kim } 182efcc2a30SJung-uk Kim 183efcc2a30SJung-uk Kim return (AE_OK); 184efcc2a30SJung-uk Kim } 185efcc2a30SJung-uk Kim 186efcc2a30SJung-uk Kim 187efcc2a30SJung-uk Kim /******************************************************************************* 188efcc2a30SJung-uk Kim * 189efcc2a30SJung-uk Kim * FUNCTION: FlWriteFile 190efcc2a30SJung-uk Kim * 191efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 192efcc2a30SJung-uk Kim * Buffer - Data to write 193efcc2a30SJung-uk Kim * Length - Amount of data to write 194efcc2a30SJung-uk Kim * 195efcc2a30SJung-uk Kim * RETURN: None 196efcc2a30SJung-uk Kim * 197efcc2a30SJung-uk Kim * DESCRIPTION: Write data to an open file. 198efcc2a30SJung-uk Kim * NOTE: Aborts compiler on any error. 199efcc2a30SJung-uk Kim * 200efcc2a30SJung-uk Kim ******************************************************************************/ 201efcc2a30SJung-uk Kim 202efcc2a30SJung-uk Kim void 203efcc2a30SJung-uk Kim FlWriteFile ( 204efcc2a30SJung-uk Kim UINT32 FileId, 205efcc2a30SJung-uk Kim void *Buffer, 206efcc2a30SJung-uk Kim UINT32 Length) 207efcc2a30SJung-uk Kim { 208efcc2a30SJung-uk Kim UINT32 Actual; 209efcc2a30SJung-uk Kim 210efcc2a30SJung-uk Kim 211efcc2a30SJung-uk Kim /* Write and check for error */ 212efcc2a30SJung-uk Kim 213efcc2a30SJung-uk Kim Actual = fwrite ((char *) Buffer, 1, Length, Gbl_Files[FileId].Handle); 214efcc2a30SJung-uk Kim if (Actual != Length) 215efcc2a30SJung-uk Kim { 216efcc2a30SJung-uk Kim FlFileError (FileId, ASL_MSG_WRITE); 217efcc2a30SJung-uk Kim AslAbort (); 218efcc2a30SJung-uk Kim } 219efcc2a30SJung-uk Kim } 220efcc2a30SJung-uk Kim 221efcc2a30SJung-uk Kim 222efcc2a30SJung-uk Kim /******************************************************************************* 223efcc2a30SJung-uk Kim * 224efcc2a30SJung-uk Kim * FUNCTION: FlPrintFile 225efcc2a30SJung-uk Kim * 226efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 227efcc2a30SJung-uk Kim * Format - Printf format string 228efcc2a30SJung-uk Kim * ... - Printf arguments 229efcc2a30SJung-uk Kim * 230efcc2a30SJung-uk Kim * RETURN: None 231efcc2a30SJung-uk Kim * 232efcc2a30SJung-uk Kim * DESCRIPTION: Formatted write to an open file. 233efcc2a30SJung-uk Kim * NOTE: Aborts compiler on any error. 234efcc2a30SJung-uk Kim * 235efcc2a30SJung-uk Kim ******************************************************************************/ 236efcc2a30SJung-uk Kim 237efcc2a30SJung-uk Kim void 238efcc2a30SJung-uk Kim FlPrintFile ( 239efcc2a30SJung-uk Kim UINT32 FileId, 240efcc2a30SJung-uk Kim char *Format, 241efcc2a30SJung-uk Kim ...) 242efcc2a30SJung-uk Kim { 243efcc2a30SJung-uk Kim INT32 Actual; 244efcc2a30SJung-uk Kim va_list Args; 245efcc2a30SJung-uk Kim 246efcc2a30SJung-uk Kim 247efcc2a30SJung-uk Kim va_start (Args, Format); 248efcc2a30SJung-uk Kim 249efcc2a30SJung-uk Kim Actual = vfprintf (Gbl_Files[FileId].Handle, Format, Args); 250efcc2a30SJung-uk Kim va_end (Args); 251efcc2a30SJung-uk Kim 252efcc2a30SJung-uk Kim if (Actual == -1) 253efcc2a30SJung-uk Kim { 254efcc2a30SJung-uk Kim FlFileError (FileId, ASL_MSG_WRITE); 255efcc2a30SJung-uk Kim AslAbort (); 256efcc2a30SJung-uk Kim } 257efcc2a30SJung-uk Kim } 258efcc2a30SJung-uk Kim 259efcc2a30SJung-uk Kim 260efcc2a30SJung-uk Kim /******************************************************************************* 261efcc2a30SJung-uk Kim * 262efcc2a30SJung-uk Kim * FUNCTION: FlSeekFile 263efcc2a30SJung-uk Kim * 264efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 265efcc2a30SJung-uk Kim * Offset - Absolute byte offset in file 266efcc2a30SJung-uk Kim * 267efcc2a30SJung-uk Kim * RETURN: None 268efcc2a30SJung-uk Kim * 269efcc2a30SJung-uk Kim * DESCRIPTION: Seek to absolute offset. 270efcc2a30SJung-uk Kim * NOTE: Aborts compiler on any error. 271efcc2a30SJung-uk Kim * 272efcc2a30SJung-uk Kim ******************************************************************************/ 273efcc2a30SJung-uk Kim 274efcc2a30SJung-uk Kim void 275efcc2a30SJung-uk Kim FlSeekFile ( 276efcc2a30SJung-uk Kim UINT32 FileId, 277efcc2a30SJung-uk Kim long Offset) 278efcc2a30SJung-uk Kim { 279efcc2a30SJung-uk Kim int Error; 280efcc2a30SJung-uk Kim 281efcc2a30SJung-uk Kim 282efcc2a30SJung-uk Kim Error = fseek (Gbl_Files[FileId].Handle, Offset, SEEK_SET); 283efcc2a30SJung-uk Kim if (Error) 284efcc2a30SJung-uk Kim { 285efcc2a30SJung-uk Kim FlFileError (FileId, ASL_MSG_SEEK); 286efcc2a30SJung-uk Kim AslAbort (); 287efcc2a30SJung-uk Kim } 288efcc2a30SJung-uk Kim } 289efcc2a30SJung-uk Kim 290efcc2a30SJung-uk Kim 291efcc2a30SJung-uk Kim /******************************************************************************* 292efcc2a30SJung-uk Kim * 293efcc2a30SJung-uk Kim * FUNCTION: FlCloseFile 294efcc2a30SJung-uk Kim * 295efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 296efcc2a30SJung-uk Kim * 297efcc2a30SJung-uk Kim * RETURN: None 298efcc2a30SJung-uk Kim * 299efcc2a30SJung-uk Kim * DESCRIPTION: Close an open file. Aborts compiler on error 300efcc2a30SJung-uk Kim * 301efcc2a30SJung-uk Kim ******************************************************************************/ 302efcc2a30SJung-uk Kim 303efcc2a30SJung-uk Kim void 304efcc2a30SJung-uk Kim FlCloseFile ( 305efcc2a30SJung-uk Kim UINT32 FileId) 306efcc2a30SJung-uk Kim { 307efcc2a30SJung-uk Kim int Error; 308efcc2a30SJung-uk Kim 309efcc2a30SJung-uk Kim 310efcc2a30SJung-uk Kim if (!Gbl_Files[FileId].Handle) 311efcc2a30SJung-uk Kim { 312efcc2a30SJung-uk Kim return; 313efcc2a30SJung-uk Kim } 314efcc2a30SJung-uk Kim 315efcc2a30SJung-uk Kim Error = fclose (Gbl_Files[FileId].Handle); 316efcc2a30SJung-uk Kim if (Error) 317efcc2a30SJung-uk Kim { 318efcc2a30SJung-uk Kim FlFileError (FileId, ASL_MSG_CLOSE); 319efcc2a30SJung-uk Kim AslAbort (); 320efcc2a30SJung-uk Kim } 321efcc2a30SJung-uk Kim 322*313a0c13SJung-uk Kim /* Do not clear/free the filename string */ 323*313a0c13SJung-uk Kim 324efcc2a30SJung-uk Kim Gbl_Files[FileId].Handle = NULL; 325efcc2a30SJung-uk Kim return; 326efcc2a30SJung-uk Kim } 327efcc2a30SJung-uk Kim 328efcc2a30SJung-uk Kim 329efcc2a30SJung-uk Kim /******************************************************************************* 330efcc2a30SJung-uk Kim * 331efcc2a30SJung-uk Kim * FUNCTION: FlDeleteFile 332efcc2a30SJung-uk Kim * 333efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 334efcc2a30SJung-uk Kim * 335efcc2a30SJung-uk Kim * RETURN: None 336efcc2a30SJung-uk Kim * 337efcc2a30SJung-uk Kim * DESCRIPTION: Delete a file. 338efcc2a30SJung-uk Kim * 339efcc2a30SJung-uk Kim ******************************************************************************/ 340efcc2a30SJung-uk Kim 341efcc2a30SJung-uk Kim void 342efcc2a30SJung-uk Kim FlDeleteFile ( 343efcc2a30SJung-uk Kim UINT32 FileId) 344efcc2a30SJung-uk Kim { 345efcc2a30SJung-uk Kim ASL_FILE_INFO *Info = &Gbl_Files[FileId]; 346efcc2a30SJung-uk Kim 347efcc2a30SJung-uk Kim 348efcc2a30SJung-uk Kim if (!Info->Filename) 349efcc2a30SJung-uk Kim { 350efcc2a30SJung-uk Kim return; 351efcc2a30SJung-uk Kim } 352efcc2a30SJung-uk Kim 353efcc2a30SJung-uk Kim if (remove (Info->Filename)) 354efcc2a30SJung-uk Kim { 355efcc2a30SJung-uk Kim printf ("%s (%s file) ", 356efcc2a30SJung-uk Kim Info->Filename, Info->Description); 357efcc2a30SJung-uk Kim perror ("Could not delete"); 358efcc2a30SJung-uk Kim } 359efcc2a30SJung-uk Kim 360efcc2a30SJung-uk Kim Info->Filename = NULL; 361efcc2a30SJung-uk Kim return; 362efcc2a30SJung-uk Kim } 363