Browse Source

简单添加了fopen对mode参数的处理。请注意,它没有完全遵循posix,也与Linux的不一致,将来使用Rust的时候完善它。 (#141)

login 2 years ago
parent
commit
e9fdc57bf8
1 changed files with 18 additions and 3 deletions
  1. 18 3
      user/libs/libc/src/stdio.c

+ 18 - 3
user/libs/libc/src/stdio.c

@@ -49,20 +49,35 @@ int fclose(FILE *stream)
 {
 {
     if (stream->fd >= 3)
     if (stream->fd >= 3)
     {
     {
-        int retcval = close(stream);
+        int retcval = close(stream->fd);
         free(stream);
         free(stream);
-        return;
+        return 0;
     }
     }
     else
     else
         return 0;
         return 0;
 }
 }
 
 
+// FIXME: 请注意,这个函数的实现,没有遵照posix,行为也与Linux的不一致,请在将来用Rust重构时改变它,以使得它的行为与Linux的一致。
 FILE *fopen(const char *restrict pathname, const char *restrict mode)
 FILE *fopen(const char *restrict pathname, const char *restrict mode)
 {
 {
     FILE *stream = malloc(sizeof(FILE));
     FILE *stream = malloc(sizeof(FILE));
     memset(stream, 0, sizeof(FILE));
     memset(stream, 0, sizeof(FILE));
+    int o_flags = 0;
+
+    if (strcmp(mode, "r") == 0)
+        o_flags = O_RDONLY;
+    else if (strcmp(mode, "r+") == 0)
+        o_flags = O_RDWR;
+    else if (strcmp(mode, "w") == 0)
+        o_flags = O_WRONLY;
+    else if (strcmp(mode, "w+") == 0)
+        o_flags = O_RDWR | O_CREAT;
+    else if (strcmp(mode, "a") == 0)
+        o_flags = O_APPEND | O_CREAT;
+    else if (strcmp(mode, "a+") == 0)
+        o_flags = O_APPEND | O_CREAT;
 
 
-    int fd = open(pathname, mode);
+    int fd = open(pathname, o_flags);
     if (fd >= 0)
     if (fd >= 0)
         stream->fd = fd;
         stream->fd = fd;
     return stream;
     return stream;