1244971Sjkim/****************************************************************************** 2244971Sjkim * 3244971Sjkim * Module Name: aslfileio - File I/O support 4244971Sjkim * 5244971Sjkim *****************************************************************************/ 6244971Sjkim 7244971Sjkim/* 8306536Sjkim * Copyright (C) 2000 - 2016, Intel Corp. 9244971Sjkim * All rights reserved. 10244971Sjkim * 11244971Sjkim * Redistribution and use in source and binary forms, with or without 12244971Sjkim * modification, are permitted provided that the following conditions 13244971Sjkim * are met: 14244971Sjkim * 1. Redistributions of source code must retain the above copyright 15244971Sjkim * notice, this list of conditions, and the following disclaimer, 16244971Sjkim * without modification. 17244971Sjkim * 2. Redistributions in binary form must reproduce at minimum a disclaimer 18244971Sjkim * substantially similar to the "NO WARRANTY" disclaimer below 19244971Sjkim * ("Disclaimer") and any redistribution must be conditioned upon 20244971Sjkim * including a substantially similar Disclaimer requirement for further 21244971Sjkim * binary redistribution. 22244971Sjkim * 3. Neither the names of the above-listed copyright holders nor the names 23244971Sjkim * of any contributors may be used to endorse or promote products derived 24244971Sjkim * from this software without specific prior written permission. 25244971Sjkim * 26244971Sjkim * Alternatively, this software may be distributed under the terms of the 27244971Sjkim * GNU General Public License ("GPL") version 2 as published by the Free 28244971Sjkim * Software Foundation. 29244971Sjkim * 30244971Sjkim * NO WARRANTY 31244971Sjkim * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 32244971Sjkim * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 33244971Sjkim * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR 34244971Sjkim * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 35244971Sjkim * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 36244971Sjkim * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 37244971Sjkim * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 38244971Sjkim * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 39244971Sjkim * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 40244971Sjkim * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 41244971Sjkim * POSSIBILITY OF SUCH DAMAGES. 42244971Sjkim */ 43244971Sjkim 44245582Sjkim#include <contrib/dev/acpica/compiler/aslcompiler.h> 45281075Sdim#include <contrib/dev/acpica/include/acapps.h> 46244971Sjkim 47244971Sjkim#define _COMPONENT ACPI_COMPILER 48244971Sjkim ACPI_MODULE_NAME ("aslfileio") 49244971Sjkim 50244971Sjkim 51244971Sjkim/******************************************************************************* 52244971Sjkim * 53244971Sjkim * FUNCTION: FlFileError 54244971Sjkim * 55244971Sjkim * PARAMETERS: FileId - Index into file info array 56244971Sjkim * ErrorId - Index into error message array 57244971Sjkim * 58244971Sjkim * RETURN: None 59244971Sjkim * 60244971Sjkim * DESCRIPTION: Decode errno to an error message and add the entire error 61244971Sjkim * to the error log. 62244971Sjkim * 63244971Sjkim ******************************************************************************/ 64244971Sjkim 65244971Sjkimvoid 66244971SjkimFlFileError ( 67244971Sjkim UINT32 FileId, 68244971Sjkim UINT8 ErrorId) 69244971Sjkim{ 70244971Sjkim 71281075Sdim sprintf (MsgBuffer, "\"%s\" (%s) - %s", Gbl_Files[FileId].Filename, 72281075Sdim Gbl_Files[FileId].Description, strerror (errno)); 73306536Sjkim 74244971Sjkim AslCommonError (ASL_ERROR, ErrorId, 0, 0, 0, 0, NULL, MsgBuffer); 75244971Sjkim} 76244971Sjkim 77244971Sjkim 78244971Sjkim/******************************************************************************* 79244971Sjkim * 80244971Sjkim * FUNCTION: FlOpenFile 81244971Sjkim * 82244971Sjkim * PARAMETERS: FileId - Index into file info array 83244971Sjkim * Filename - file pathname to open 84244971Sjkim * Mode - Open mode for fopen 85244971Sjkim * 86244971Sjkim * RETURN: None 87244971Sjkim * 88244971Sjkim * DESCRIPTION: Open a file. 89244971Sjkim * NOTE: Aborts compiler on any error. 90244971Sjkim * 91244971Sjkim ******************************************************************************/ 92244971Sjkim 93244971Sjkimvoid 94244971SjkimFlOpenFile ( 95244971Sjkim UINT32 FileId, 96244971Sjkim char *Filename, 97244971Sjkim char *Mode) 98244971Sjkim{ 99244971Sjkim FILE *File; 100244971Sjkim 101244971Sjkim 102281075Sdim Gbl_Files[FileId].Filename = Filename; 103281075Sdim Gbl_Files[FileId].Handle = NULL; 104281075Sdim 105244971Sjkim File = fopen (Filename, Mode); 106244971Sjkim if (!File) 107244971Sjkim { 108244971Sjkim FlFileError (FileId, ASL_MSG_OPEN); 109244971Sjkim AslAbort (); 110244971Sjkim } 111244971Sjkim 112281075Sdim Gbl_Files[FileId].Handle = File; 113244971Sjkim} 114244971Sjkim 115244971Sjkim 116244971Sjkim/******************************************************************************* 117244971Sjkim * 118244971Sjkim * FUNCTION: FlGetFileSize 119244971Sjkim * 120244971Sjkim * PARAMETERS: FileId - Index into file info array 121244971Sjkim * 122244971Sjkim * RETURN: File Size 123244971Sjkim * 124281075Sdim * DESCRIPTION: Get current file size. Uses common seek-to-EOF function. 125281075Sdim * File must be open. Aborts compiler on error. 126244971Sjkim * 127244971Sjkim ******************************************************************************/ 128244971Sjkim 129244971SjkimUINT32 130244971SjkimFlGetFileSize ( 131244971Sjkim UINT32 FileId) 132244971Sjkim{ 133244971Sjkim UINT32 FileSize; 134244971Sjkim 135244971Sjkim 136281075Sdim FileSize = CmGetFileSize (Gbl_Files[FileId].Handle); 137281075Sdim if (FileSize == ACPI_UINT32_MAX) 138281075Sdim { 139281075Sdim AslAbort(); 140281075Sdim } 141244971Sjkim 142244971Sjkim return (FileSize); 143244971Sjkim} 144244971Sjkim 145244971Sjkim 146244971Sjkim/******************************************************************************* 147244971Sjkim * 148244971Sjkim * FUNCTION: FlReadFile 149244971Sjkim * 150244971Sjkim * PARAMETERS: FileId - Index into file info array 151244971Sjkim * Buffer - Where to place the data 152244971Sjkim * Length - Amount to read 153244971Sjkim * 154244971Sjkim * RETURN: Status. AE_ERROR indicates EOF. 155244971Sjkim * 156244971Sjkim * DESCRIPTION: Read data from an open file. 157244971Sjkim * NOTE: Aborts compiler on any error. 158244971Sjkim * 159244971Sjkim ******************************************************************************/ 160244971Sjkim 161244971SjkimACPI_STATUS 162244971SjkimFlReadFile ( 163244971Sjkim UINT32 FileId, 164244971Sjkim void *Buffer, 165244971Sjkim UINT32 Length) 166244971Sjkim{ 167244971Sjkim UINT32 Actual; 168244971Sjkim 169244971Sjkim 170244971Sjkim /* Read and check for error */ 171244971Sjkim 172244971Sjkim Actual = fread (Buffer, 1, Length, Gbl_Files[FileId].Handle); 173244971Sjkim if (Actual < Length) 174244971Sjkim { 175244971Sjkim if (feof (Gbl_Files[FileId].Handle)) 176244971Sjkim { 177244971Sjkim /* End-of-file, just return error */ 178244971Sjkim 179244971Sjkim return (AE_ERROR); 180244971Sjkim } 181244971Sjkim 182244971Sjkim FlFileError (FileId, ASL_MSG_READ); 183244971Sjkim AslAbort (); 184244971Sjkim } 185244971Sjkim 186244971Sjkim return (AE_OK); 187244971Sjkim} 188244971Sjkim 189244971Sjkim 190244971Sjkim/******************************************************************************* 191244971Sjkim * 192244971Sjkim * FUNCTION: FlWriteFile 193244971Sjkim * 194244971Sjkim * PARAMETERS: FileId - Index into file info array 195244971Sjkim * Buffer - Data to write 196244971Sjkim * Length - Amount of data to write 197244971Sjkim * 198244971Sjkim * RETURN: None 199244971Sjkim * 200244971Sjkim * DESCRIPTION: Write data to an open file. 201244971Sjkim * NOTE: Aborts compiler on any error. 202244971Sjkim * 203244971Sjkim ******************************************************************************/ 204244971Sjkim 205244971Sjkimvoid 206244971SjkimFlWriteFile ( 207244971Sjkim UINT32 FileId, 208244971Sjkim void *Buffer, 209244971Sjkim UINT32 Length) 210244971Sjkim{ 211244971Sjkim UINT32 Actual; 212244971Sjkim 213244971Sjkim 214244971Sjkim /* Write and check for error */ 215244971Sjkim 216244971Sjkim Actual = fwrite ((char *) Buffer, 1, Length, Gbl_Files[FileId].Handle); 217244971Sjkim if (Actual != Length) 218244971Sjkim { 219244971Sjkim FlFileError (FileId, ASL_MSG_WRITE); 220244971Sjkim AslAbort (); 221244971Sjkim } 222306536Sjkim 223306536Sjkim if ((FileId == ASL_FILE_PREPROCESSOR) && Gbl_PreprocessorOutputFlag) 224306536Sjkim { 225306536Sjkim /* Duplicate the output to the user preprocessor (.i) file */ 226306536Sjkim 227306536Sjkim Actual = fwrite ((char *) Buffer, 1, Length, 228306536Sjkim Gbl_Files[ASL_FILE_PREPROCESSOR_USER].Handle); 229306536Sjkim if (Actual != Length) 230306536Sjkim { 231306536Sjkim FlFileError (FileId, ASL_MSG_WRITE); 232306536Sjkim AslAbort (); 233306536Sjkim } 234306536Sjkim } 235244971Sjkim} 236244971Sjkim 237244971Sjkim 238244971Sjkim/******************************************************************************* 239244971Sjkim * 240244971Sjkim * FUNCTION: FlPrintFile 241244971Sjkim * 242244971Sjkim * PARAMETERS: FileId - Index into file info array 243244971Sjkim * Format - Printf format string 244244971Sjkim * ... - Printf arguments 245244971Sjkim * 246244971Sjkim * RETURN: None 247244971Sjkim * 248244971Sjkim * DESCRIPTION: Formatted write to an open file. 249244971Sjkim * NOTE: Aborts compiler on any error. 250244971Sjkim * 251244971Sjkim ******************************************************************************/ 252244971Sjkim 253244971Sjkimvoid 254244971SjkimFlPrintFile ( 255244971Sjkim UINT32 FileId, 256244971Sjkim char *Format, 257244971Sjkim ...) 258244971Sjkim{ 259244971Sjkim INT32 Actual; 260244971Sjkim va_list Args; 261244971Sjkim 262244971Sjkim 263244971Sjkim va_start (Args, Format); 264244971Sjkim Actual = vfprintf (Gbl_Files[FileId].Handle, Format, Args); 265244971Sjkim va_end (Args); 266244971Sjkim 267244971Sjkim if (Actual == -1) 268244971Sjkim { 269244971Sjkim FlFileError (FileId, ASL_MSG_WRITE); 270244971Sjkim AslAbort (); 271244971Sjkim } 272306536Sjkim 273306536Sjkim if ((FileId == ASL_FILE_PREPROCESSOR) && 274306536Sjkim Gbl_PreprocessorOutputFlag) 275306536Sjkim { 276306536Sjkim /* 277306536Sjkim * Duplicate the output to the user preprocessor (.i) file, 278306536Sjkim * except: no #line directives. 279306536Sjkim */ 280306536Sjkim if (!strncmp (Format, "#line", 5)) 281306536Sjkim { 282306536Sjkim return; 283306536Sjkim } 284306536Sjkim 285306536Sjkim va_start (Args, Format); 286306536Sjkim Actual = vfprintf (Gbl_Files[ASL_FILE_PREPROCESSOR_USER].Handle, 287306536Sjkim Format, Args); 288306536Sjkim va_end (Args); 289306536Sjkim 290306536Sjkim if (Actual == -1) 291306536Sjkim { 292306536Sjkim FlFileError (FileId, ASL_MSG_WRITE); 293306536Sjkim AslAbort (); 294306536Sjkim } 295306536Sjkim } 296244971Sjkim} 297244971Sjkim 298244971Sjkim 299244971Sjkim/******************************************************************************* 300244971Sjkim * 301244971Sjkim * FUNCTION: FlSeekFile 302244971Sjkim * 303244971Sjkim * PARAMETERS: FileId - Index into file info array 304244971Sjkim * Offset - Absolute byte offset in file 305244971Sjkim * 306244971Sjkim * RETURN: None 307244971Sjkim * 308244971Sjkim * DESCRIPTION: Seek to absolute offset. 309244971Sjkim * NOTE: Aborts compiler on any error. 310244971Sjkim * 311244971Sjkim ******************************************************************************/ 312244971Sjkim 313244971Sjkimvoid 314244971SjkimFlSeekFile ( 315244971Sjkim UINT32 FileId, 316244971Sjkim long Offset) 317244971Sjkim{ 318244971Sjkim int Error; 319244971Sjkim 320244971Sjkim 321244971Sjkim Error = fseek (Gbl_Files[FileId].Handle, Offset, SEEK_SET); 322244971Sjkim if (Error) 323244971Sjkim { 324244971Sjkim FlFileError (FileId, ASL_MSG_SEEK); 325244971Sjkim AslAbort (); 326244971Sjkim } 327244971Sjkim} 328244971Sjkim 329244971Sjkim 330244971Sjkim/******************************************************************************* 331244971Sjkim * 332244971Sjkim * FUNCTION: FlCloseFile 333244971Sjkim * 334244971Sjkim * PARAMETERS: FileId - Index into file info array 335244971Sjkim * 336244971Sjkim * RETURN: None 337244971Sjkim * 338244971Sjkim * DESCRIPTION: Close an open file. Aborts compiler on error 339244971Sjkim * 340244971Sjkim ******************************************************************************/ 341244971Sjkim 342244971Sjkimvoid 343244971SjkimFlCloseFile ( 344244971Sjkim UINT32 FileId) 345244971Sjkim{ 346244971Sjkim int Error; 347244971Sjkim 348244971Sjkim 349244971Sjkim if (!Gbl_Files[FileId].Handle) 350244971Sjkim { 351244971Sjkim return; 352244971Sjkim } 353244971Sjkim 354244971Sjkim Error = fclose (Gbl_Files[FileId].Handle); 355244971Sjkim if (Error) 356244971Sjkim { 357244971Sjkim FlFileError (FileId, ASL_MSG_CLOSE); 358244971Sjkim AslAbort (); 359244971Sjkim } 360244971Sjkim 361281075Sdim /* Do not clear/free the filename string */ 362281075Sdim 363244971Sjkim Gbl_Files[FileId].Handle = NULL; 364244971Sjkim return; 365244971Sjkim} 366244971Sjkim 367244971Sjkim 368244971Sjkim/******************************************************************************* 369244971Sjkim * 370244971Sjkim * FUNCTION: FlDeleteFile 371244971Sjkim * 372244971Sjkim * PARAMETERS: FileId - Index into file info array 373244971Sjkim * 374244971Sjkim * RETURN: None 375244971Sjkim * 376244971Sjkim * DESCRIPTION: Delete a file. 377244971Sjkim * 378244971Sjkim ******************************************************************************/ 379244971Sjkim 380244971Sjkimvoid 381244971SjkimFlDeleteFile ( 382244971Sjkim UINT32 FileId) 383244971Sjkim{ 384244971Sjkim ASL_FILE_INFO *Info = &Gbl_Files[FileId]; 385244971Sjkim 386244971Sjkim 387244971Sjkim if (!Info->Filename) 388244971Sjkim { 389244971Sjkim return; 390244971Sjkim } 391244971Sjkim 392244971Sjkim if (remove (Info->Filename)) 393244971Sjkim { 394244971Sjkim printf ("%s (%s file) ", 395244971Sjkim Info->Filename, Info->Description); 396244971Sjkim perror ("Could not delete"); 397244971Sjkim } 398244971Sjkim 399244971Sjkim Info->Filename = NULL; 400244971Sjkim return; 401244971Sjkim} 402