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