/***********************************************************************
* *
* This software is part of the ast package *
* Copyright (c) 1985-2011 AT&T Intellectual Property *
* and is licensed under the *
* Common Public License, Version 1.0 *
* by AT&T Intellectual Property *
* *
* A copy of the License is available at *
* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
* *
* Information and Software Systems Research *
* AT&T Research *
* Florham Park NJ *
* *
* Glenn Fowler <gsf@research.att.com> *
* David Korn <dgk@research.att.com> *
* Phong Vo <kpv@research.att.com> *
* *
***********************************************************************/
#include "sfhdr.h"
/* Internal function to do a hard read.
** This knows about discipline and memory mapping, peek read.
**
** Written by Kiem-Phong Vo.
*/
/* synchronize unseekable write streams */
#if __STD_C
static void _sfwrsync(void)
#else
static void _sfwrsync()
#endif
reg int n;
/* sync all pool heads */
{ if(p->n_sf <= 0)
continue;
f = p->sf[0];
(void)_sfflsbuf(f,-1);
}
/* and all the ones in the discrete pool */
(void)_sfflsbuf(f,-1);
}
}
#if __STD_C
#else
Sfio_t* f;
size_t n;
#endif
{
Sfoff_t r;
SFMTXDECL(f);
SFMTXENTER(f,-1);
f->bits &= ~SF_JUSTSEEK;
SFMTXRETURN(f, -1);
SFMTXRETURN(f, -1);
{ if(SFSYNC(f) < 0)
SFMTXRETURN(f, -1);
}
#ifdef MAP_TYPE
}
#endif
}
}
for(dosync = 0;;)
{ /* stream locked by sfsetfd() */
SFMTXRETURN(f, 0);
r = 0;
if(r <= 0)
goto do_except;
SFMTXRETURN(f, (ssize_t)r);
}
/* warn that a read is about to happen */
if(local)
SETLOCAL(f);
n = rv;
else if(rv < 0)
}
}
#ifdef MAP_TYPE
/* determine if we have to copy data to buffer */
}
/* actual seek location */
f->here = r;
/* before mapping, make sure we have data to map */
goto do_except;
{ r = 0; /* eof */
goto do_except;
}
}
/* make sure current position is page aligned */
{ f->here -= a;
r += a;
}
/* map minimal requirement */
r = round;
if(f->data)
for(;;)
break;
else
break;
}
}
if(f->data)
{ if(f->bits&SF_SEQUENTIAL)
f->here += r;
/* make known our seek location */
if(buf)
{ if(n > (size_t)(r-a))
n = (ssize_t)(r-a);
f->next += n;
}
SFMTXRETURN(f, n);
}
else
{ r = -1;
f->here += a;
/* reset seek pointer to its physical location */
/* make a buffer */
if(!buf)
n = f->size;
}
}
}
#endif
/* sync unseekable write streams to prevent deadlock */
{ dosync = 1;
_sfwrsync();
}
/* make sure file pointer is right */
}
errno = 0;
if(rcrv) /* pass on rcrv for possible continuations */
/* tell readf that no peeking necessary */
/* reset flags */
if(rcrv)
}
else if(SFISNULL(f))
r = 0;
{ /* try peek read */
if(r > 0)
}
}
if(errno == 0 )
if(r > 0 )
{ f->here += r;
}
}
SFMTXRETURN(f, (ssize_t)r);
}
if(local)
SETLOCAL(f);
{
case SF_ECONT :
goto do_continue;
case SF_EDONE :
SFMTXRETURN(f,n);
case SF_EDISC :
goto do_continue;
/* else fall thru */
case SF_ESTACK :
SFMTXRETURN(f, -1);
}
break;
}
}