2 * CDE - Common Desktop Environment
4 * Copyright (c) 1993-2012, The Open Group. All rights reserved.
6 * These libraries and programs are free software; you can
7 * redistribute them and/or modify them under the terms of the GNU
8 * Lesser General Public License as published by the Free Software
9 * Foundation; either version 2 of the License, or (at your option)
12 * These libraries and programs are distributed in the hope that
13 * they will be useful, but WITHOUT ANY WARRANTY; without even the
14 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15 * PURPOSE. See the GNU Lesser General Public License for more
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with these librararies and programs; if not, write
20 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21 * Floor, Boston, MA 02110-1301 USA
23 /* $XConsortium: sfpurge.c /main/3 1995/11/01 18:33:41 rswiston $ */
24 /***************************************************************
26 * AT&T - PROPRIETARY *
28 * THIS IS PROPRIETARY SOURCE CODE LICENSED BY *
31 * Copyright (c) 1995 AT&T Corp. *
32 * All Rights Reserved *
34 * This software is licensed by AT&T Corp. *
35 * under the terms and conditions of the license in *
36 * http://www.research.att.com/orgs/ssr/book/reuse *
38 * This software was created by the *
39 * Software Engineering Research Department *
40 * AT&T Bell Laboratories *
42 * For further information contact *
43 * gsf@research.att.com *
45 ***************************************************************/
48 /* Delete all pending data in the buffer
50 ** Written by Kiem-Phong Vo (07/08/91)
54 sfpurge(reg Sfio_t* f)
62 if((mode = f->mode&SF_RDWR) != f->mode && _sfmode(f,mode,0) < 0)
65 if(f->disc == _Sfudisc)
66 (void)sfclose((*_Sfstack)(f,NIL(Sfile_t*)));
68 /* cannot purge read string streams */
69 if((f->flags&SF_STRING) && (f->mode&SF_READ) )
74 /* if memory map must be a read stream, pretend data is gone */
77 { f->here -= f->endb - f->next;
79 { (void)munmap((caddr_t)f->data,f->endb-f->data);
80 SFSK(f,f->here,0,f->disc);
81 f->endb = f->endr = f->endw =
82 f->next = f->data = NIL(uchar*);
90 switch(f->mode&~SF_LOCK)
96 if((f->flags&(SF_PROCESS|SF_RDWR)) != (SF_PROCESS|SF_RDWR))
99 /* 2-way pipe, must clear read buffer */
100 (void)_sfmode(f,SF_READ,1);
103 if(f->extent >= 0 && f->endb > f->next)
104 { f->here -= f->endb-f->next;
105 SFSK(f,f->here,0,f->disc);
107 f->endb = f->next = f->data;
114 if((f->flags&SF_IOCHECK) && f->disc && f->disc->exceptf)
115 (void)(*f->disc->exceptf)(f,SF_PURGE,f->disc);