summaryrefslogtreecommitdiff
path: root/nuttx/lib/stdio/lib_rawinstream.c
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-08-12 17:37:04 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2012-08-12 17:37:04 +0000
commit4d7cbe088ed6ea14adc0672b339f1e0df4650f00 (patch)
treeb8701e6c319c085758d39c4dd7d08c380fc2088a /nuttx/lib/stdio/lib_rawinstream.c
parent66fcc36c58e7670ef627985cc37ac99dc747c02f (diff)
downloadpx4-nuttx-4d7cbe088ed6ea14adc0672b339f1e0df4650f00.tar.gz
px4-nuttx-4d7cbe088ed6ea14adc0672b339f1e0df4650f00.tar.bz2
px4-nuttx-4d7cbe088ed6ea14adc0672b339f1e0df4650f00.zip
drivers/serial/serial.c open, read, write, and poll methods will not return a short transfer or an EINTR error if a signal is received while waiting (only)
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@5022 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/lib/stdio/lib_rawinstream.c')
-rw-r--r--nuttx/lib/stdio/lib_rawinstream.c34
1 files changed, 20 insertions, 14 deletions
diff --git a/nuttx/lib/stdio/lib_rawinstream.c b/nuttx/lib/stdio/lib_rawinstream.c
index ead3116b4..aacc8f867 100644
--- a/nuttx/lib/stdio/lib_rawinstream.c
+++ b/nuttx/lib/stdio/lib_rawinstream.c
@@ -1,8 +1,8 @@
/****************************************************************************
* lib/stdio/lib_rawinstream.c
*
- * Copyright (C) 2007-2009, 2011 Gregory Nutt. All rights reserved.
- * Author: Gregory Nutt <spudmonkey@racsa.co.cr>
+ * Copyright (C) 2007-2009, 2011-2012 Gregory Nutt. All rights reserved.
+ * Author: Gregory Nutt <gnutt@nuttx.org>
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -38,7 +38,9 @@
****************************************************************************/
#include <unistd.h>
+#include <assert.h>
#include <errno.h>
+
#include "lib_internal.h"
/****************************************************************************
@@ -52,23 +54,27 @@
static int rawinstream_getc(FAR struct lib_instream_s *this)
{
FAR struct lib_rawinstream_s *rthis = (FAR struct lib_rawinstream_s *)this;
+ int nwritten;
char ch;
- if (this && rthis->fd >= 0)
+ DEBUGASSERT(this && rthis->fd >= 0);
+
+ /* Attempt to read one character */
+
+ nwritten = read(rthis->fd, &ch, 1);
+ if (nwritten == 1)
{
- int nwritten;
- do
- {
- nwritten = read(rthis->fd, &ch, 1);
- if (nwritten == 1)
- {
- this->nget++;
- return ch;
- }
- }
- while (nwritten < 0 && get_errno() == EINTR);
+ this->nget++;
+ return ch;
}
+ /* Return EOF on any failure to read from the incoming byte stream. The
+ * only expected error is EINTER meaning that the read was interrupted
+ * by a signal. A Zero return value would indicated an end-of-file
+ * confition.
+ */
+
+ DEBUGASSERT(nwritten == 0 || get_errno() == EINTR);
return EOF;
}