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 <acpi/acpi.h> 45#include <stdio.h> 46#include <stdarg.h> 47 48#define _COMPONENT ACPI_OS_SERVICES 49ACPI_MODULE_NAME("oslibcfs") 50 51/******************************************************************************* 52 * 53 * FUNCTION: acpi_os_open_file 54 * 55 * PARAMETERS: path - File path 56 * modes - File operation type 57 * 58 * RETURN: File descriptor. 59 * 60 * DESCRIPTION: Open a file for reading (ACPI_FILE_READING) or/and writing 61 * (ACPI_FILE_WRITING). 62 * 63 ******************************************************************************/ 64ACPI_FILE acpi_os_open_file(const char *path, u8 modes) 65{ 66 ACPI_FILE file; 67 u32 i = 0; 68 char modes_str[4]; 69 70 if (modes & ACPI_FILE_READING) { 71 modes_str[i++] = 'r'; 72 } 73 if (modes & ACPI_FILE_WRITING) { 74 modes_str[i++] = 'w'; 75 } 76 if (modes & ACPI_FILE_BINARY) { 77 modes_str[i++] = 'b'; 78 } 79 80 modes_str[i++] = '\0'; 81 82 file = fopen(path, modes_str); 83 if (!file) { 84 perror("Could not open file"); 85 } 86 87 return (file); 88} 89 90/******************************************************************************* 91 * 92 * FUNCTION: acpi_os_close_file 93 * 94 * PARAMETERS: file - An open file descriptor 95 * 96 * RETURN: None. 97 * 98 * DESCRIPTION: Close a file opened via acpi_os_open_file. 99 * 100 ******************************************************************************/ 101 102void acpi_os_close_file(ACPI_FILE file) 103{ 104 fclose(file); 105} 106 107/******************************************************************************* 108 * 109 * FUNCTION: acpi_os_read_file 110 * 111 * PARAMETERS: file - An open file descriptor 112 * buffer - Data buffer 113 * size - Data block size 114 * count - Number of data blocks 115 * 116 * RETURN: Number of bytes actually read. 117 * 118 * DESCRIPTION: Read from a file. 119 * 120 ******************************************************************************/ 121 122int 123acpi_os_read_file(ACPI_FILE file, void *buffer, acpi_size size, acpi_size count) 124{ 125 int length; 126 127 length = fread(buffer, size, count, file); 128 if (length < 0) { 129 perror("Error reading file"); 130 } 131 132 return (length); 133} 134 135/******************************************************************************* 136 * 137 * FUNCTION: acpi_os_write_file 138 * 139 * PARAMETERS: file - An open file descriptor 140 * buffer - Data buffer 141 * size - Data block size 142 * count - Number of data blocks 143 * 144 * RETURN: Number of bytes actually written. 145 * 146 * DESCRIPTION: Write to a file. 147 * 148 ******************************************************************************/ 149 150int 151acpi_os_write_file(ACPI_FILE file, 152 void *buffer, acpi_size size, acpi_size count) 153{ 154 int length; 155 156 length = fwrite(buffer, size, count, file); 157 if (length < 0) { 158 perror("Error writing file"); 159 } 160 161 return (length); 162} 163 164/******************************************************************************* 165 * 166 * FUNCTION: acpi_os_get_file_offset 167 * 168 * PARAMETERS: file - An open file descriptor 169 * 170 * RETURN: Current file pointer position. 171 * 172 * DESCRIPTION: Get current file offset. 173 * 174 ******************************************************************************/ 175 176long acpi_os_get_file_offset(ACPI_FILE file) 177{ 178 long offset; 179 180 offset = ftell(file); 181 return (offset); 182} 183 184/******************************************************************************* 185 * 186 * FUNCTION: acpi_os_set_file_offset 187 * 188 * PARAMETERS: file - An open file descriptor 189 * offset - New file offset 190 * from - From begin/end of file 191 * 192 * RETURN: Status 193 * 194 * DESCRIPTION: Set current file offset. 195 * 196 ******************************************************************************/ 197 198acpi_status acpi_os_set_file_offset(ACPI_FILE file, long offset, u8 from) 199{ 200 int ret = 0; 201 202 if (from == ACPI_FILE_BEGIN) { 203 ret = fseek(file, offset, SEEK_SET); 204 } 205 if (from == ACPI_FILE_END) { 206 ret = fseek(file, offset, SEEK_END); 207 } 208 209 if (ret < 0) { 210 return (AE_ERROR); 211 } else { 212 return (AE_OK); 213 } 214} 215