From a086a5b65839065f33764678c541d3af4afb0568 Mon Sep 17 00:00:00 2001 From: patacongo Date: Mon, 4 Apr 2011 23:02:00 +0000 Subject: 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 --- nuttx/lib/stdio/lib_fopen.c | 122 ++++---------------------------------------- 1 file changed, 9 insertions(+), 113 deletions(-) (limited to 'nuttx/lib/stdio') 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; @@ -129,120 +135,13 @@ static int lib_mode2oflags(FAR const char *mode) * Public Functions ****************************************************************************/ -/**************************************************************************** - * 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 -- cgit v1.2.3