summaryrefslogtreecommitdiff
path: root/nuttx/lib
diff options
context:
space:
mode:
authorpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-04-04 23:02:00 +0000
committerpatacongo <patacongo@42af7a65-404d-4744-a932-0658087f49c3>2011-04-04 23:02:00 +0000
commita086a5b65839065f33764678c541d3af4afb0568 (patch)
treeb432725a3d8fadeaa4e8b00c071284cdf0fe2fec /nuttx/lib
parentf83c9b840d045664f99114a3c71bbdab5744367c (diff)
downloadpx4-nuttx-a086a5b65839065f33764678c541d3af4afb0568.tar.gz
px4-nuttx-a086a5b65839065f33764678c541d3af4afb0568.tar.bz2
px4-nuttx-a086a5b65839065f33764678c541d3af4afb0568.zip
Move core of fdopen() logic from lib/stdio to fs/
git-svn-id: svn://svn.code.sf.net/p/nuttx/code/trunk@3464 42af7a65-404d-4744-a932-0658087f49c3
Diffstat (limited to 'nuttx/lib')
-rw-r--r--nuttx/lib/stdio/lib_fopen.c122
1 files changed, 9 insertions, 113 deletions
diff --git a/nuttx/lib/stdio/lib_fopen.c b/nuttx/lib/stdio/lib_fopen.c
index 42ac19d1b..4f841aefc 100644
--- a/nuttx/lib/stdio/lib_fopen.c
+++ b/nuttx/lib/stdio/lib_fopen.c
@@ -71,12 +71,14 @@ static int lib_mode2oflags(FAR const char *mode)
if (*(mode + 1) == '+')
{
/* Open for read/write access */
+
oflags |= O_RDWR;
mode++;
}
else
{
/* Open for read access */
+
oflags |= O_RDOK;
}
break;
@@ -87,12 +89,14 @@ static int lib_mode2oflags(FAR const char *mode)
if (*(mode + 1) == '+')
{
/* Open for write read/access, truncating any existing file */
+
oflags |= O_RDWR|O_CREAT|O_TRUNC;
mode++;
}
else
{
/* Open for write access, truncating any existing file */
+
oflags |= O_WROK|O_CREAT|O_TRUNC;
}
break;
@@ -103,12 +107,14 @@ static int lib_mode2oflags(FAR const char *mode)
if (*(mode + 1) == '+')
{
/* Read from the beginning of the file; write to the end */
+
oflags |= O_RDWR|O_CREAT;
mode++;
}
else
{
/* Write to the end of the file */
+
oflags |= O_WROK|O_CREAT;
}
break;
@@ -130,119 +136,12 @@ static int lib_mode2oflags(FAR const char *mode)
****************************************************************************/
/****************************************************************************
- * Name: lib_fdopen
- ****************************************************************************/
-
-FAR struct file_struct *lib_fdopen(int fd, FAR const char *mode,
- FAR struct filelist *flist,
- FAR struct streamlist *slist)
-{
- FAR struct inode *inode;
- FAR FILE *stream;
- int oflags = lib_mode2oflags(mode);
- int err = OK;
- int i;
-
- /* Check input parameters */
-
- if (fd < 0 || !flist || !slist)
- {
- err = EBADF;
- goto errout;
- }
-
- /* Get the inode associated with the file descriptor. This should
- * normally be the case if fd >= 0. But not in the case where the
- * called attempts to explictly stdin with fdopen(0) but stdin has
- * been closed.
- */
-
- inode = flist->fl_files[fd].f_inode;
- if (!inode)
- {
- err = ENOENT;
- goto errout;
- }
-
- /* Make sure that the inode supports the requested access. In
- * the case of fdopen, we are not actually creating the file -- in
- * particular w and w+ do not truncate the file and any files have
- * already been created.
- */
-
- if (inode_checkflags(inode, oflags) != OK)
- {
- err = EACCES;
- goto errout;
- }
-
- /* Find an unallocated FILE structure */
-
- stream_semtake(slist);
- for (i = 0 ; i < CONFIG_NFILE_STREAMS; i++)
- {
- stream = &slist->sl_streams[i];
- if (stream->fs_filedes < 0)
- {
- /* Zero the structure */
-#if CONFIG_STDIO_BUFFER_SIZE > 0
- memset(stream, 0, sizeof(FILE));
-#elif CONFIG_NUNGET_CHARS > 0
- stream->fs_nungotten = 0;
-#endif
-
-#if CONFIG_STDIO_BUFFER_SIZE > 0
- /* Initialize the semaphore the manages access to the buffer */
-
- (void)sem_init(&stream->fs_sem, 0, 1);
-
- /* Allocate the IO buffer */
-
- stream->fs_bufstart = malloc(CONFIG_STDIO_BUFFER_SIZE);
- if (!stream)
- {
- err = ENOMEM;
- goto errout_with_sem;
- }
-
- /* Set up pointers */
-
- stream->fs_bufend = &stream->fs_bufstart[CONFIG_STDIO_BUFFER_SIZE];
- stream->fs_bufpos = stream->fs_bufstart;
- stream->fs_bufpos = stream->fs_bufstart;
- stream->fs_bufread = stream->fs_bufstart;
-#endif
- /* Save the file description and open flags. Setting the
- * file descriptor locks this stream.
- */
-
- stream->fs_filedes = fd;
- stream->fs_oflags = oflags;
-
- stream_semgive(slist);
- return stream;
- }
- }
-
-#if CONFIG_STDIO_BUFFER_SIZE > 0
-errout_with_sem:
-#endif
- stream_semgive(slist);
-
-errout:
- set_errno(err);
- return NULL;
-}
-
-/****************************************************************************
* Name: fdopen
****************************************************************************/
FAR FILE *fdopen(int fd, FAR const char *mode)
{
- FAR struct filelist *flist = sched_getfiles();
- FAR struct streamlist *slist = sched_getstreams();
- return lib_fdopen(fd, mode, flist, slist);
+ return fs_fdopen(fd, lib_mode2oflags(mode), NULL);
}
/****************************************************************************
@@ -251,7 +150,7 @@ FAR FILE *fdopen(int fd, FAR const char *mode)
FAR FILE *fopen(FAR const char *path, FAR const char *mode)
{
- FAR FILE *ret = NULL;;
+ FAR FILE *ret = NULL;
int oflags;
int fd;
@@ -267,10 +166,7 @@ FAR FILE *fopen(FAR const char *path, FAR const char *mode)
if (fd >= 0)
{
- FAR struct filelist *flist = sched_getfiles();
- FAR struct streamlist *slist = sched_getstreams();
-
- ret = lib_fdopen(fd, mode, flist, slist);
+ ret = fs_fdopen(fd, oflags, NULL);
if (!ret)
{
/* Don't forget to close the file descriptor if any other