1 /*********************************************************************** 2 * * 3 * This software is part of the ast package * 4 * Copyright (c) 1985-2010 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 "sfhdr.h" 23 24 /* Invoke event handlers for a stream 25 ** 26 ** Written by Kiem-Phong Vo. 27 */ 28 29 #if __STD_C 30 static int _sfraiseall(int type, Void_t* data) 31 #else 32 static int _sfraiseall(type, data) 33 int type; /* type of event */ 34 Void_t* data; /* associated data */ 35 #endif 36 { 37 Sfio_t *f; 38 Sfpool_t *p, *next; 39 int n, rv; 40 41 rv = 0; 42 for(p = &_Sfpool; p; p = next) 43 { 44 for(next = p->next; next; next = next->next) 45 if(next->n_sf > 0) 46 break; 47 for(n = 0; n < p->n_sf; ++n) 48 { f = p->sf[n]; 49 if(sfraise(f, type, data) < 0) 50 rv -= 1; 51 } 52 } 53 return rv; 54 } 55 56 #if __STD_C 57 int sfraise(Sfio_t* f, int type, Void_t* data) 58 #else 59 int sfraise(f, type, data) 60 Sfio_t* f; /* stream */ 61 int type; /* type of event */ 62 Void_t* data; /* associated data */ 63 #endif 64 { 65 reg Sfdisc_t *disc, *next, *d; 66 reg int local, rv; 67 SFMTXDECL(f); 68 69 if(!f) 70 return _sfraiseall(type,data); 71 72 SFMTXENTER(f, -1); 73 74 GETLOCAL(f,local); 75 if(!SFKILLED(f) && 76 !(local && 77 (type == SF_NEW || type == SF_CLOSING || 78 type == SF_FINAL || type == SF_ATEXIT)) && 79 SFMODE(f,local) != (f->mode&SF_RDWR) && _sfmode(f,0,local) < 0) 80 SFMTXRETURN(f, -1); 81 SFLOCK(f,local); 82 83 for(disc = f->disc; disc; ) 84 { next = disc->disc; 85 if(type == SF_FINAL) 86 f->disc = next; 87 88 if(disc->exceptf) 89 { SFOPEN(f,0); 90 if((rv = (*disc->exceptf)(f,type,data,disc)) != 0 ) 91 SFMTXRETURN(f, rv); 92 SFLOCK(f,0); 93 } 94 95 if((disc = next) ) 96 { /* make sure that "next" hasn't been popped */ 97 for(d = f->disc; d; d = d->disc) 98 if(d == disc) 99 break; 100 if(!d) 101 disc = f->disc; 102 } 103 } 104 105 SFOPEN(f,local); 106 SFMTXRETURN(f, 0); 107 } 108