Browse Source

Merge pull request #1233 from RT-Thread/origin/stable-v2.1.x

fix the fopen issue.
Bernard Xiong 7 years ago
parent
commit
0522343b92

+ 6 - 2
components/dfs/include/dfs_def.h

@@ -23,7 +23,7 @@
  * 2004-10-14     Beranard     Clean up the code.
  * 2005-01-22     Beranard     Clean up the code, port to MinGW
  */
- 
+
 #ifndef __DFS_DEF_H__
 #define __DFS_DEF_H__
 
@@ -70,7 +70,7 @@
 #define dfs_log(level, x)
 #endif
 
-#if defined(RT_USING_NEWLIB) 
+#if defined(RT_USING_NEWLIB)
 #include <string.h>
 #include <sys/stat.h>            /* used for struct stat */
 #include <sys/statfs.h>          /* used for struct statfs */
@@ -108,6 +108,10 @@
 #define DFS_O_EXCL               O_EXCL
 #define DFS_O_TRUNC              O_TRUNC
 #define DFS_O_APPEND             O_APPEND
+
+#ifndef O_DIRECTORY
+#define O_DIRECTORY              0x0200000
+#endif
 #define DFS_O_DIRECTORY          O_DIRECTORY
 
 /* Seek flags */

+ 13 - 13
components/dfs/include/dfs_posix.h

@@ -20,10 +20,10 @@
  * Change Logs:
  * Date           Author       Notes
  * 2009-05-27     Yi.qiu       The first version.
- * 2010-07-18     Bernard      add stat and statfs structure definitions. 
+ * 2010-07-18     Bernard      add stat and statfs structure definitions.
  * 2011-05-16     Yi.qiu       Change parameter name of rename, "new" is C++ key word.
  */
- 
+
 #ifndef __DFS_POSIX_H__
 #define __DFS_POSIX_H__
 
