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