1/*********************************************************************** 2* * 3* This software is part of the ast package * 4* Copyright (c) 1985-2011 AT&T Intellectual Property * 5* and is licensed under the * 6* Common Public License, Version 1.0 * 7* by AT&T Intellectual Property * 8* * 9* A copy of the License is available at * 10* http://www.opensource.org/licenses/cpl1.0.txt * 11* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) * 12* * 13* Information and Software Systems Research * 14* AT&T Research * 15* Florham Park NJ * 16* * 17* Glenn Fowler <gsf@research.att.com> * 18* David Korn <dgk@research.att.com> * 19* Phong Vo <kpv@research.att.com> * 20* * 21***********************************************************************/ 22#include "sfdchdr.h" 23 24/* Make a stream op return immediately on interrupts. 25** This is useful on slow streams (hence the name). 26** 27** Written by Glenn Fowler (03/18/1998). 28*/ 29 30#if __STD_C 31static int slowexcept(Sfio_t* f, int type, Void_t* v, Sfdisc_t* disc) 32#else 33static int slowexcept(f, type, v, disc) 34Sfio_t* f; 35int type; 36Void_t* v; 37Sfdisc_t* disc; 38#endif 39{ 40 NOTUSED(f); 41 NOTUSED(v); 42 NOTUSED(disc); 43 44 switch (type) 45 { 46 case SF_FINAL: 47 case SF_DPOP: 48 free(disc); 49 break; 50 case SF_READ: 51 case SF_WRITE: 52 if (errno == EINTR) 53 return(-1); 54 break; 55 } 56 57 return(0); 58} 59 60#if __STD_C 61int sfdcslow(Sfio_t* f) 62#else 63int sfdcslow(f) 64Sfio_t* f; 65#endif 66{ 67 Sfdisc_t* disc; 68 69 if(!(disc = (Sfdisc_t*)malloc(sizeof(Sfdisc_t))) ) 70 return(-1); 71 72 disc->readf = NIL(Sfread_f); 73 disc->writef = NIL(Sfwrite_f); 74 disc->seekf = NIL(Sfseek_f); 75 disc->exceptf = slowexcept; 76 77 if(sfdisc(f,disc) != disc) 78 { free(disc); 79 return(-1); 80 } 81 82 return(0); 83} 84