diff --git a/fs/vfs/fs_fdopen.c b/fs/vfs/fs_fdopen.c index 5f7bf7005a..6fd88212d8 100644 --- a/fs/vfs/fs_fdopen.c +++ b/fs/vfs/fs_fdopen.c @@ -118,14 +118,6 @@ int fs_fdopen(int fd, int oflags, FAR struct tcb_s *tcb, FAR FILE *stream; int ret = OK; - /* Check input parameters */ - - if (fd < 0) - { - ret = -EBADF; - goto errout; - } - /* A NULL TCB pointer means to use this threads TCB. This is a little * hack the let's this function be called from user-space (via a syscall) * without having access to the TCB. @@ -138,13 +130,9 @@ int fs_fdopen(int fd, int oflags, FAR struct tcb_s *tcb, DEBUGASSERT(tcb && tcb->group); - if (fd >= 3) - { - ret = fs_checkfd(tcb, fd, oflags); - } - /* Do we have a good descriptor of some sort? */ + ret = fs_checkfd(tcb, fd, oflags); if (ret < 0) { /* No... return the reported error */ @@ -198,24 +186,22 @@ int fs_fdopen(int fd, int oflags, FAR struct tcb_s *tcb, stream = &slist->sl_std[fd]; } -#ifndef CONFIG_STDIO_DISABLE_BUFFERING -#if CONFIG_STDIO_BUFFER_SIZE > 0 +#if !defined(CONFIG_STDIO_DISABLE_BUFFERING) && CONFIG_STDIO_BUFFER_SIZE > 0 /* Set up pointers */ stream->fs_bufstart = stream->fs_buffer; - stream->fs_bufend = &stream->fs_bufstart[CONFIG_STDIO_BUFFER_SIZE]; + stream->fs_bufend = stream->fs_bufstart + CONFIG_STDIO_BUFFER_SIZE; stream->fs_bufpos = stream->fs_bufstart; stream->fs_bufread = stream->fs_bufstart; stream->fs_flags = __FS_FLAG_UBF; /* Fake setvbuf and fclose */ -#ifdef CONFIG_STDIO_LINEBUFFER +# ifdef CONFIG_STDIO_LINEBUFFER /* Setup buffer flags */ stream->fs_flags |= __FS_FLAG_LBF; /* Line buffering */ -#endif /* CONFIG_STDIO_LINEBUFFER */ -#endif /* CONFIG_STDIO_BUFFER_SIZE > 0 */ -#endif /* CONFIG_STDIO_DISABLE_BUFFERING */ +# endif /* CONFIG_STDIO_LINEBUFFER */ +#endif /* !CONFIG_STDIO_DISABLE_BUFFERING && CONFIG_STDIO_BUFFER_SIZE > 0 */ /* Save the file description and open flags. Setting the * file descriptor locks this stream. @@ -224,18 +210,10 @@ int fs_fdopen(int fd, int oflags, FAR struct tcb_s *tcb, stream->fs_fd = fd; stream->fs_oflags = oflags; - if (filep != NULL) - { - *filep = stream; - } - + *filep = stream; return OK; errout: - if (filep != NULL) - { - *filep = NULL; - } - + *filep = NULL; return ret; } diff --git a/sched/group/CMakeLists.txt b/sched/group/CMakeLists.txt index dd3fced7f8..0f6bc8b22a 100644 --- a/sched/group/CMakeLists.txt +++ b/sched/group/CMakeLists.txt @@ -23,7 +23,6 @@ set(SRCS group_join.c group_leave.c group_find.c - group_setupstreams.c group_setupidlefiles.c group_setuptaskfiles.c group_foreachchild.c diff --git a/sched/group/Make.defs b/sched/group/Make.defs index 0328e042f4..7115c6fa29 100644 --- a/sched/group/Make.defs +++ b/sched/group/Make.defs @@ -19,7 +19,7 @@ ############################################################################ CSRCS += group_create.c group_join.c group_leave.c group_find.c -CSRCS += group_setupstreams.c group_setupidlefiles.c group_setuptaskfiles.c +CSRCS += group_setupidlefiles.c group_setuptaskfiles.c CSRCS += group_foreachchild.c group_killchildren.c group_signal.c CSRCS += group_argvstr.c diff --git a/sched/group/group.h b/sched/group/group.h index ee865dad9e..7988e6c1ce 100644 --- a/sched/group/group.h +++ b/sched/group/group.h @@ -121,8 +121,5 @@ void group_remove_children(FAR struct task_group_s *group); int group_setupidlefiles(FAR struct task_tcb_s *tcb); int group_setuptaskfiles(FAR struct task_tcb_s *tcb); -#ifdef CONFIG_FILE_STREAM -int group_setupstreams(FAR struct task_tcb_s *tcb); -#endif #endif /* __SCHED_GROUP_GROUP_H */ diff --git a/sched/group/group_setupidlefiles.c b/sched/group/group_setupidlefiles.c index d54fcb1701..91f83e83e5 100644 --- a/sched/group/group_setupidlefiles.c +++ b/sched/group/group_setupidlefiles.c @@ -115,11 +115,6 @@ int group_setupidlefiles(FAR struct task_tcb_s *tcb) #warning file descriptors 0-2 are not opened #endif /* defined(CONFIG_DEV_CONSOLE) || defined(CONFIG_DEV_NULL) */ - /* Allocate file/socket streams for the TCB */ - -#ifdef CONFIG_FILE_STREAM - ret = group_setupstreams(tcb); -#endif sched_trace_end(); return ret; } diff --git a/sched/group/group_setupstreams.c b/sched/group/group_setupstreams.c deleted file mode 100644 index 1ad4eadbe2..0000000000 --- a/sched/group/group_setupstreams.c +++ /dev/null @@ -1,74 +0,0 @@ -/**************************************************************************** - * sched/group/group_setupstreams.c - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. The - * ASF licenses this file to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the - * License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. - * - ****************************************************************************/ - -/**************************************************************************** - * Included Files - ****************************************************************************/ - -#include - -#include -#include -#include - -#include -#include - -#include "group/group.h" - -/* Make sure that there are file or socket descriptors in the system and - * that some number of streams have been configured. - */ - -#ifdef CONFIG_FILE_STREAM - -/**************************************************************************** - * Public Functions - ****************************************************************************/ - -/**************************************************************************** - * Name: group_setupstreams - * - * Description: - * Setup streams data structures that may be used for standard C buffered - * I/O with underlying socket or file descriptors - * - ****************************************************************************/ - -int group_setupstreams(FAR struct task_tcb_s *tcb) -{ - DEBUGASSERT(tcb && tcb->cmn.group); - - /* fdopen to get the stdin, stdout and stderr streams. The following logic - * depends on the fact that the library layer will allocate FILEs in order. - * - * fd = 0 is stdin (read-only) - * fd = 1 is stdout (write-only, append) - * fd = 2 is stderr (write-only, append) - */ - - fs_fdopen(0, O_RDONLY, (FAR struct tcb_s *)tcb, NULL); - fs_fdopen(1, O_WROK | O_CREAT, (FAR struct tcb_s *)tcb, NULL); - fs_fdopen(2, O_WROK | O_CREAT, (FAR struct tcb_s *)tcb, NULL); - - return OK; -} - -#endif /* CONFIG_FILE_STREAM */ diff --git a/sched/group/group_setuptaskfiles.c b/sched/group/group_setuptaskfiles.c index 9a9caa49e9..95c7a7f8ad 100644 --- a/sched/group/group_setuptaskfiles.c +++ b/sched/group/group_setuptaskfiles.c @@ -83,12 +83,6 @@ int group_setuptaskfiles(FAR struct task_tcb_s *tcb) } #endif - /* Allocate file/socket streams for the new TCB */ - -#ifdef CONFIG_FILE_STREAM - ret = group_setupstreams(tcb); -#endif - sched_trace_end(); return ret; } diff --git a/sched/tls/task_initinfo.c b/sched/tls/task_initinfo.c index 14c366a146..b1fbafcdd5 100644 --- a/sched/tls/task_initinfo.c +++ b/sched/tls/task_initinfo.c @@ -23,6 +23,7 @@ ****************************************************************************/ #include +#include #include #include @@ -46,6 +47,7 @@ static void task_init_stream(FAR struct streamlist *list) { FAR struct file_struct *stream = list->sl_std; + int i; /* Initialize the list access mutex */ @@ -55,12 +57,34 @@ static void task_init_stream(FAR struct streamlist *list) /* Initialize stdin, stdout and stderr stream */ - stream[0].fs_fd = -1; - nxrmutex_init(&stream[0].fs_lock); - stream[1].fs_fd = -1; - nxrmutex_init(&stream[1].fs_lock); - stream[2].fs_fd = -1; - nxrmutex_init(&stream[2].fs_lock); + for (i = 0; i < 3; i++) + { + nxrmutex_init(&stream[i].fs_lock); + +#if !defined(CONFIG_STDIO_DISABLE_BUFFERING) && CONFIG_STDIO_BUFFER_SIZE > 0 + /* Set up pointers */ + + stream[i].fs_bufstart = stream[i].fs_buffer; + stream[i].fs_bufend = stream[i].fs_bufstart + + CONFIG_STDIO_BUFFER_SIZE; + stream[i].fs_bufpos = stream[i].fs_bufstart; + stream[i].fs_bufread = stream[i].fs_bufstart; + stream[i].fs_flags = __FS_FLAG_UBF; /* Fake setvbuf and fclose */ +# ifdef CONFIG_STDIO_LINEBUFFER + /* Setup buffer flags */ + + stream[i].fs_flags |= __FS_FLAG_LBF; /* Line buffering */ + +# endif /* CONFIG_STDIO_LINEBUFFER */ + + /* Save the file description and open flags. Setting the + * file descriptor locks this stream. + */ + + stream[i].fs_fd = i; + stream[i].fs_oflags = i ? O_WROK : O_RDONLY; +#endif /* !CONFIG_STDIO_DISABLE_BUFFERING && CONFIG_STDIO_BUFFER_SIZE > 0 */ + } } #endif