Add fpurge function

This commit is contained in:
Guillem Jover 2011-05-14 17:58:08 +02:00
parent b36c59c0ed
commit 28585a58bd
4 changed files with 74 additions and 1 deletions

View File

@ -27,6 +27,7 @@ LIB_SRCS := \
err.c \
fgetln.c \
flopen.c \
fpurge.c \
getpeereid.c \
heapsort.c \
merge.c \

View File

@ -86,5 +86,7 @@ LIBBSD_0.3 {
mergesort;
radixsort;
sradixsort;
fpurge;
} LIBBSD_0.2;

View File

@ -1,5 +1,5 @@
/*
* Copyright © 2004, 2005, 2009 Guillem Jover
* Copyright © 2004, 2005, 2009, 2011 Guillem Jover
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@ -40,6 +40,8 @@ __BEGIN_DECLS
const char *fmtcheck(const char *, const char *);
char *fgetln(FILE *fp, size_t *lenp);
int fpurge(FILE *fp);
__END_DECLS
#endif

68
src/fpurge.c Normal file
View File

@ -0,0 +1,68 @@
/*
* Copyright © 2011 Guillem Jover
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. The name of the author may not be used to endorse or promote products
* derived from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
* AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
* THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
* OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
#define _GNU_SOURCE 1
#include <errno.h>
#include <stdio.h>
#include <stdio_ext.h>
#ifdef __GLIBC__
int
fpurge(FILE *fp)
{
if (fp == NULL || fileno(fp) < 0) {
errno = EBADF;
return EOF;
}
__fpurge(fp);
return 0;
}
#else
#error "Function fpurge() needs to be ported."
#endif
#ifdef TEST
int
main()
{
static FILE fp_bad;
FILE *fp;
if (fpurge(&fp_bad) == 0)
return 1;
fp = fopen("/dev/zero", "r");
if (fpurge(fp) < 0)
return 1;
fclose(fp);
return 0;
}
#endif