summaryrefslogtreecommitdiffstats
path: root/newlib/libc/stdio/setvbuf.c
diff options
context:
space:
mode:
authorThomas Fitzsimmons <fitzsim@redhat.com>2002-05-08 00:12:49 +0000
committerThomas Fitzsimmons <fitzsim@redhat.com>2002-05-08 00:12:49 +0000
commite71372faea4af670215b087a69c2b7432181a852 (patch)
tree5adf28cd89c62937515cb7362e878ec45b51d190 /newlib/libc/stdio/setvbuf.c
parent735bb7e7d7c52aedc7099411ef235fee206e7240 (diff)
downloadcygnal-e71372faea4af670215b087a69c2b7432181a852.tar.gz
cygnal-e71372faea4af670215b087a69c2b7432181a852.tar.bz2
cygnal-e71372faea4af670215b087a69c2b7432181a852.zip
* libc/include/sys/stdio.h: New file.
* libc/sys/linux/sys/stdio.h: New file. * libc/include/stdio.h: Add declarations for flockfile, ftrylockfile, and funlockfile. Include <sys/stdio.h>. * libc/stdio/clearerr.c: Add file locking. * libc/stdio/fclose.c: Likewise. * libc/stdio/feof.c: Likewise. * libc/stdio/ferror.c: Likewise. * libc/stdio/fflush.c: Likewise. * libc/stdio/fgetc.c: Likewise. * libc/stdio/fgetpos.c: Likewise. * libc/stdio/fgets.c: Likewise. * libc/stdio/fileno.c: Likewise. * libc/stdio/fputc.c: Likewise. * libc/stdio/fputs.c: Likewise. * libc/stdio/fread.c: Likewise. * libc/stdio/freopen.c: Likewise. * libc/stdio/fseek.c: Likewise. * libc/stdio/ftell.c: Likewise. * libc/stdio/fwrite.c: Likewise. * libc/stdio/getc.c: Likewise. * libc/stdio/putc.c: Likewise. * libc/stdio/setvbuf.c: Likewise. * libc/stdio/ungetc.c: Likewise. * libc/stdio/vfprintf.c: Likewise.
Diffstat (limited to 'newlib/libc/stdio/setvbuf.c')
-rw-r--r--newlib/libc/stdio/setvbuf.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/newlib/libc/stdio/setvbuf.c b/newlib/libc/stdio/setvbuf.c
index 357ea5142..d44cdba5f 100644
--- a/newlib/libc/stdio/setvbuf.c
+++ b/newlib/libc/stdio/setvbuf.c
@@ -103,6 +103,9 @@ _DEFUN (setvbuf, (fp, buf, mode, size),
register size_t size)
{
int ret = 0;
+
+ _flockfile(fp);
+
CHECK_INIT (fp);
/*
@@ -111,7 +114,10 @@ _DEFUN (setvbuf, (fp, buf, mode, size),
*/
if ((mode != _IOFBF && mode != _IOLBF && mode != _IONBF) || (int)(_POINTER_INT) size < 0)
- return (EOF);
+ {
+ _funlockfile(fp);
+ return (EOF);
+ }
/*
* Write current buffer, if any; drop read count, if any.
@@ -145,15 +151,16 @@ _DEFUN (setvbuf, (fp, buf, mode, size),
size = BUFSIZ;
}
if (buf == NULL)
- {
- /* Can't allocate it, let's try another approach */
+ {
+ /* Can't allocate it, let's try another approach */
nbf:
- fp->_flags |= __SNBF;
- fp->_w = 0;
- fp->_bf._base = fp->_p = fp->_nbuf;
- fp->_bf._size = 1;
- return (ret);
- }
+ fp->_flags |= __SNBF;
+ fp->_w = 0;
+ fp->_bf._base = fp->_p = fp->_nbuf;
+ fp->_bf._size = 1;
+ _funlockfile(fp);
+ return (ret);
+ }
fp->_flags |= __SMBF;
}
/*
@@ -186,5 +193,6 @@ nbf:
if (fp->_flags & __SWR)
fp->_w = fp->_flags & (__SLBF | __SNBF) ? 0 : size;
+ _funlockfile(fp);
return 0;
}