1ff4a156dSchristos /******************************************************************************
2ff4a156dSchristos *
3ff4a156dSchristos * Module Name: aslfileio - File I/O support
4ff4a156dSchristos *
5ff4a156dSchristos *****************************************************************************/
6ff4a156dSchristos
7ff4a156dSchristos /*
8*2c7d7e3cSchristos * Copyright (C) 2000 - 2023, Intel Corp.
9ff4a156dSchristos * All rights reserved.
10ff4a156dSchristos *
11ff4a156dSchristos * Redistribution and use in source and binary forms, with or without
12ff4a156dSchristos * modification, are permitted provided that the following conditions
13ff4a156dSchristos * are met:
14ff4a156dSchristos * 1. Redistributions of source code must retain the above copyright
15ff4a156dSchristos * notice, this list of conditions, and the following disclaimer,
16ff4a156dSchristos * without modification.
17ff4a156dSchristos * 2. Redistributions in binary form must reproduce at minimum a disclaimer
18ff4a156dSchristos * substantially similar to the "NO WARRANTY" disclaimer below
19ff4a156dSchristos * ("Disclaimer") and any redistribution must be conditioned upon
20ff4a156dSchristos * including a substantially similar Disclaimer requirement for further
21ff4a156dSchristos * binary redistribution.
22ff4a156dSchristos * 3. Neither the names of the above-listed copyright holders nor the names
23ff4a156dSchristos * of any contributors may be used to endorse or promote products derived
24ff4a156dSchristos * from this software without specific prior written permission.
25ff4a156dSchristos *
26ff4a156dSchristos * Alternatively, this software may be distributed under the terms of the
27ff4a156dSchristos * GNU General Public License ("GPL") version 2 as published by the Free
28ff4a156dSchristos * Software Foundation.
29ff4a156dSchristos *
30ff4a156dSchristos * NO WARRANTY
31ff4a156dSchristos * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
32ff4a156dSchristos * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
3398244dcfSchristos * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
34ff4a156dSchristos * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
35ff4a156dSchristos * HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
36ff4a156dSchristos * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
37ff4a156dSchristos * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
38ff4a156dSchristos * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
39ff4a156dSchristos * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
40ff4a156dSchristos * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
41ff4a156dSchristos * POSSIBILITY OF SUCH DAMAGES.
42ff4a156dSchristos */
43ff4a156dSchristos
44ff4a156dSchristos #include "aslcompiler.h"
45414ef032Schristos #include "acapps.h"
46ff4a156dSchristos
47ff4a156dSchristos #define _COMPONENT ACPI_COMPILER
48ff4a156dSchristos ACPI_MODULE_NAME ("aslfileio")
49ff4a156dSchristos
50ff4a156dSchristos
51ff4a156dSchristos /*******************************************************************************
52ff4a156dSchristos *
53ff4a156dSchristos * FUNCTION: FlFileError
54ff4a156dSchristos *
55ff4a156dSchristos * PARAMETERS: FileId - Index into file info array
56ff4a156dSchristos * ErrorId - Index into error message array
57ff4a156dSchristos *
58ff4a156dSchristos * RETURN: None
59ff4a156dSchristos *
60ff4a156dSchristos * DESCRIPTION: Decode errno to an error message and add the entire error
61ff4a156dSchristos * to the error log.
62ff4a156dSchristos *
63ff4a156dSchristos ******************************************************************************/
64ff4a156dSchristos
65ff4a156dSchristos void
FlFileError(UINT32 FileId,UINT8 ErrorId)66ff4a156dSchristos FlFileError (
67ff4a156dSchristos UINT32 FileId,
68ff4a156dSchristos UINT8 ErrorId)
69ff4a156dSchristos {
70ff4a156dSchristos
717efa3256Schristos snprintf (AslGbl_MsgBuffer, sizeof(AslGbl_MsgBuffer), "\"%s\" (%s) - %s", AslGbl_Files[FileId].Filename,
725b948c02Schristos AslGbl_FileDescs[FileId].Description, strerror (errno));
7381bd9c9cSchristos
747efa3256Schristos AslCommonError (ASL_ERROR, ErrorId, 0, 0, 0, 0, NULL, AslGbl_MsgBuffer);
75ff4a156dSchristos }
76ff4a156dSchristos
77ff4a156dSchristos
78ff4a156dSchristos /*******************************************************************************
79ff4a156dSchristos *
80ff4a156dSchristos * FUNCTION: FlOpenFile
81ff4a156dSchristos *
82ff4a156dSchristos * PARAMETERS: FileId - Index into file info array
83ff4a156dSchristos * Filename - file pathname to open
84ff4a156dSchristos * Mode - Open mode for fopen
85ff4a156dSchristos *
86ff4a156dSchristos * RETURN: None
87ff4a156dSchristos *
88ff4a156dSchristos * DESCRIPTION: Open a file.
89ff4a156dSchristos * NOTE: Aborts compiler on any error.
90ff4a156dSchristos *
91ff4a156dSchristos ******************************************************************************/
92ff4a156dSchristos
93ff4a156dSchristos void
FlOpenFile(UINT32 FileId,char * Filename,char * Mode)94ff4a156dSchristos FlOpenFile (
95ff4a156dSchristos UINT32 FileId,
96ff4a156dSchristos char *Filename,
97ff4a156dSchristos char *Mode)
98ff4a156dSchristos {
99ff4a156dSchristos FILE *File;
100ff4a156dSchristos
101ff4a156dSchristos
1027efa3256Schristos AslGbl_Files[FileId].Filename = Filename;
1037efa3256Schristos AslGbl_Files[FileId].Handle = NULL;
104cb2bd8f0Schristos
105ff4a156dSchristos File = fopen (Filename, Mode);
106ff4a156dSchristos if (!File)
107ff4a156dSchristos {
108ff4a156dSchristos FlFileError (FileId, ASL_MSG_OPEN);
109ff4a156dSchristos AslAbort ();
110ff4a156dSchristos }
111ff4a156dSchristos
1127efa3256Schristos AslGbl_Files[FileId].Handle = File;
113ff4a156dSchristos }
114ff4a156dSchristos
115ff4a156dSchristos
116ff4a156dSchristos /*******************************************************************************
117ff4a156dSchristos *
118ff4a156dSchristos * FUNCTION: FlGetFileSize
119ff4a156dSchristos *
120ff4a156dSchristos * PARAMETERS: FileId - Index into file info array
121ff4a156dSchristos *
122ff4a156dSchristos * RETURN: File Size
123ff4a156dSchristos *
124414ef032Schristos * DESCRIPTION: Get current file size. Uses common seek-to-EOF function.
125414ef032Schristos * File must be open. Aborts compiler on error.
126ff4a156dSchristos *
127ff4a156dSchristos ******************************************************************************/
128ff4a156dSchristos
129ff4a156dSchristos UINT32
FlGetFileSize(UINT32 FileId)130ff4a156dSchristos FlGetFileSize (
131ff4a156dSchristos UINT32 FileId)
132ff4a156dSchristos {
133ff4a156dSchristos UINT32 FileSize;
134ff4a156dSchristos
135ff4a156dSchristos
1367efa3256Schristos FileSize = CmGetFileSize (AslGbl_Files[FileId].Handle);
137414ef032Schristos if (FileSize == ACPI_UINT32_MAX)
138414ef032Schristos {
139414ef032Schristos AslAbort();
140414ef032Schristos }
141ff4a156dSchristos
142ff4a156dSchristos return (FileSize);
143ff4a156dSchristos }
144ff4a156dSchristos
145ff4a156dSchristos
146ff4a156dSchristos /*******************************************************************************
147ff4a156dSchristos *
148ff4a156dSchristos * FUNCTION: FlReadFile
149ff4a156dSchristos *
150ff4a156dSchristos * PARAMETERS: FileId - Index into file info array
151ff4a156dSchristos * Buffer - Where to place the data
152ff4a156dSchristos * Length - Amount to read
153ff4a156dSchristos *
154ff4a156dSchristos * RETURN: Status. AE_ERROR indicates EOF.
155ff4a156dSchristos *
156ff4a156dSchristos * DESCRIPTION: Read data from an open file.
157ff4a156dSchristos * NOTE: Aborts compiler on any error.
158ff4a156dSchristos *
159ff4a156dSchristos ******************************************************************************/
160ff4a156dSchristos
161ff4a156dSchristos ACPI_STATUS
FlReadFile(UINT32 FileId,void * Buffer,UINT32 Length)162ff4a156dSchristos FlReadFile (
163ff4a156dSchristos UINT32 FileId,
164ff4a156dSchristos void *Buffer,
165ff4a156dSchristos UINT32 Length)
166ff4a156dSchristos {
167ff4a156dSchristos UINT32 Actual;
168ff4a156dSchristos
169ff4a156dSchristos
170ff4a156dSchristos /* Read and check for error */
171ff4a156dSchristos
1727efa3256Schristos Actual = fread (Buffer, 1, Length, AslGbl_Files[FileId].Handle);
173ff4a156dSchristos if (Actual < Length)
174ff4a156dSchristos {
1757efa3256Schristos if (feof (AslGbl_Files[FileId].Handle))
176ff4a156dSchristos {
177ff4a156dSchristos /* End-of-file, just return error */
178ff4a156dSchristos
179ff4a156dSchristos return (AE_ERROR);
180ff4a156dSchristos }
181ff4a156dSchristos
182ff4a156dSchristos FlFileError (FileId, ASL_MSG_READ);
183ff4a156dSchristos AslAbort ();
184ff4a156dSchristos }
185ff4a156dSchristos
186ff4a156dSchristos return (AE_OK);
187ff4a156dSchristos }
188ff4a156dSchristos
189ff4a156dSchristos
190ff4a156dSchristos /*******************************************************************************
191ff4a156dSchristos *
192ff4a156dSchristos * FUNCTION: FlWriteFile
193ff4a156dSchristos *
194ff4a156dSchristos * PARAMETERS: FileId - Index into file info array
195ff4a156dSchristos * Buffer - Data to write
196ff4a156dSchristos * Length - Amount of data to write
197ff4a156dSchristos *
198ff4a156dSchristos * RETURN: None
199ff4a156dSchristos *
200ff4a156dSchristos * DESCRIPTION: Write data to an open file.
201ff4a156dSchristos * NOTE: Aborts compiler on any error.
202ff4a156dSchristos *
203ff4a156dSchristos ******************************************************************************/
204ff4a156dSchristos
205ff4a156dSchristos void
FlWriteFile(UINT32 FileId,void * Buffer,UINT32 Length)206ff4a156dSchristos FlWriteFile (
207ff4a156dSchristos UINT32 FileId,
208ff4a156dSchristos void *Buffer,
209ff4a156dSchristos UINT32 Length)
210ff4a156dSchristos {
211ff4a156dSchristos UINT32 Actual;
212ff4a156dSchristos
213ff4a156dSchristos
214ff4a156dSchristos /* Write and check for error */
215ff4a156dSchristos
2167efa3256Schristos Actual = fwrite ((char *) Buffer, 1, Length, AslGbl_Files[FileId].Handle);
217ff4a156dSchristos if (Actual != Length)
218ff4a156dSchristos {
219ff4a156dSchristos FlFileError (FileId, ASL_MSG_WRITE);
220ff4a156dSchristos AslAbort ();
221ff4a156dSchristos }
2229b9ee194Schristos
2237efa3256Schristos if ((FileId == ASL_FILE_PREPROCESSOR) && AslGbl_PreprocessorOutputFlag)
2249b9ee194Schristos {
2259b9ee194Schristos /* Duplicate the output to the user preprocessor (.i) file */
2269b9ee194Schristos
2279b9ee194Schristos Actual = fwrite ((char *) Buffer, 1, Length,
2287efa3256Schristos AslGbl_Files[ASL_FILE_PREPROCESSOR_USER].Handle);
2299b9ee194Schristos if (Actual != Length)
2309b9ee194Schristos {
2319b9ee194Schristos FlFileError (FileId, ASL_MSG_WRITE);
2329b9ee194Schristos AslAbort ();
2339b9ee194Schristos }
2349b9ee194Schristos }
235ff4a156dSchristos }
236ff4a156dSchristos
237ff4a156dSchristos
238ff4a156dSchristos /*******************************************************************************
239ff4a156dSchristos *
240ff4a156dSchristos * FUNCTION: FlPrintFile
241ff4a156dSchristos *
242ff4a156dSchristos * PARAMETERS: FileId - Index into file info array
243ff4a156dSchristos * Format - Printf format string
244ff4a156dSchristos * ... - Printf arguments
245ff4a156dSchristos *
246ff4a156dSchristos * RETURN: None
247ff4a156dSchristos *
248ff4a156dSchristos * DESCRIPTION: Formatted write to an open file.
249ff4a156dSchristos * NOTE: Aborts compiler on any error.
250ff4a156dSchristos *
251ff4a156dSchristos ******************************************************************************/
252ff4a156dSchristos
253ff4a156dSchristos void
FlPrintFile(UINT32 FileId,char * Format,...)254ff4a156dSchristos FlPrintFile (
255ff4a156dSchristos UINT32 FileId,
256ff4a156dSchristos char *Format,
257ff4a156dSchristos ...)
258ff4a156dSchristos {
259ff4a156dSchristos INT32 Actual;
260ff4a156dSchristos va_list Args;
261ff4a156dSchristos
262ff4a156dSchristos
263ff4a156dSchristos va_start (Args, Format);
2647efa3256Schristos Actual = vfprintf (AslGbl_Files[FileId].Handle, Format, Args);
265ff4a156dSchristos va_end (Args);
266ff4a156dSchristos
267ff4a156dSchristos if (Actual == -1)
268ff4a156dSchristos {
269ff4a156dSchristos FlFileError (FileId, ASL_MSG_WRITE);
270ff4a156dSchristos AslAbort ();
271ff4a156dSchristos }
2729b9ee194Schristos
27381bd9c9cSchristos if ((FileId == ASL_FILE_PREPROCESSOR) &&
2747efa3256Schristos AslGbl_PreprocessorOutputFlag)
2759b9ee194Schristos {
2769b9ee194Schristos /*
2779b9ee194Schristos * Duplicate the output to the user preprocessor (.i) file,
2789b9ee194Schristos * except: no #line directives.
2799b9ee194Schristos */
2809b9ee194Schristos if (!strncmp (Format, "#line", 5))
2819b9ee194Schristos {
2829b9ee194Schristos return;
2839b9ee194Schristos }
2849b9ee194Schristos
2859b9ee194Schristos va_start (Args, Format);
2867efa3256Schristos Actual = vfprintf (AslGbl_Files[ASL_FILE_PREPROCESSOR_USER].Handle,
2879b9ee194Schristos Format, Args);
2889b9ee194Schristos va_end (Args);
2899b9ee194Schristos
2909b9ee194Schristos if (Actual == -1)
2919b9ee194Schristos {
2929b9ee194Schristos FlFileError (FileId, ASL_MSG_WRITE);
2939b9ee194Schristos AslAbort ();
2949b9ee194Schristos }
2959b9ee194Schristos }
296ff4a156dSchristos }
297ff4a156dSchristos
298ff4a156dSchristos
299ff4a156dSchristos /*******************************************************************************
300ff4a156dSchristos *
301ff4a156dSchristos * FUNCTION: FlSeekFile
302ff4a156dSchristos *
303ff4a156dSchristos * PARAMETERS: FileId - Index into file info array
304ff4a156dSchristos * Offset - Absolute byte offset in file
305ff4a156dSchristos *
306ff4a156dSchristos * RETURN: None
307ff4a156dSchristos *
308ff4a156dSchristos * DESCRIPTION: Seek to absolute offset.
309ff4a156dSchristos * NOTE: Aborts compiler on any error.
310ff4a156dSchristos *
311ff4a156dSchristos ******************************************************************************/
312ff4a156dSchristos
313ff4a156dSchristos void
FlSeekFile(UINT32 FileId,long Offset)314ff4a156dSchristos FlSeekFile (
315ff4a156dSchristos UINT32 FileId,
316ff4a156dSchristos long Offset)
317ff4a156dSchristos {
318ff4a156dSchristos int Error;
319ff4a156dSchristos
320ff4a156dSchristos
3217efa3256Schristos Error = fseek (AslGbl_Files[FileId].Handle, Offset, SEEK_SET);
322ff4a156dSchristos if (Error)
323ff4a156dSchristos {
324ff4a156dSchristos FlFileError (FileId, ASL_MSG_SEEK);
325ff4a156dSchristos AslAbort ();
326ff4a156dSchristos }
327ff4a156dSchristos }
328ff4a156dSchristos
329ff4a156dSchristos
330ff4a156dSchristos /*******************************************************************************
331ff4a156dSchristos *
332ff4a156dSchristos * FUNCTION: FlCloseFile
333ff4a156dSchristos *
334ff4a156dSchristos * PARAMETERS: FileId - Index into file info array
335ff4a156dSchristos *
336ff4a156dSchristos * RETURN: None
337ff4a156dSchristos *
338ff4a156dSchristos * DESCRIPTION: Close an open file. Aborts compiler on error
339ff4a156dSchristos *
340ff4a156dSchristos ******************************************************************************/
341ff4a156dSchristos
342ff4a156dSchristos void
FlCloseFile(UINT32 FileId)343ff4a156dSchristos FlCloseFile (
344ff4a156dSchristos UINT32 FileId)
345ff4a156dSchristos {
346ff4a156dSchristos int Error;
347ff4a156dSchristos
348ff4a156dSchristos
3497efa3256Schristos if (!AslGbl_Files[FileId].Handle)
350ff4a156dSchristos {
351ff4a156dSchristos return;
352ff4a156dSchristos }
353ff4a156dSchristos
3547efa3256Schristos Error = fclose (AslGbl_Files[FileId].Handle);
355ff4a156dSchristos if (Error)
356ff4a156dSchristos {
357ff4a156dSchristos FlFileError (FileId, ASL_MSG_CLOSE);
358ff4a156dSchristos AslAbort ();
359ff4a156dSchristos }
360ff4a156dSchristos
361414ef032Schristos /* Do not clear/free the filename string */
362414ef032Schristos
3637efa3256Schristos AslGbl_Files[FileId].Handle = NULL;
364ff4a156dSchristos return;
365ff4a156dSchristos }
366ff4a156dSchristos
367ff4a156dSchristos
368ff4a156dSchristos /*******************************************************************************
369ff4a156dSchristos *
370ff4a156dSchristos * FUNCTION: FlDeleteFile
371ff4a156dSchristos *
372ff4a156dSchristos * PARAMETERS: FileId - Index into file info array
373ff4a156dSchristos *
374ff4a156dSchristos * RETURN: None
375ff4a156dSchristos *
376ff4a156dSchristos * DESCRIPTION: Delete a file.
377ff4a156dSchristos *
378ff4a156dSchristos ******************************************************************************/
379ff4a156dSchristos
380ff4a156dSchristos void
FlDeleteFile(UINT32 FileId)381ff4a156dSchristos FlDeleteFile (
382ff4a156dSchristos UINT32 FileId)
383ff4a156dSchristos {
3847efa3256Schristos ASL_FILE_INFO *Info = &AslGbl_Files[FileId];
385ff4a156dSchristos
386ff4a156dSchristos
387ff4a156dSchristos if (!Info->Filename)
388ff4a156dSchristos {
389ff4a156dSchristos return;
390ff4a156dSchristos }
391ff4a156dSchristos
392ff4a156dSchristos if (remove (Info->Filename))
393ff4a156dSchristos {
394ff4a156dSchristos printf ("%s (%s file) ",
3955b948c02Schristos Info->Filename, AslGbl_FileDescs[FileId].Description);
396ff4a156dSchristos perror ("Could not delete");
397ff4a156dSchristos }
398ff4a156dSchristos
399ff4a156dSchristos Info->Filename = NULL;
400ff4a156dSchristos return;
401ff4a156dSchristos }
402