sfsync.c revision 7c2fbfb345896881c631598ee3852ce9ce33fb07
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* Copyright (c) 1985-2008 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Glenn Fowler <gsf@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Phong Vo <kpv@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/* Synchronize data in buffers with the file system.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin** If f is nil, all streams are sync-ed
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin** Written by Kiem-Phong Vo.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int _sfall(void)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int _sfall()
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { /* find the next legitimate pool */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* walk the streams for _Sfpool only */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin f = p->sf[n];
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(!(origf = f) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(origf->mode == (SF_SYNCED|SF_READ) ) /* already synced */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((origf->mode&SF_RDWR) != SFMODE(origf,local) && _sfmode(origf,0,local) < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(; f; f = f->push)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((f->flags&SF_IOCHECK) && f->disc && f->disc->exceptf)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (void)(*f->disc->exceptf)(f,SF_SYNC,(Void_t*)((int)1),f->disc);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* pretend that this stream is not on a stack */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* these streams do not need synchronization */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((f->mode&SF_WRITE) && (f->next > f->data || (f->bits&SF_HOLE)) )
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { /* sync the buffer, make sure pool don't move */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if(f->next > f->data && (SFWRALL(f), SFFLSBUF(f,-1)) < 0)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { /* realize a previously created hole of 0's */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin { /* make sure the file pointer is at the right place */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin if((f->flags&SF_IOCHECK) && f->disc && f->disc->exceptf)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin (void)(*f->disc->exceptf)(f,SF_SYNC,(Void_t*)((int)0),f->disc);