xref: /freebsd/sys/contrib/dev/acpica/compiler/aslfileio.c (revision 313a0c13efa638cf248e35eed49f36ec0a1a7f26)
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