Adds OS internal function nx_write() which is functionally equivalent to write() except that it does not set the errno variable and do not cause cancellation points.
This commit is contained in:
parent
af072d52bc
commit
a00d8e16a1
@ -299,18 +299,19 @@ static ssize_t loop_write(FAR struct inode *inode,
|
|||||||
ret = lseek(dev->fd, offset, SEEK_SET);
|
ret = lseek(dev->fd, offset, SEEK_SET);
|
||||||
if (ret == (off_t)-1)
|
if (ret == (off_t)-1)
|
||||||
{
|
{
|
||||||
_err("ERROR: Seek failed for offset=%d: %d\n", (int)offset, get_errno());
|
_err("ERROR: Seek failed for offset=%d: %d\n",
|
||||||
|
(int)offset, get_errno());
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Then write the requested number of sectors to that position */
|
/* Then write the requested number of sectors to that position */
|
||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
nbyteswritten = write(dev->fd, buffer, nsectors * dev->sectsize);
|
nbyteswritten = nx_write(dev->fd, buffer, nsectors * dev->sectsize);
|
||||||
if (nbyteswritten < 0 && get_errno() != EINTR)
|
if (nbyteswritten < 0 && nbyteswritten != -EINTR)
|
||||||
{
|
{
|
||||||
_err("ERROR: Write failed: %d\n", get_errno());
|
_err("ERROR: nx_write failed: %d\n", nbyteswritten);
|
||||||
return -get_errno();
|
return nbyteswritten;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while (nbyteswritten < 0);
|
while (nbyteswritten < 0);
|
||||||
|
@ -49,6 +49,7 @@
|
|||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
#include <nuttx/kmalloc.h>
|
#include <nuttx/kmalloc.h>
|
||||||
|
#include <nuttx/fs/fs.h>
|
||||||
#include <nuttx/fs/ioctl.h>
|
#include <nuttx/fs/ioctl.h>
|
||||||
#include <nuttx/mtd/mtd.h>
|
#include <nuttx/mtd/mtd.h>
|
||||||
|
|
||||||
@ -204,7 +205,7 @@ static ssize_t filemtd_write(FAR struct file_dev_s *priv, size_t offset,
|
|||||||
if (buflen == 0)
|
if (buflen == 0)
|
||||||
{
|
{
|
||||||
lseek(priv->fd, seekpos, SEEK_SET);
|
lseek(priv->fd, seekpos, SEEK_SET);
|
||||||
write(priv->fd, buf, sizeof(buf));
|
(void)nx_write(priv->fd, buf, sizeof(buf));
|
||||||
seekpos += sizeof(buf);
|
seekpos += sizeof(buf);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -214,7 +215,7 @@ static ssize_t filemtd_write(FAR struct file_dev_s *priv, size_t offset,
|
|||||||
if (buflen != 0)
|
if (buflen != 0)
|
||||||
{
|
{
|
||||||
lseek(priv->fd, seekpos, SEEK_SET);
|
lseek(priv->fd, seekpos, SEEK_SET);
|
||||||
write(priv->fd, buf, sizeof(buf));
|
(void)nx_write(priv->fd, buf, sizeof(buf));
|
||||||
}
|
}
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
@ -281,7 +282,7 @@ static int filemtd_erase(FAR struct mtd_dev_s *dev, off_t startblock,
|
|||||||
memset(buffer, CONFIG_FILEMTD_ERASESTATE, sizeof(buffer));
|
memset(buffer, CONFIG_FILEMTD_ERASESTATE, sizeof(buffer));
|
||||||
while (nbytes)
|
while (nbytes)
|
||||||
{
|
{
|
||||||
write(priv->fd, buffer, sizeof(buffer));
|
(void)nx_write(priv->fd, buffer, sizeof(buffer));
|
||||||
nbytes -= sizeof(buffer);
|
nbytes -= sizeof(buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -333,7 +334,7 @@ static ssize_t filemtd_bread(FAR struct mtd_dev_s *dev, off_t startblock,
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static ssize_t filemtd_bwrite(FAR struct mtd_dev_s *dev, off_t startblock,
|
static ssize_t filemtd_bwrite(FAR struct mtd_dev_s *dev, off_t startblock,
|
||||||
size_t nblocks, FAR const uint8_t *buf)
|
size_t nblocks, FAR const uint8_t *buf)
|
||||||
{
|
{
|
||||||
FAR struct file_dev_s *priv = (FAR struct file_dev_s *)dev;
|
FAR struct file_dev_s *priv = (FAR struct file_dev_s *)dev;
|
||||||
off_t offset;
|
off_t offset;
|
||||||
@ -396,7 +397,7 @@ static ssize_t filemtd_byteread(FAR struct mtd_dev_s *dev, off_t offset,
|
|||||||
|
|
||||||
#ifdef CONFIG_MTD_BYTE_WRITE
|
#ifdef CONFIG_MTD_BYTE_WRITE
|
||||||
static ssize_t file_bytewrite(FAR struct mtd_dev_s *dev, off_t offset,
|
static ssize_t file_bytewrite(FAR struct mtd_dev_s *dev, off_t offset,
|
||||||
size_t nbytes, FAR const uint8_t *buf)
|
size_t nbytes, FAR const uint8_t *buf)
|
||||||
{
|
{
|
||||||
FAR struct file_dev_s *priv = (FAR struct file_dev_s *)dev;
|
FAR struct file_dev_s *priv = (FAR struct file_dev_s *)dev;
|
||||||
off_t maxoffset;
|
off_t maxoffset;
|
||||||
|
@ -118,8 +118,12 @@ void cc3000_resume(void)
|
|||||||
|
|
||||||
long cc3000_write(uint8_t *pUserBuffer, uint16_t usLength)
|
long cc3000_write(uint8_t *pUserBuffer, uint16_t usLength)
|
||||||
{
|
{
|
||||||
|
ssize_t ret;
|
||||||
|
|
||||||
DEBUGASSERT(spiconf.cc3000fd >= 0);
|
DEBUGASSERT(spiconf.cc3000fd >= 0);
|
||||||
return write(spiconf.cc3000fd, pUserBuffer, usLength) == usLength ? 0 : -errno;
|
|
||||||
|
ret = nx_write(spiconf.cc3000fd, pUserBuffer, usLength);
|
||||||
|
return ret >= 0 ? 0 : ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -65,8 +65,24 @@
|
|||||||
*
|
*
|
||||||
* Description:
|
* Description:
|
||||||
* Equivalent to the standard write() function except that is accepts a
|
* Equivalent to the standard write() function except that is accepts a
|
||||||
* struct file instance instead of a file descriptor. Currently used
|
* struct file instance instead of a file descriptor. It is functionally
|
||||||
* only by aio_write();
|
* equivalent to write() except that in addition to the differences in
|
||||||
|
* input paramters:
|
||||||
|
*
|
||||||
|
* - It does not modify the errno variable,
|
||||||
|
* - It is not a cancellation point, and
|
||||||
|
* - It does not handle socket descriptors.
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* filep - Instance of struct file to use with the write
|
||||||
|
* buf - Data to write
|
||||||
|
* nbytes - Length of data to write
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* On success, the number of bytes written are returned (zero indicates
|
||||||
|
* nothing was written). On any failure, a negated errno value is returned
|
||||||
|
* (see comments withwrite() for a description of the appropriate errno
|
||||||
|
* values).
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
@ -94,6 +110,81 @@ ssize_t file_write(FAR struct file *filep, FAR const void *buf, size_t nbytes)
|
|||||||
return inode->u.i_ops->write(filep, buf, nbytes);
|
return inode->u.i_ops->write(filep, buf, nbytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: nx_write
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* nx_write() writes up to nytes bytes to the file referenced by the file
|
||||||
|
* descriptor fd from the buffer starting at buf. nx_write() is an
|
||||||
|
* internal OS function. It is functionally equivalent to write() except
|
||||||
|
* that:
|
||||||
|
*
|
||||||
|
* - It does not modify the errno variable, and
|
||||||
|
* - It is not a cancellation point.
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* fd - file descriptor (or socket descriptor) to write to
|
||||||
|
* buf - Data to write
|
||||||
|
* nbytes - Length of data to write
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* On success, the number of bytes written are returned (zero indicates
|
||||||
|
* nothing was written). On any failure, a negated errno value is returned
|
||||||
|
* (see comments withwrite() for a description of the appropriate errno
|
||||||
|
* values).
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
ssize_t nx_write(int fd, FAR const void *buf, size_t nbytes)
|
||||||
|
{
|
||||||
|
#if CONFIG_NFILE_DESCRIPTORS > 0
|
||||||
|
FAR struct file *filep;
|
||||||
|
#endif
|
||||||
|
ssize_t ret;
|
||||||
|
|
||||||
|
if (buf == NULL)
|
||||||
|
{
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Did we get a valid file descriptor? */
|
||||||
|
|
||||||
|
#if CONFIG_NFILE_DESCRIPTORS > 0
|
||||||
|
if ((unsigned int)fd >= CONFIG_NFILE_DESCRIPTORS)
|
||||||
|
#endif
|
||||||
|
{
|
||||||
|
#if defined(CONFIG_NET_TCP) && CONFIG_NSOCKET_DESCRIPTORS > 0
|
||||||
|
/* Write to a socket descriptor is equivalent to send with flags == 0. */
|
||||||
|
|
||||||
|
ret = nx_send(fd, buf, nbytes, 0);
|
||||||
|
#else
|
||||||
|
ret = -EBADF;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#if CONFIG_NFILE_DESCRIPTORS > 0
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* The descriptor is in the right range to be a file descriptor..
|
||||||
|
* write to the file. Note that fs_getfilep() will set the errno on
|
||||||
|
* failure.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ret = (ssize_t)fs_getfilep(fd, &filep);
|
||||||
|
if (ret >= 0)
|
||||||
|
{
|
||||||
|
/* Perform the write operation using the file descriptor as an
|
||||||
|
* index. Note that file_write() will set the errno on failure.
|
||||||
|
*/
|
||||||
|
|
||||||
|
ret = file_write(filep, buf, nbytes);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: write
|
* Name: write
|
||||||
*
|
*
|
||||||
@ -101,13 +192,13 @@ ssize_t file_write(FAR struct file *filep, FAR const void *buf, size_t nbytes)
|
|||||||
* write() writes up to nytes bytes to the file referenced by the file
|
* write() writes up to nytes bytes to the file referenced by the file
|
||||||
* descriptor fd from the buffer starting at buf.
|
* descriptor fd from the buffer starting at buf.
|
||||||
*
|
*
|
||||||
* Parameters:
|
* Input Parameters:
|
||||||
* fd file descriptor (or socket descriptor) to write to
|
* fd - file descriptor (or socket descriptor) to write to
|
||||||
* buf Data to write
|
* buf - Data to write
|
||||||
* nbytes Length of data to write
|
* nbytes - Length of data to write
|
||||||
*
|
*
|
||||||
* Returned Value:
|
* Returned Value:
|
||||||
* On success, the number of bytes written are returned (zero indicates
|
* On success, the number of bytes written are returned (zero indicates
|
||||||
* nothing was written). On error, -1 is returned, and errno is set appro-
|
* nothing was written). On error, -1 is returned, and errno is set appro-
|
||||||
* priately:
|
* priately:
|
||||||
*
|
*
|
||||||
@ -140,78 +231,25 @@ ssize_t file_write(FAR struct file *filep, FAR const void *buf, size_t nbytes)
|
|||||||
* signal. (Thus, the write return value is seen only if the program
|
* signal. (Thus, the write return value is seen only if the program
|
||||||
* catches, blocks or ignores this signal.)
|
* catches, blocks or ignores this signal.)
|
||||||
*
|
*
|
||||||
* Assumptions:
|
****************************************************************************/
|
||||||
*
|
|
||||||
********************************************************************************************/
|
|
||||||
|
|
||||||
ssize_t write(int fd, FAR const void *buf, size_t nbytes)
|
ssize_t write(int fd, FAR const void *buf, size_t nbytes)
|
||||||
{
|
{
|
||||||
#if CONFIG_NFILE_DESCRIPTORS > 0
|
|
||||||
FAR struct file *filep;
|
|
||||||
#endif
|
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
|
|
||||||
/* write() is a cancellation point */
|
/* write() is a cancellation point */
|
||||||
|
|
||||||
(void)enter_cancellation_point();
|
(void)enter_cancellation_point();
|
||||||
|
|
||||||
if (buf == NULL)
|
/* Let nx_write() do all of the work */
|
||||||
|
|
||||||
|
ret = nx_write(fd, buf, nbytes);
|
||||||
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
ret = -EINVAL;
|
set_errno(ret);
|
||||||
goto errout;
|
ret = ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Did we get a valid file descriptor? */
|
|
||||||
|
|
||||||
#if CONFIG_NFILE_DESCRIPTORS > 0
|
|
||||||
if ((unsigned int)fd >= CONFIG_NFILE_DESCRIPTORS)
|
|
||||||
#endif
|
|
||||||
{
|
|
||||||
#if defined(CONFIG_NET_TCP) && CONFIG_NSOCKET_DESCRIPTORS > 0
|
|
||||||
/* Write to a socket descriptor is equivalent to send with flags == 0. */
|
|
||||||
|
|
||||||
ret = nx_send(fd, buf, nbytes, 0);
|
|
||||||
if (ret < 0)
|
|
||||||
{
|
|
||||||
goto errout;
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
ret = -EBADF;
|
|
||||||
goto errout;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
#if CONFIG_NFILE_DESCRIPTORS > 0
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* The descriptor is in the right range to be a file descriptor..
|
|
||||||
* write to the file. Note that fs_getfilep() will set the errno on
|
|
||||||
* failure.
|
|
||||||
*/
|
|
||||||
|
|
||||||
ret = (ssize_t)fs_getfilep(fd, &filep);
|
|
||||||
if (ret < 0)
|
|
||||||
{
|
|
||||||
goto errout;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Perform the write operation using the file descriptor as an
|
|
||||||
* index. Note that file_write() will set the errno on failure.
|
|
||||||
*/
|
|
||||||
|
|
||||||
ret = file_write(filep, buf, nbytes);
|
|
||||||
if (ret < 0)
|
|
||||||
{
|
|
||||||
goto errout;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
leave_cancellation_point();
|
leave_cancellation_point();
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
errout:
|
|
||||||
set_errno(-ret);
|
|
||||||
leave_cancellation_point();
|
|
||||||
return ERROR;
|
|
||||||
}
|
}
|
||||||
|
@ -84,12 +84,14 @@
|
|||||||
|
|
||||||
#if defined(CONFIG_BUILD_FLAT) || defined(__KERNEL__)
|
#if defined(CONFIG_BUILD_FLAT) || defined(__KERNEL__)
|
||||||
# define _NX_WRITE(f,b,s) nx_write(s,b,s)
|
# define _NX_WRITE(f,b,s) nx_write(s,b,s)
|
||||||
# define _NX_ERRNO(r) (-(r))
|
# define _NX_GETERRNO(r) (-(r))
|
||||||
# define _NX_ERRVAL(r) (r)
|
# define _NX_SETERRNO(r) set_errno(-(r))
|
||||||
|
# define _NX_GETERRVAL(r) (r)
|
||||||
#else
|
#else
|
||||||
# define _NX_WRITE(f,b,s) rite(s,b,s)
|
# define _NX_WRITE(f,b,s) write(s,b,s)
|
||||||
# define _NX_ERRNO(r) errno
|
# define _NX_GETERRNO(r) errno
|
||||||
# define _NX_ERRVAL(r) (-errno)
|
# define _NX_SETERRNO(r)
|
||||||
|
# define _NX_GETERRVAL(r) (-errno)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Stream flags for the fs_flags field of in struct file_struct */
|
/* Stream flags for the fs_flags field of in struct file_struct */
|
||||||
@ -935,6 +937,33 @@ ssize_t file_read(FAR struct file *filep, FAR void *buf, size_t nbytes);
|
|||||||
ssize_t file_write(FAR struct file *filep, FAR const void *buf, size_t nbytes);
|
ssize_t file_write(FAR struct file *filep, FAR const void *buf, size_t nbytes);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/****************************************************************************
|
||||||
|
* Name: nx_write
|
||||||
|
*
|
||||||
|
* Description:
|
||||||
|
* nx_write() writes up to nytes bytes to the file referenced by the file
|
||||||
|
* descriptor fd from the buffer starting at buf. nx_write() is an
|
||||||
|
* internal OS function. It is functionally equivalent to write() except
|
||||||
|
* that:
|
||||||
|
*
|
||||||
|
* - It does not modify the errno variable, and
|
||||||
|
* - It is not a cancellation point.
|
||||||
|
*
|
||||||
|
* Input Parameters:
|
||||||
|
* fd - file descriptor (or socket descriptor) to write to
|
||||||
|
* buf - Data to write
|
||||||
|
* nbytes - Length of data to write
|
||||||
|
*
|
||||||
|
* Returned Value:
|
||||||
|
* On success, the number of bytes written are returned (zero indicates
|
||||||
|
* nothing was written). On any failure, a negated errno value is returned
|
||||||
|
* (see comments withwrite() for a description of the appropriate errno
|
||||||
|
* values).
|
||||||
|
*
|
||||||
|
****************************************************************************/
|
||||||
|
|
||||||
|
ssize_t nx_write(int fd, FAR const void *buf, size_t nbytes);
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Name: file_pread
|
* Name: file_pread
|
||||||
*
|
*
|
||||||
|
@ -76,14 +76,14 @@
|
|||||||
# define _NX_SEND(s,b,l,f) nx_send(s,b,l,f)
|
# define _NX_SEND(s,b,l,f) nx_send(s,b,l,f)
|
||||||
# define _NX_RECV(s,b,l,f) nx_recv(s,b,l,f)
|
# define _NX_RECV(s,b,l,f) nx_recv(s,b,l,f)
|
||||||
# define _NX_RECVFROM(s,b,l,f,a,n) nx_recvfrom(s,b,l,f,a,n)
|
# define _NX_RECVFROM(s,b,l,f,a,n) nx_recvfrom(s,b,l,f,a,n)
|
||||||
# define _NX_ERRNO(r) (-(r))
|
# define _NX_GETERRNO(r) (-(r))
|
||||||
# define _NX_ERRVAL(r) (r)
|
# define _NX_GETERRVAL(r) (r)
|
||||||
#else
|
#else
|
||||||
# define _NX_SEND(s,b,l,f) send(s,b,l,f)
|
# define _NX_SEND(s,b,l,f) send(s,b,l,f)
|
||||||
# define _NX_RECV(s,b,l,f) recv(s,b,l,f)
|
# define _NX_RECV(s,b,l,f) recv(s,b,l,f)
|
||||||
# define _NX_RECVFROM(s,b,l,f,a,n) recvfrom(s,b,l,f,a,n)
|
# define _NX_RECVFROM(s,b,l,f,a,n) recvfrom(s,b,l,f,a,n)
|
||||||
# define _NX_ERRNO(r) errno
|
# define _NX_GETERRNO(r) errno
|
||||||
# define _NX_ERRVAL(r) (-errno)
|
# define _NX_GETERRVAL(r) (-errno)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Socket descriptors are the index into the TCB sockets list, offset by the
|
/* Socket descriptors are the index into the TCB sockets list, offset by the
|
||||||
|
@ -45,26 +45,12 @@
|
|||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <nuttx/fs/fs.h>
|
||||||
|
|
||||||
#include "libc.h"
|
#include "libc.h"
|
||||||
|
|
||||||
#if CONFIG_NSOCKET_DESCRIPTORS > 0 || CONFIG_NFILE_DESCRIPTORS > 0
|
#if CONFIG_NSOCKET_DESCRIPTORS > 0 || CONFIG_NFILE_DESCRIPTORS > 0
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private types
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Data
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Public Data
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
|
||||||
* Private Functions
|
|
||||||
****************************************************************************/
|
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Public Functions
|
* Public Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -217,7 +203,7 @@ ssize_t sendfile(int outfd, int infd, off_t *offset, size_t count)
|
|||||||
{
|
{
|
||||||
/* Write the buffer of data to the outfd */
|
/* Write the buffer of data to the outfd */
|
||||||
|
|
||||||
nbyteswritten = write(outfd, wrbuffer, nbytesread);
|
nbyteswritten = _NX_WRITE(outfd, wrbuffer, nbytesread);
|
||||||
|
|
||||||
/* Check for a complete (or parial) write. write() should not
|
/* Check for a complete (or parial) write. write() should not
|
||||||
* return zero.
|
* return zero.
|
||||||
@ -242,6 +228,8 @@ ssize_t sendfile(int outfd, int infd, off_t *offset, size_t count)
|
|||||||
|
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
int errcode = _NX_GETERRNO(nbyteswritten);
|
||||||
|
|
||||||
/* Check for a read ERROR. EINTR is a special case. This
|
/* Check for a read ERROR. EINTR is a special case. This
|
||||||
* function should break out and return an error if EINTR
|
* function should break out and return an error if EINTR
|
||||||
* is returned and no data has been transferred. But what
|
* is returned and no data has been transferred. But what
|
||||||
@ -250,11 +238,12 @@ ssize_t sendfile(int outfd, int infd, off_t *offset, size_t count)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef CONFIG_DISABLE_SIGNALS
|
#ifndef CONFIG_DISABLE_SIGNALS
|
||||||
if (errno != EINTR || ntransferred == 0)
|
if (errcode != EINTR || ntransferred == 0)
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
/* Write error. Break out and return the error condition */
|
/* Write error. Break out and return the error condition */
|
||||||
|
|
||||||
|
_NX_SETERRNO(nbyteswritten);
|
||||||
ntransferred = ERROR;
|
ntransferred = ERROR;
|
||||||
endxfr = true;
|
endxfr = true;
|
||||||
break;
|
break;
|
||||||
|
@ -255,9 +255,9 @@ static int dns_recv_response(int sd, FAR struct sockaddr *addr,
|
|||||||
ret = _NX_RECV(sd, buffer, RECV_BUFFER_SIZE, 0);
|
ret = _NX_RECV(sd, buffer, RECV_BUFFER_SIZE, 0);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
errcode = _NX_ERRNO(ret);
|
errcode = -_NX_GETERRNO(ret);
|
||||||
nerr("ERROR: recv failed: %d\n", errcode);
|
nerr("ERROR: recv failed: %d\n", errcode);
|
||||||
return -errcode;
|
return errcode;
|
||||||
}
|
}
|
||||||
|
|
||||||
hdr = (FAR struct dns_header_s *)buffer;
|
hdr = (FAR struct dns_header_s *)buffer;
|
||||||
|
@ -52,7 +52,8 @@
|
|||||||
* Name: fwrite
|
* Name: fwrite
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
size_t fwrite(FAR const void *ptr, size_t size, size_t n_items, FAR FILE *stream)
|
size_t fwrite(FAR const void *ptr, size_t size, size_t n_items,
|
||||||
|
FAR FILE *stream)
|
||||||
{
|
{
|
||||||
size_t full_size = n_items * (size_t)size;
|
size_t full_size = n_items * (size_t)size;
|
||||||
ssize_t bytes_written;
|
ssize_t bytes_written;
|
||||||
|
@ -129,7 +129,7 @@ ssize_t lib_fflush(FAR FILE *stream, bool bforce)
|
|||||||
{
|
{
|
||||||
/* Perform the write */
|
/* Perform the write */
|
||||||
|
|
||||||
bytes_written = write(stream->fs_fd, src, nbuffer);
|
bytes_written = _NX_WRITE(stream->fs_fd, src, nbuffer);
|
||||||
if (bytes_written < 0)
|
if (bytes_written < 0)
|
||||||
{
|
{
|
||||||
/* Write failed. The cause of the failure is in 'errno'.
|
/* Write failed. The cause of the failure is in 'errno'.
|
||||||
@ -137,7 +137,7 @@ ssize_t lib_fflush(FAR FILE *stream, bool bforce)
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
stream->fs_flags |= __FS_FLAG_ERROR;
|
stream->fs_flags |= __FS_FLAG_ERROR;
|
||||||
ret = -get_errno();
|
ret = _NX_GETERRVAL(bytes_written);
|
||||||
goto errout_with_sem;
|
goto errout_with_sem;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,6 +46,8 @@
|
|||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <nuttx/fs/fs.h>
|
||||||
|
|
||||||
#include "libc.h"
|
#include "libc.h"
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -84,7 +86,15 @@ ssize_t lib_fwrite(FAR const void *ptr, size_t count, FAR FILE *stream)
|
|||||||
|
|
||||||
if (stream->fs_bufstart == NULL)
|
if (stream->fs_bufstart == NULL)
|
||||||
{
|
{
|
||||||
ret = write(stream->fs_fd, ptr, count);
|
ret = _NX_WRITE(stream->fs_fd, ptr, count);
|
||||||
|
#if defined(CONFIG_BUILD_FLAT) || defined(__KERNEL__)
|
||||||
|
if (ret < 0)
|
||||||
|
{
|
||||||
|
_NX_SETERRNO((int)-ret);
|
||||||
|
ret = ERROR;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
goto errout;
|
goto errout;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -167,10 +177,11 @@ errout:
|
|||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
{
|
{
|
||||||
ssize_t ret = write(stream->fs_fd, ptr, count);
|
ssize_t ret = _NX_WRITE(stream->fs_fd, ptr, count);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
{
|
{
|
||||||
stream->fs_flags |= __FS_FLAG_ERROR;
|
stream->fs_flags |= __FS_FLAG_ERROR;
|
||||||
|
_NX_SETERRNO(ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -37,10 +37,14 @@
|
|||||||
* Included Files
|
* Included Files
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <nuttx/fs/fs.h>
|
||||||
|
|
||||||
#include "libc.h"
|
#include "libc.h"
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -54,8 +58,9 @@
|
|||||||
static void rawsostream_putc(FAR struct lib_sostream_s *this, int ch)
|
static void rawsostream_putc(FAR struct lib_sostream_s *this, int ch)
|
||||||
{
|
{
|
||||||
FAR struct lib_rawsostream_s *rthis = (FAR struct lib_rawsostream_s *)this;
|
FAR struct lib_rawsostream_s *rthis = (FAR struct lib_rawsostream_s *)this;
|
||||||
int nwritten;
|
|
||||||
char buffer = ch;
|
char buffer = ch;
|
||||||
|
int nwritten;
|
||||||
|
int errcode;
|
||||||
|
|
||||||
DEBUGASSERT(this && rthis->fd >= 0);
|
DEBUGASSERT(this && rthis->fd >= 0);
|
||||||
|
|
||||||
@ -65,7 +70,7 @@ static void rawsostream_putc(FAR struct lib_sostream_s *this, int ch)
|
|||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
nwritten = write(rthis->fd, &buffer, 1);
|
nwritten = _NX_WRITE(rthis->fd, &buffer, 1);
|
||||||
if (nwritten == 1)
|
if (nwritten == 1)
|
||||||
{
|
{
|
||||||
this->nput++;
|
this->nput++;
|
||||||
@ -74,12 +79,13 @@ static void rawsostream_putc(FAR struct lib_sostream_s *this, int ch)
|
|||||||
|
|
||||||
/* The only expected error is EINTR, meaning that the write operation
|
/* The only expected error is EINTR, meaning that the write operation
|
||||||
* was awakened by a signal. Zero would not be a valid return value
|
* was awakened by a signal. Zero would not be a valid return value
|
||||||
* from write().
|
* from _NX_WRITE().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
errcode = _NX_GETERRNO(nwritten);
|
||||||
DEBUGASSERT(nwritten < 0);
|
DEBUGASSERT(nwritten < 0);
|
||||||
}
|
}
|
||||||
while (get_errno() == EINTR);
|
while (errcode == EINTR);
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* libc/stdio/lib_rawoutstream.c
|
* libc/stdio/lib_rawsostream.c
|
||||||
*
|
*
|
||||||
* Copyright (C) 2007-2009, 2011-2012, 2014 Gregory Nutt. All rights reserved.
|
* Copyright (C) 2007-2009, 2011-2012, 2014 Gregory Nutt. All rights reserved.
|
||||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||||
@ -37,10 +37,14 @@
|
|||||||
* Included Files
|
* Included Files
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
|
#include <nuttx/config.h>
|
||||||
|
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include <nuttx/fs/fs.h>
|
||||||
|
|
||||||
#include "libc.h"
|
#include "libc.h"
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
@ -66,7 +70,7 @@ static void rawoutstream_putc(FAR struct lib_outstream_s *this, int ch)
|
|||||||
|
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
nwritten = write(rthis->fd, &buffer, 1);
|
nwritten = _NX_WRITE(rthis->fd, &buffer, 1);
|
||||||
if (nwritten == 1)
|
if (nwritten == 1)
|
||||||
{
|
{
|
||||||
this->nput++;
|
this->nput++;
|
||||||
@ -75,10 +79,10 @@ static void rawoutstream_putc(FAR struct lib_outstream_s *this, int ch)
|
|||||||
|
|
||||||
/* The only expected error is EINTR, meaning that the write operation
|
/* The only expected error is EINTR, meaning that the write operation
|
||||||
* was awakened by a signal. Zero or values > 1 would not be valid
|
* was awakened by a signal. Zero or values > 1 would not be valid
|
||||||
* return values from write().
|
* return values from _NX_WRITE().
|
||||||
*/
|
*/
|
||||||
|
|
||||||
errcode = get_errno();
|
errcode = _NX_GETERRNO(nwritten);
|
||||||
DEBUGASSERT(nwritten < 0);
|
DEBUGASSERT(nwritten < 0);
|
||||||
}
|
}
|
||||||
while (errcode == EINTR);
|
while (errcode == EINTR);
|
||||||
|
@ -38,7 +38,6 @@
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
#include <nuttx/config.h>
|
#include <nuttx/config.h>
|
||||||
#if defined(CONFIG_NET) && defined(CONFIG_NET_LOCAL)
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
@ -47,8 +46,12 @@
|
|||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <debug.h>
|
#include <debug.h>
|
||||||
|
|
||||||
|
#include <nuttx/fs/fs.h>
|
||||||
|
|
||||||
#include "local/local.h"
|
#include "local/local.h"
|
||||||
|
|
||||||
|
#if defined(CONFIG_NET) && defined(CONFIG_NET_LOCAL)
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
* Pre-processor Definitions
|
* Pre-processor Definitions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
@ -92,16 +95,13 @@ static int local_fifo_write(int fd, FAR const uint8_t *buf, size_t len)
|
|||||||
|
|
||||||
while (len > 0)
|
while (len > 0)
|
||||||
{
|
{
|
||||||
nwritten = write(fd, buf, len);
|
nwritten = nx_write(fd, buf, len);
|
||||||
if (nwritten < 0)
|
if (nwritten < 0)
|
||||||
{
|
{
|
||||||
int errcode = get_errno();
|
if (nwritten != -EINTR)
|
||||||
DEBUGASSERT(errcode > 0);
|
|
||||||
|
|
||||||
if (errcode != EINTR)
|
|
||||||
{
|
{
|
||||||
nerr("ERROR: Write failed: %d\n", errcode);
|
nerr("ERROR: nx_write failed: %d\n", nwritten);
|
||||||
return -errcode;
|
return (int)nwritten;
|
||||||
}
|
}
|
||||||
|
|
||||||
ninfo("Ignoring signal\n");
|
ninfo("Ignoring signal\n");
|
||||||
|
Loading…
Reference in New Issue
Block a user