summaryrefslogtreecommitdiff
path: root/nuttx/lib/lib_fflush.c
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2008-02-06 01:29:23 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2008-02-06 01:29:23 +0000
commita26dad80f4d004a4a0f6effedc803b3902389b39 (patch)
tree419248121e228b55362eb1b9b2b98a85e3d96c4c /nuttx/lib/lib_fflush.c
parentc58518aeb7694de1e53d17f228cb84c401e82bb4 (diff)
downloadpx4-nuttx-a26dad80f4d004a4a0f6effedc803b3902389b39.tar.gz
px4-nuttx-a26dad80f4d004a4a0f6effedc803b3902389b39.tar.bz2
px4-nuttx-a26dad80f4d004a4a0f6effedc803b3902389b39.zip
fflush(NULL) returns error
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@636 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/lib/lib_fflush.c')
-rw-r--r--nuttx/lib/lib_fflush.c170
1 files changed, 10 insertions, 160 deletions
diff --git a/nuttx/lib/lib_fflush.c b/nuttx/lib/lib_fflush.c
index 929597ea8..d73217437 100644
--- a/nuttx/lib/lib_fflush.c
+++ b/nuttx/lib/lib_fflush.c
@@ -41,11 +41,10 @@
* Included Files
****************************************************************************/
-#include <nuttx/config.h> /* for CONFIG_STDIO_BUFFER_SIZE */
+#include <nuttx/config.h>
#include <sys/types.h>
#include <stdio.h>
-#include <unistd.h>
#include <fcntl.h>
#include <errno.h>
@@ -82,167 +81,10 @@
****************************************************************************/
/****************************************************************************
- * Name: fflush_internal
- *
- * Description:
- * The function fflush() forces a write of all user-space buffered data for
- * the given output or update stream via the stream's underlying write
- * function. The open status of the stream is unaffected.
- *
- * Parmeters:
- * stream - the stream to flush
- * bforce - flush must be complete.
- *
- * Return:
- * ERROR on failure, otherwise the number of bytes remaining in the buffer.
- * If bforce is set, then only the values ERROR and 0 will be returned.
- *
- ****************************************************************************/
-
-ssize_t fflush_internal(FILE *stream, boolean bforce)
-{
-#if CONFIG_STDIO_BUFFER_SIZE > 0
- const unsigned char *src;
- size_t bytes_written;
- size_t nbuffer;
-
- /* Return EBADF if the file is not opened for writing */
-
- if (stream->fs_filedes < 0 || (stream->fs_oflags & O_WROK) == 0)
- {
- *get_errno_ptr() = EBADF;
- return ERROR;
- }
-
- /* Make sure that we have exclusive access to the stream */
-
- lib_take_semaphore(stream);
-
- /* Make sure tht the buffer holds valid data */
-
- if (stream->fs_bufpos != stream->fs_bufstart)
- {
- /* Make sure that the buffer holds buffered write data. We do not
- * support concurrent read/write buffer usage.
- */
-
- if (stream->fs_bufread != stream->fs_bufstart)
- {
- /* The buffer holds read data... just return zero */
-
- return 0;
- }
-
- /* How many bytes of write data are used in the buffer now */
-
- nbuffer = stream->fs_bufpos - stream->fs_bufstart;
-
- /* Try to write that amount */
-
- src = stream->fs_bufstart;
- do
- {
- /* Perform the write */
-
- bytes_written = write(stream->fs_filedes, src, nbuffer);
- if (bytes_written < 0)
- {
- lib_give_semaphore(stream);
- return ERROR;
- }
-
- /* Handle partial writes. fflush() must either return with
- * an error condition or with the data successfully flushed
- * from the buffer.
- */
-
- src += bytes_written;
- nbuffer -= bytes_written;
- }
- while (bforce && nbuffer > 0);
-
- /* Reset the buffer position to the beginning of the buffer */
-
- stream->fs_bufpos = stream->fs_bufstart;
-
- /* For the case of an incomplete write, nbuffer will be non-zero
- * It will hold the number of bytes that were not written.
- * Move the data down in the buffer to handle this (rare) case
- */
-
- while (nbuffer)
- {
- *stream->fs_bufpos++ = *src++;
- --nbuffer;
- }
- }
-
- /* Restore normal access to the stream and return the number of bytes
- * remaining in the buffer.
- */
-
- lib_give_semaphore(stream);
- return stream->fs_bufpos - stream->fs_bufstart;
-#else
- /* Return no bytes remaining in the buffer */
-
- return 0;
-#endif
-}
-
-/****************************************************************************
* Global Functions
****************************************************************************/
/****************************************************************************
- * Name: lib_fflushall
- *
- * Description:
- * Called either (1) by the OS when a task exits, or (2) from fflush()
- * when a NULL stream argument is provided.
- *
- ****************************************************************************/
-
-int lib_flushall(FAR struct streamlist *list)
-{
- int lasterrno = OK;
- int ret;
-
- /* Make sure that there are streams associated with this thread */
-
- if (list)
- {
- int i;
-
- /* Process each stream in the thread's stream list */
-
- stream_semtake(list);
- for (i = 0; i < CONFIG_NFILE_STREAMS; i++)
- {
- /* If the stream is open (i.e., assigned a non-negative file
- * descriptor), then flush all of the pending write data in the
- * stream.
- */
-
- if (list->sl_streams[i].fs_filedes >= 0)
- {
- if (fflush_internal(&list->sl_streams[i], TRUE) != 0)
- {
- lasterrno = *get_errno_ptr();
- ret = ERROR;
- }
- }
- }
- stream_semgive(list);
- }
-
- /* If any flush failed, return that last failed flush */
-
- *get_errno_ptr() = lasterrno;
- return ret;
-}
-
-/****************************************************************************
* Name: fflush
*
* Description:
@@ -259,12 +101,20 @@ int lib_flushall(FAR struct streamlist *list)
int fflush(FILE *stream)
{
+ /* Is the stream argument NULL? */
+
if (!stream)
{
+ /* Yes... then this is a request to flush all streams */
+
return lib_flushall(sched_getstreams());
}
- else if (fflush_internal(stream, TRUE) != 0)
+ else if (lib_fflush(stream, TRUE) != 0)
{
+ /* An error occurred during the flush AND/OR we were unable to flush all
+ * of the buffered write data. Return EOF on failure.
+ */
+
return EOF;
}
return OK;