@@ -49,15 +49,15 @@ extern "C" {
 #if !defined(_WIN32)
 #define S_IFMT      DFS_S_IFMT
 #define S_IFSOCK    DFS_S_IFSOCK
-#define S_IFLNK     DFS_S_IFLNK 
-#define S_IFREG     DFS_S_IFREG 
-#define S_IFBLK     DFS_S_IFBLK 
-#define S_IFDIR     DFS_S_IFDIR 
-#define S_IFCHR     DFS_S_IFCHR 
-#define S_IFIFO     DFS_S_IFIFO 
-#define S_ISUID     DFS_S_ISUID 
-#define S_ISGID     DFS_S_ISGID 
-#define S_ISVTX     DFS_S_ISVTX 
+#define S_IFLNK     DFS_S_IFLNK
+#define S_IFREG     DFS_S_IFREG
+#define S_IFBLK     DFS_S_IFBLK
+#define S_IFDIR     DFS_S_IFDIR
+#define S_IFCHR     DFS_S_IFCHR
+#define S_IFIFO     DFS_S_IFIFO
+#define S_ISUID     DFS_S_ISUID
+#define S_ISGID     DFS_S_ISGID
+#define S_ISVTX     DFS_S_ISVTX
 
 #define S_ISLNK(m)  (((m) & DFS_S_IFMT) == DFS_S_IFLNK)
 #define S_ISREG(m)  (((m) & DFS_S_IFMT) == DFS_S_IFREG)
@@ -94,7 +94,7 @@ extern "C" {
 #define SEEK_END    DFS_SEEK_END
 #endif
 
-typedef struct 
+typedef struct
 {
     int fd;     /* directory file */
     char buf[512];
@@ -119,7 +119,7 @@ int closedir(DIR* d);
 struct stat;
 
 /* file api*/
-int open(const char *file, int flags, int mode);
+int open(const char *file, int flags, ...);
 int close(int d);
 #ifdef RT_USING_NEWLIB
 _READ_WRITE_RETURN_TYPE _EXFUN(read, (int __fd, void *__buf, size_t __nbyte));

+ 1 - 1
components/dfs/src/dfs_posix.c

@@ -41,7 +41,7 @@
  *
  * @return the non-negative integer on successful open, others for failed.
  */
-int open(const char *file, int flags, int mode)
+int open(const char *file, int flags, ...)
 {
     int fd, result;
     struct dfs_fd *d;

+ 0 - 9
components/libc/newlib/libc.c

@@ -21,7 +21,6 @@
 int libc_system_init(void)
 {
 #ifdef RT_USING_DFS
-    int fd;
     struct rt_device *console_dev;
 
 #ifndef RT_USING_DFS_DEVFS
@@ -33,14 +32,6 @@ int libc_system_init(void)
     {
         /* initialize console device */
         rt_console_init(console_dev->parent.name);
-
-        /* open console as stdin/stdout/stderr */
-        fd = open("/dev/console", O_RDONLY, 0); /* for stdin */
-        fd = open("/dev/console", O_WRONLY, 0); /* for stdout */
-        fd = open("/dev/console", O_WRONLY, 0); /* for stderr */
-
-        /* skip warning */
-        fd = fd;
     }
 #endif
 

+ 0 - 16
components/libc/newlib/sys/fcntl.h

@@ -1,16 +0,0 @@
-#ifndef __RTT_FCNTL_H__
-#define __RTT_FCNTL_H__
-
-/* Operation flags */
-#define O_RDONLY        0x0000000
-#define O_WRONLY        0x0000001
-#define O_RDWR          0x0000002
-#define O_ACCMODE       0x0000003
-#define O_CREAT         0x0000100
-#define O_EXCL          0x0000200
-#define O_TRUNC         0x0001000
-#define O_APPEND        0x0002000
-#define O_DIRECTORY     0x0200000
-#define O_BINARY        0x0008000
-
-#endif

+ 29 - 5
components/libc/newlib/syscalls.c

@@ -3,6 +3,8 @@
 #include <sys/time.h>
 #include <rtthread.h>
 
+#include <stdio.h>
+
 #ifdef RT_USING_DFS
 #include <dfs_posix.h>
 #endif
@@ -12,6 +14,8 @@
 #endif
 
 /* Reentrant versions of system calls.  */
+static int __console_fd = -1;
+int dump = 0;
 
 int
 _close_r(struct _reent *ptr, int fd)
@@ -205,18 +209,14 @@ _wait_r(struct _reent *ptr, int *status)
 _ssize_t
 _write_r(struct _reent *ptr, int fd, const void *buf, size_t nbytes)
 {
-	if (fd < 3)
+	if (fd == __console_fd)
 	{
-#ifdef RT_USING_CONSOLE
 		rt_device_t console_device;
 		extern rt_device_t rt_console_get_device(void);
 
 		console_device = rt_console_get_device();
 		if (console_device != 0) rt_device_write(console_device, 0, buf, nbytes);
 		return nbytes;
-#else
-        return 0;
-#endif
 	}
 	else
 	{
@@ -462,3 +462,27 @@ void abort(void)
 
 	while (1);
 }
+
+int libc_console_init(void)
+{
+#ifdef RT_USING_DFS
+
+    /* open console as stdin/stdout/stderr */
+    __console_fd = open("/dev/console", O_RDWR, 0); /* for stdin/stdout/stderr */
+
+	if (__console_fd >= 0)
+	{
+		_GLOBAL_REENT->_stdin   = fdopen(__console_fd, "r");
+
+		_GLOBAL_REENT->_stdout  = fdopen(__console_fd, "w");
+		setvbuf(_GLOBAL_REENT->_stdout, NULL, _IONBF, 0);
+		_GLOBAL_REENT->_stderr  = fdopen(__console_fd, "w");
+		setvbuf(_GLOBAL_REENT->_stderr, NULL, _IONBF, 0);
+
+		_GLOBAL_REENT->__sdidinit = 1;
+	}
+#endif
+
+    return 0;
+}
+INIT_APP_EXPORT(libc_console_init);