1/****************************************************************************** 2 * 3 * Module Name: oslibcfs - C library OSL for file I/O 4 * 5 *****************************************************************************/ 6 7/* 8 * Copyright (C) 2000 - 2016, 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 77 if (modes & ACPI_FILE_BINARY) { 78 modes_str[i++] = 'b'; 79 } 80 81 modes_str[i++] = '\0'; 82 83 file = fopen(path, modes_str); 84 if (!file) { 85 perror("Could not open file"); 86 } 87 88 return (file); 89} 90 91/******************************************************************************* 92 * 93 * FUNCTION: acpi_os_close_file 94 * 95 * PARAMETERS: file - An open file descriptor 96 * 97 * RETURN: None. 98 * 99 * DESCRIPTION: Close a file opened via acpi_os_open_file. 100 * 101 ******************************************************************************/ 102 103void acpi_os_close_file(ACPI_FILE file) 104{ 105 106 fclose(file); 107} 108 109/******************************************************************************* 110 * 111 * FUNCTION: acpi_os_read_file 112 * 113 * PARAMETERS: file - An open file descriptor 114 * buffer - Data buffer 115 * size - Data block size 116 * count - Number of data blocks 117 * 118 * RETURN: Number of bytes actually read. 119 * 120 * DESCRIPTION: Read from a file. 121 * 122 ******************************************************************************/ 123 124int 125acpi_os_read_file(ACPI_FILE file, void *buffer, acpi_size size, acpi_size count) 126{ 127 int length; 128 129 length = fread(buffer, size, count, file); 130 if (length < 0) { 131 perror("Error reading file"); 132 } 133 134 return (length); 135} 136 137/******************************************************************************* 138 * 139 * FUNCTION: acpi_os_write_file 140 * 141 * PARAMETERS: file - An open file descriptor 142 * buffer - Data buffer 143 * size - Data block size 144 * count - Number of data blocks 145 * 146 * RETURN: Number of bytes actually written. 147 * 148 * DESCRIPTION: Write to a file. 149 * 150 ******************************************************************************/ 151 152int 153acpi_os_write_file(ACPI_FILE file, 154 void *buffer, acpi_size size, acpi_size count) 155{ 156 int length; 157 158 length = fwrite(buffer, size, count, file); 159 if (length < 0) { 160 perror("Error writing file"); 161 } 162 163 return (length); 164} 165 166/******************************************************************************* 167 * 168 * FUNCTION: acpi_os_get_file_offset 169 * 170 * PARAMETERS: file - An open file descriptor 171 * 172 * RETURN: Current file pointer position. 173 * 174 * DESCRIPTION: Get current file offset. 175 * 176 ******************************************************************************/ 177 178long acpi_os_get_file_offset(ACPI_FILE file) 179{ 180 long offset; 181 182 offset = ftell(file); 183 return (offset); 184} 185 186/******************************************************************************* 187 * 188 * FUNCTION: acpi_os_set_file_offset 189 * 190 * PARAMETERS: file - An open file descriptor 191 * offset - New file offset 192 * from - From begin/end of file 193 * 194 * RETURN: Status 195 * 196 * DESCRIPTION: Set current file offset. 197 * 198 ******************************************************************************/ 199 200acpi_status acpi_os_set_file_offset(ACPI_FILE file, long offset, u8 from) 201{ 202 int ret = 0; 203 204 if (from == ACPI_FILE_BEGIN) { 205 ret = fseek(file, offset, SEEK_SET); 206 } 207 208 if (from == ACPI_FILE_END) { 209 ret = fseek(file, offset, SEEK_END); 210 } 211 212 if (ret < 0) { 213 return (AE_ERROR); 214 } else { 215 return (AE_OK); 216 } 217} 218