xref: /NextBSD/sys/contrib/dev/acpica/os_specific/service_layers/oslibcfs.c (revision 287e3b14e9552995def1802ec9c5034f4adf28ec)
1 /******************************************************************************
2  *
3  * Module Name: oslibcfs - C library OSL for file I/O
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/include/acpi.h>
45 #include <stdio.h>
46 #include <stdarg.h>
47 
48 #define _COMPONENT          ACPI_OS_SERVICES
49         ACPI_MODULE_NAME    ("oslibcfs")
50 
51 
52 /*******************************************************************************
53  *
54  * FUNCTION:    AcpiOsOpenFile
55  *
56  * PARAMETERS:  Path                - File path
57  *              Modes               - File operation type
58  *
59  * RETURN:      File descriptor.
60  *
61  * DESCRIPTION: Open a file for reading (ACPI_FILE_READING) or/and writing
62  *              (ACPI_FILE_WRITING).
63  *
64  ******************************************************************************/
65 
66 ACPI_FILE
AcpiOsOpenFile(const char * Path,UINT8 Modes)67 AcpiOsOpenFile (
68     const char              *Path,
69     UINT8                   Modes)
70 {
71     ACPI_FILE               File;
72     UINT32                  i = 0;
73     char                    ModesStr[4];
74 
75 
76     if (Modes & ACPI_FILE_READING)
77     {
78         ModesStr[i++] = 'r';
79     }
80     if (Modes & ACPI_FILE_WRITING)
81     {
82         ModesStr[i++] = 'w';
83     }
84     if (Modes & ACPI_FILE_BINARY)
85     {
86         ModesStr[i++] = 'b';
87     }
88 
89     ModesStr[i++] = '\0';
90 
91     File = fopen (Path, ModesStr);
92     if (!File)
93     {
94         perror ("Could not open file");
95     }
96 
97     return (File);
98 }
99 
100 
101 /*******************************************************************************
102  *
103  * FUNCTION:    AcpiOsCloseFile
104  *
105  * PARAMETERS:  File                - An open file descriptor
106  *
107  * RETURN:      None.
108  *
109  * DESCRIPTION: Close a file opened via AcpiOsOpenFile.
110  *
111  ******************************************************************************/
112 
113 void
AcpiOsCloseFile(ACPI_FILE File)114 AcpiOsCloseFile (
115     ACPI_FILE               File)
116 {
117     fclose (File);
118 }
119 
120 
121 /*******************************************************************************
122  *
123  * FUNCTION:    AcpiOsReadFile
124  *
125  * PARAMETERS:  File                - An open file descriptor
126  *              Buffer              - Data buffer
127  *              Size                - Data block size
128  *              Count               - Number of data blocks
129  *
130  * RETURN:      Number of bytes actually read.
131  *
132  * DESCRIPTION: Read from a file.
133  *
134  ******************************************************************************/
135 
136 int
AcpiOsReadFile(ACPI_FILE File,void * Buffer,ACPI_SIZE Size,ACPI_SIZE Count)137 AcpiOsReadFile (
138     ACPI_FILE               File,
139     void                    *Buffer,
140     ACPI_SIZE               Size,
141     ACPI_SIZE               Count)
142 {
143     int                     Length;
144 
145 
146     Length = fread (Buffer, Size, Count, File);
147     if (Length < 0)
148     {
149         perror ("Error reading file");
150     }
151 
152     return (Length);
153 }
154 
155 
156 /*******************************************************************************
157  *
158  * FUNCTION:    AcpiOsWriteFile
159  *
160  * PARAMETERS:  File                - An open file descriptor
161  *              Buffer              - Data buffer
162  *              Size                - Data block size
163  *              Count               - Number of data blocks
164  *
165  * RETURN:      Number of bytes actually written.
166  *
167  * DESCRIPTION: Write to a file.
168  *
169  ******************************************************************************/
170 
171 int
AcpiOsWriteFile(ACPI_FILE File,void * Buffer,ACPI_SIZE Size,ACPI_SIZE Count)172 AcpiOsWriteFile (
173     ACPI_FILE               File,
174     void                    *Buffer,
175     ACPI_SIZE               Size,
176     ACPI_SIZE               Count)
177 {
178     int                     Length;
179 
180 
181     Length = fwrite (Buffer, Size, Count, File);
182     if (Length < 0)
183     {
184         perror ("Error writing file");
185     }
186 
187     return (Length);
188 }
189 
190 
191 /*******************************************************************************
192  *
193  * FUNCTION:    AcpiOsGetFileOffset
194  *
195  * PARAMETERS:  File                - An open file descriptor
196  *
197  * RETURN:      Current file pointer position.
198  *
199  * DESCRIPTION: Get current file offset.
200  *
201  ******************************************************************************/
202 
203 long
AcpiOsGetFileOffset(ACPI_FILE File)204 AcpiOsGetFileOffset (
205     ACPI_FILE               File)
206 {
207     long                    Offset;
208 
209 
210     Offset = ftell (File);
211     return (Offset);
212 }
213 
214 
215 /*******************************************************************************
216  *
217  * FUNCTION:    AcpiOsSetFileOffset
218  *
219  * PARAMETERS:  File                - An open file descriptor
220  *              Offset              - New file offset
221  *              From                - From begin/end of file
222  *
223  * RETURN:      Status
224  *
225  * DESCRIPTION: Set current file offset.
226  *
227  ******************************************************************************/
228 
229 ACPI_STATUS
AcpiOsSetFileOffset(ACPI_FILE File,long Offset,UINT8 From)230 AcpiOsSetFileOffset (
231     ACPI_FILE               File,
232     long                    Offset,
233     UINT8                   From)
234 {
235     int                     Ret = 0;
236 
237 
238     if (From == ACPI_FILE_BEGIN)
239     {
240         Ret = fseek (File, Offset, SEEK_SET);
241     }
242     if (From == ACPI_FILE_END)
243     {
244         Ret = fseek (File, Offset, SEEK_END);
245     }
246 
247     if (Ret < 0)
248     {
249         return (AE_ERROR);
250     }
251     else
252     {
253         return (AE_OK);
254     }
255 }
256