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*1c0e1b6dSJung-uk Kim * Copyright (C) 2000 - 2015, 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> 45313a0c13SJung-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 71*1c0e1b6dSJung-uk Kim sprintf (MsgBuffer, "\"%s\" (%s) - %s", Gbl_Files[FileId].Filename, 72*1c0e1b6dSJung-uk Kim Gbl_Files[FileId].Description, 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 101*1c0e1b6dSJung-uk Kim Gbl_Files[FileId].Filename = Filename; 102*1c0e1b6dSJung-uk Kim Gbl_Files[FileId].Handle = NULL; 103*1c0e1b6dSJung-uk Kim 104efcc2a30SJung-uk Kim File = fopen (Filename, Mode); 105efcc2a30SJung-uk Kim if (!File) 106efcc2a30SJung-uk Kim { 107efcc2a30SJung-uk Kim FlFileError (FileId, ASL_MSG_OPEN); 108efcc2a30SJung-uk Kim AslAbort (); 109efcc2a30SJung-uk Kim } 110efcc2a30SJung-uk Kim 111efcc2a30SJung-uk Kim Gbl_Files[FileId].Handle = File; 112efcc2a30SJung-uk Kim } 113efcc2a30SJung-uk Kim 114efcc2a30SJung-uk Kim 115efcc2a30SJung-uk Kim /******************************************************************************* 116efcc2a30SJung-uk Kim * 117efcc2a30SJung-uk Kim * FUNCTION: FlGetFileSize 118efcc2a30SJung-uk Kim * 119efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 120efcc2a30SJung-uk Kim * 121efcc2a30SJung-uk Kim * RETURN: File Size 122efcc2a30SJung-uk Kim * 123313a0c13SJung-uk Kim * DESCRIPTION: Get current file size. Uses common seek-to-EOF function. 124313a0c13SJung-uk Kim * File must be open. Aborts compiler on error. 125efcc2a30SJung-uk Kim * 126efcc2a30SJung-uk Kim ******************************************************************************/ 127efcc2a30SJung-uk Kim 128efcc2a30SJung-uk Kim UINT32 129efcc2a30SJung-uk Kim FlGetFileSize ( 130efcc2a30SJung-uk Kim UINT32 FileId) 131efcc2a30SJung-uk Kim { 132efcc2a30SJung-uk Kim UINT32 FileSize; 133efcc2a30SJung-uk Kim 134efcc2a30SJung-uk Kim 135313a0c13SJung-uk Kim FileSize = CmGetFileSize (Gbl_Files[FileId].Handle); 136313a0c13SJung-uk Kim if (FileSize == ACPI_UINT32_MAX) 137313a0c13SJung-uk Kim { 138313a0c13SJung-uk Kim AslAbort(); 139313a0c13SJung-uk Kim } 140efcc2a30SJung-uk Kim 141efcc2a30SJung-uk Kim return (FileSize); 142efcc2a30SJung-uk Kim } 143efcc2a30SJung-uk Kim 144efcc2a30SJung-uk Kim 145efcc2a30SJung-uk Kim /******************************************************************************* 146efcc2a30SJung-uk Kim * 147efcc2a30SJung-uk Kim * FUNCTION: FlReadFile 148efcc2a30SJung-uk Kim * 149efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 150efcc2a30SJung-uk Kim * Buffer - Where to place the data 151efcc2a30SJung-uk Kim * Length - Amount to read 152efcc2a30SJung-uk Kim * 153efcc2a30SJung-uk Kim * RETURN: Status. AE_ERROR indicates EOF. 154efcc2a30SJung-uk Kim * 155efcc2a30SJung-uk Kim * DESCRIPTION: Read data from an open file. 156efcc2a30SJung-uk Kim * NOTE: Aborts compiler on any error. 157efcc2a30SJung-uk Kim * 158efcc2a30SJung-uk Kim ******************************************************************************/ 159efcc2a30SJung-uk Kim 160efcc2a30SJung-uk Kim ACPI_STATUS 161efcc2a30SJung-uk Kim FlReadFile ( 162efcc2a30SJung-uk Kim UINT32 FileId, 163efcc2a30SJung-uk Kim void *Buffer, 164efcc2a30SJung-uk Kim UINT32 Length) 165efcc2a30SJung-uk Kim { 166efcc2a30SJung-uk Kim UINT32 Actual; 167efcc2a30SJung-uk Kim 168efcc2a30SJung-uk Kim 169efcc2a30SJung-uk Kim /* Read and check for error */ 170efcc2a30SJung-uk Kim 171efcc2a30SJung-uk Kim Actual = fread (Buffer, 1, Length, Gbl_Files[FileId].Handle); 172efcc2a30SJung-uk Kim if (Actual < Length) 173efcc2a30SJung-uk Kim { 174efcc2a30SJung-uk Kim if (feof (Gbl_Files[FileId].Handle)) 175efcc2a30SJung-uk Kim { 176efcc2a30SJung-uk Kim /* End-of-file, just return error */ 177efcc2a30SJung-uk Kim 178efcc2a30SJung-uk Kim return (AE_ERROR); 179efcc2a30SJung-uk Kim } 180efcc2a30SJung-uk Kim 181efcc2a30SJung-uk Kim FlFileError (FileId, ASL_MSG_READ); 182efcc2a30SJung-uk Kim AslAbort (); 183efcc2a30SJung-uk Kim } 184efcc2a30SJung-uk Kim 185efcc2a30SJung-uk Kim return (AE_OK); 186efcc2a30SJung-uk Kim } 187efcc2a30SJung-uk Kim 188efcc2a30SJung-uk Kim 189efcc2a30SJung-uk Kim /******************************************************************************* 190efcc2a30SJung-uk Kim * 191efcc2a30SJung-uk Kim * FUNCTION: FlWriteFile 192efcc2a30SJung-uk Kim * 193efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 194efcc2a30SJung-uk Kim * Buffer - Data to write 195efcc2a30SJung-uk Kim * Length - Amount of data to write 196efcc2a30SJung-uk Kim * 197efcc2a30SJung-uk Kim * RETURN: None 198efcc2a30SJung-uk Kim * 199efcc2a30SJung-uk Kim * DESCRIPTION: Write data to an open file. 200efcc2a30SJung-uk Kim * NOTE: Aborts compiler on any error. 201efcc2a30SJung-uk Kim * 202efcc2a30SJung-uk Kim ******************************************************************************/ 203efcc2a30SJung-uk Kim 204efcc2a30SJung-uk Kim void 205efcc2a30SJung-uk Kim FlWriteFile ( 206efcc2a30SJung-uk Kim UINT32 FileId, 207efcc2a30SJung-uk Kim void *Buffer, 208efcc2a30SJung-uk Kim UINT32 Length) 209efcc2a30SJung-uk Kim { 210efcc2a30SJung-uk Kim UINT32 Actual; 211efcc2a30SJung-uk Kim 212efcc2a30SJung-uk Kim 213efcc2a30SJung-uk Kim /* Write and check for error */ 214efcc2a30SJung-uk Kim 215efcc2a30SJung-uk Kim Actual = fwrite ((char *) Buffer, 1, Length, Gbl_Files[FileId].Handle); 216efcc2a30SJung-uk Kim if (Actual != Length) 217efcc2a30SJung-uk Kim { 218efcc2a30SJung-uk Kim FlFileError (FileId, ASL_MSG_WRITE); 219efcc2a30SJung-uk Kim AslAbort (); 220efcc2a30SJung-uk Kim } 221efcc2a30SJung-uk Kim } 222efcc2a30SJung-uk Kim 223efcc2a30SJung-uk Kim 224efcc2a30SJung-uk Kim /******************************************************************************* 225efcc2a30SJung-uk Kim * 226efcc2a30SJung-uk Kim * FUNCTION: FlPrintFile 227efcc2a30SJung-uk Kim * 228efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 229efcc2a30SJung-uk Kim * Format - Printf format string 230efcc2a30SJung-uk Kim * ... - Printf arguments 231efcc2a30SJung-uk Kim * 232efcc2a30SJung-uk Kim * RETURN: None 233efcc2a30SJung-uk Kim * 234efcc2a30SJung-uk Kim * DESCRIPTION: Formatted write to an open file. 235efcc2a30SJung-uk Kim * NOTE: Aborts compiler on any error. 236efcc2a30SJung-uk Kim * 237efcc2a30SJung-uk Kim ******************************************************************************/ 238efcc2a30SJung-uk Kim 239efcc2a30SJung-uk Kim void 240efcc2a30SJung-uk Kim FlPrintFile ( 241efcc2a30SJung-uk Kim UINT32 FileId, 242efcc2a30SJung-uk Kim char *Format, 243efcc2a30SJung-uk Kim ...) 244efcc2a30SJung-uk Kim { 245efcc2a30SJung-uk Kim INT32 Actual; 246efcc2a30SJung-uk Kim va_list Args; 247efcc2a30SJung-uk Kim 248efcc2a30SJung-uk Kim 249efcc2a30SJung-uk Kim va_start (Args, Format); 250efcc2a30SJung-uk Kim 251efcc2a30SJung-uk Kim Actual = vfprintf (Gbl_Files[FileId].Handle, Format, Args); 252efcc2a30SJung-uk Kim va_end (Args); 253efcc2a30SJung-uk Kim 254efcc2a30SJung-uk Kim if (Actual == -1) 255efcc2a30SJung-uk Kim { 256efcc2a30SJung-uk Kim FlFileError (FileId, ASL_MSG_WRITE); 257efcc2a30SJung-uk Kim AslAbort (); 258efcc2a30SJung-uk Kim } 259efcc2a30SJung-uk Kim } 260efcc2a30SJung-uk Kim 261efcc2a30SJung-uk Kim 262efcc2a30SJung-uk Kim /******************************************************************************* 263efcc2a30SJung-uk Kim * 264efcc2a30SJung-uk Kim * FUNCTION: FlSeekFile 265efcc2a30SJung-uk Kim * 266efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 267efcc2a30SJung-uk Kim * Offset - Absolute byte offset in file 268efcc2a30SJung-uk Kim * 269efcc2a30SJung-uk Kim * RETURN: None 270efcc2a30SJung-uk Kim * 271efcc2a30SJung-uk Kim * DESCRIPTION: Seek to absolute offset. 272efcc2a30SJung-uk Kim * NOTE: Aborts compiler on any error. 273efcc2a30SJung-uk Kim * 274efcc2a30SJung-uk Kim ******************************************************************************/ 275efcc2a30SJung-uk Kim 276efcc2a30SJung-uk Kim void 277efcc2a30SJung-uk Kim FlSeekFile ( 278efcc2a30SJung-uk Kim UINT32 FileId, 279efcc2a30SJung-uk Kim long Offset) 280efcc2a30SJung-uk Kim { 281efcc2a30SJung-uk Kim int Error; 282efcc2a30SJung-uk Kim 283efcc2a30SJung-uk Kim 284efcc2a30SJung-uk Kim Error = fseek (Gbl_Files[FileId].Handle, Offset, SEEK_SET); 285efcc2a30SJung-uk Kim if (Error) 286efcc2a30SJung-uk Kim { 287efcc2a30SJung-uk Kim FlFileError (FileId, ASL_MSG_SEEK); 288efcc2a30SJung-uk Kim AslAbort (); 289efcc2a30SJung-uk Kim } 290efcc2a30SJung-uk Kim } 291efcc2a30SJung-uk Kim 292efcc2a30SJung-uk Kim 293efcc2a30SJung-uk Kim /******************************************************************************* 294efcc2a30SJung-uk Kim * 295efcc2a30SJung-uk Kim * FUNCTION: FlCloseFile 296efcc2a30SJung-uk Kim * 297efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 298efcc2a30SJung-uk Kim * 299efcc2a30SJung-uk Kim * RETURN: None 300efcc2a30SJung-uk Kim * 301efcc2a30SJung-uk Kim * DESCRIPTION: Close an open file. Aborts compiler on error 302efcc2a30SJung-uk Kim * 303efcc2a30SJung-uk Kim ******************************************************************************/ 304efcc2a30SJung-uk Kim 305efcc2a30SJung-uk Kim void 306efcc2a30SJung-uk Kim FlCloseFile ( 307efcc2a30SJung-uk Kim UINT32 FileId) 308efcc2a30SJung-uk Kim { 309efcc2a30SJung-uk Kim int Error; 310efcc2a30SJung-uk Kim 311efcc2a30SJung-uk Kim 312efcc2a30SJung-uk Kim if (!Gbl_Files[FileId].Handle) 313efcc2a30SJung-uk Kim { 314efcc2a30SJung-uk Kim return; 315efcc2a30SJung-uk Kim } 316efcc2a30SJung-uk Kim 317efcc2a30SJung-uk Kim Error = fclose (Gbl_Files[FileId].Handle); 318efcc2a30SJung-uk Kim if (Error) 319efcc2a30SJung-uk Kim { 320efcc2a30SJung-uk Kim FlFileError (FileId, ASL_MSG_CLOSE); 321efcc2a30SJung-uk Kim AslAbort (); 322efcc2a30SJung-uk Kim } 323efcc2a30SJung-uk Kim 324313a0c13SJung-uk Kim /* Do not clear/free the filename string */ 325313a0c13SJung-uk Kim 326efcc2a30SJung-uk Kim Gbl_Files[FileId].Handle = NULL; 327efcc2a30SJung-uk Kim return; 328efcc2a30SJung-uk Kim } 329efcc2a30SJung-uk Kim 330efcc2a30SJung-uk Kim 331efcc2a30SJung-uk Kim /******************************************************************************* 332efcc2a30SJung-uk Kim * 333efcc2a30SJung-uk Kim * FUNCTION: FlDeleteFile 334efcc2a30SJung-uk Kim * 335efcc2a30SJung-uk Kim * PARAMETERS: FileId - Index into file info array 336efcc2a30SJung-uk Kim * 337efcc2a30SJung-uk Kim * RETURN: None 338efcc2a30SJung-uk Kim * 339efcc2a30SJung-uk Kim * DESCRIPTION: Delete a file. 340efcc2a30SJung-uk Kim * 341efcc2a30SJung-uk Kim ******************************************************************************/ 342efcc2a30SJung-uk Kim 343efcc2a30SJung-uk Kim void 344efcc2a30SJung-uk Kim FlDeleteFile ( 345efcc2a30SJung-uk Kim UINT32 FileId) 346efcc2a30SJung-uk Kim { 347efcc2a30SJung-uk Kim ASL_FILE_INFO *Info = &Gbl_Files[FileId]; 348efcc2a30SJung-uk Kim 349efcc2a30SJung-uk Kim 350efcc2a30SJung-uk Kim if (!Info->Filename) 351efcc2a30SJung-uk Kim { 352efcc2a30SJung-uk Kim return; 353efcc2a30SJung-uk Kim } 354efcc2a30SJung-uk Kim 355efcc2a30SJung-uk Kim if (remove (Info->Filename)) 356efcc2a30SJung-uk Kim { 357efcc2a30SJung-uk Kim printf ("%s (%s file) ", 358efcc2a30SJung-uk Kim Info->Filename, Info->Description); 359efcc2a30SJung-uk Kim perror ("Could not delete"); 360efcc2a30SJung-uk Kim } 361efcc2a30SJung-uk Kim 362efcc2a30SJung-uk Kim Info->Filename = NULL; 363efcc2a30SJung-uk Kim return; 364efcc2a30SJung-uk Kim } 365