1/* Copyright 1996,1997,1999,2001,2002,2008,2009 Alain Knaff. 2 * This file is part of mtools. 3 * 4 * Mtools is free software: you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation, either version 3 of the License, or 7 * (at your option) any later version. 8 * 9 * Mtools is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with Mtools. If not, see <http://www.gnu.org/licenses/>. 16 */ 17 18#include "sysincludes.h" 19#include "msdos.h" 20#include "stream.h" 21 22int batchmode = 0; 23 24int flush_stream(Stream_t *Stream) 25{ 26 int ret=0; 27 if(!batchmode) { 28 if(Stream->Class->flush) 29 ret |= Stream->Class->flush(Stream); 30 if(Stream->Next) 31 ret |= flush_stream(Stream->Next); 32 } 33 return ret; 34} 35 36Stream_t *copy_stream(Stream_t *Stream) 37{ 38 if(Stream) 39 Stream->refs++; 40 return Stream; 41} 42 43int free_stream(Stream_t **Stream) 44{ 45 int ret=0; 46 47 if(!*Stream) 48 return -1; 49 if(! --(*Stream)->refs){ 50 if((*Stream)->Class->flush) 51 ret |= (*Stream)->Class->flush(*Stream); 52 if((*Stream)->Class->freeFunc) 53 ret |= (*Stream)->Class->freeFunc(*Stream); 54 if((*Stream)->Next) 55 ret |= free_stream(&(*Stream)->Next); 56 Free(*Stream); 57 } else if ( (*Stream)->Next ) 58 ret |= flush_stream((*Stream)->Next); 59 *Stream = NULL; 60 return ret; 61} 62 63 64#define GET_DATA(stream, date, size, type, address) \ 65(stream)->Class->get_data( (stream), (date), (size), (type), (address) ) 66 67 68int get_data_pass_through(Stream_t *Stream, time_t *date, mt_size_t *size, 69 int *type, int *address) 70{ 71 return GET_DATA(Stream->Next, date, size, type, address); 72} 73 74int read_pass_through(Stream_t *Stream, char *buf, mt_off_t start, size_t len) 75{ 76 return READS(Stream->Next, buf, start, len); 77} 78 79int write_pass_through(Stream_t *Stream, char *buf, mt_off_t start, size_t len) 80{ 81 return WRITES(Stream->Next, buf, start, len); 82} 83 84doscp_t *get_dosConvert_pass_through(Stream_t *Stream) 85{ 86 return GET_DOSCONVERT(Stream->Next); 87} 88