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 * Eclipse Public License, Version 1.0 * 7 * by AT&T Intellectual Property * 8 * * 9 * A copy of the License is available at * 10 * http://www.eclipse.org/org/documents/epl-v10.html * 11 * (with md5 checksum b35adb5213ca9657e911e9befb180842) * 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 31 static int slowexcept(Sfio_t* f, int type, Void_t* v, Sfdisc_t* disc) 32 #else 33 static int slowexcept(f, type, v, disc) 34 Sfio_t* f; 35 int type; 36 Void_t* v; 37 Sfdisc_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 61 int sfdcslow(Sfio_t* f) 62 #else 63 int sfdcslow(f) 64 Sfio_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 sfset(f,SF_IOINTR,1); 82 83 return(0); 84 } 85