1 /* 2 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * 4 * This code is free software; you can redistribute it and/or modify it 5 * under the terms of the GNU General Public License version 2 only, as 6 * published by the Free Software Foundation. Oracle designates this 7 * particular file as subject to the "Classpath" exception as provided 8 * by Oracle in the LICENSE file that accompanied this code. 9 * 10 * This code is distributed in the hope that it will be useful, but WITHOUT 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 13 * version 2 for more details (a copy is included in the LICENSE file that 14 * accompanied this code). 15 * 16 * You should have received a copy of the GNU General Public License version 17 * 2 along with this work; if not, write to the Free Software Foundation, 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 19 * 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 21 * or visit www.oracle.com if you need additional information or have any 22 * questions. 23 */ 24 25 /* pngrio.c - functions for data input 26 * 27 * Copyright (c) 2018 Cosmin Truta 28 * Copyright (c) 1998-2002,2004,2006-2016,2018 Glenn Randers-Pehrson 29 * Copyright (c) 1996-1997 Andreas Dilger 30 * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. 31 * 32 * This code is released under the libpng license. 33 * For conditions of distribution and use, see the disclaimer 34 * and license in png.h 35 * 36 * This file provides a location for all input. Users who need 37 * special handling are expected to write a function that has the same 38 * arguments as this and performs a similar function, but that possibly 39 * has a different input method. Note that you shouldn't change this 40 * function, but rather write a replacement function and then make 41 * libpng use it at run time with png_set_read_fn(...). 42 */ 43 44 #include "pngpriv.h" 45 46 #ifdef PNG_READ_SUPPORTED 47 48 /* Read the data from whatever input you are using. The default routine 49 * reads from a file pointer. Note that this routine sometimes gets called 50 * with very small lengths, so you should implement some kind of simple 51 * buffering if you are using unbuffered reads. This should never be asked 52 * to read more than 64K on a 16-bit machine. 53 */ 54 void /* PRIVATE */ 55 png_read_data(png_structrp png_ptr, png_bytep data, size_t length) 56 { 57 png_debug1(4, "reading %d bytes", (int)length); 58 59 if (png_ptr->read_data_fn != NULL) 60 (*(png_ptr->read_data_fn))(png_ptr, data, length); 61 62 else 63 png_error(png_ptr, "Call to NULL read function"); 64 } 65 66 #ifdef PNG_STDIO_SUPPORTED 67 /* This is the function that does the actual reading of data. If you are 68 * not reading from a standard C stream, you should create a replacement 69 * read_data function and use it at run time with png_set_read_fn(), rather 70 * than changing the library. 71 */ 72 void PNGCBAPI 73 png_default_read_data(png_structp png_ptr, png_bytep data, size_t length) 74 { 75 size_t check; 76 77 if (png_ptr == NULL) 78 return; 79 80 /* fread() returns 0 on error, so it is OK to store this in a size_t 81 * instead of an int, which is what fread() actually returns. 82 */ 83 check = fread(data, 1, length, png_voidcast(png_FILE_p, png_ptr->io_ptr)); 84 85 if (check != length) 86 png_error(png_ptr, "Read Error"); 87 } 88 #endif 89 90 /* This function allows the application to supply a new input function 91 * for libpng if standard C streams aren't being used. 92 * 93 * This function takes as its arguments: 94 * 95 * png_ptr - pointer to a png input data structure 96 * 97 * io_ptr - pointer to user supplied structure containing info about 98 * the input functions. May be NULL. 99 * 100 * read_data_fn - pointer to a new input function that takes as its 101 * arguments a pointer to a png_struct, a pointer to 102 * a location where input data can be stored, and a 32-bit 103 * unsigned int that is the number of bytes to be read. 104 * To exit and output any fatal error messages the new write 105 * function should call png_error(png_ptr, "Error msg"). 106 * May be NULL, in which case libpng's default function will 107 * be used. 108 */ 109 void PNGAPI 110 png_set_read_fn(png_structrp png_ptr, png_voidp io_ptr, 111 png_rw_ptr read_data_fn) 112 { 113 if (png_ptr == NULL) 114 return; 115 116 png_ptr->io_ptr = io_ptr; 117 118 #ifdef PNG_STDIO_SUPPORTED 119 if (read_data_fn != NULL) 120 png_ptr->read_data_fn = read_data_fn; 121 122 else 123 png_ptr->read_data_fn = png_default_read_data; 124 #else 125 png_ptr->read_data_fn = read_data_fn; 126 #endif 127 128 #ifdef PNG_WRITE_SUPPORTED 129 /* It is an error to write to a read device */ 130 if (png_ptr->write_data_fn != NULL) 131 { 132 png_ptr->write_data_fn = NULL; 133 png_warning(png_ptr, 134 "Can't set both read_data_fn and write_data_fn in the" 135 " same structure"); 136 } 137 #endif 138 139 #ifdef PNG_WRITE_FLUSH_SUPPORTED 140 png_ptr->output_flush_fn = NULL; 141 #endif 142 } 143 #endif /* READ */