greatbridf 1 жил өмнө
parent
commit
d53ea9f452

+ 15 - 1
gblibc/src/fcntl.c

@@ -1,10 +1,24 @@
+#include <stdarg.h>
 #include <errno.h>
 #include <fcntl.h>
 #include <syscall.h>
 
+#include <sys/types.h>
+
 int open(const char* filename, int flags, ...)
 {
-    int ret = syscall2(SYS_open, (uint32_t)filename, flags);
+    int ret;
+    if (flags | O_CREAT) {
+        va_list vl;
+        va_start(vl, flags);
+
+        ret = syscall3(SYS_open, (uint32_t)filename, flags, va_arg(vl, mode_t));
+
+        va_end(vl);
+    }
+    else
+        ret = syscall2(SYS_open, (uint32_t)filename, flags);
+
     if (ret < 0) {
         errno = -ret;
         return -1;

+ 4 - 4
user-space-program/sh.c

@@ -86,7 +86,7 @@ runcmd(struct cmd *cmd)
   case REDIR:
     rcmd = (struct redircmd*)cmd;
     close(rcmd->fd);
-    if(open(rcmd->file, rcmd->mode) < 0){
+    if(open(rcmd->file, rcmd->mode, 0666) < 0){
       printf("open %s failed\n", rcmd->file);
       _exit(-1);
     }
@@ -396,13 +396,13 @@ parseredirs(struct cmd *cmd, char **ps, char *es)
       panic("missing file for redirection");
     switch(tok){
     case '<':
-      cmd = redircmd(cmd, q, eq, 0, 0);
+      cmd = redircmd(cmd, q, eq, O_RDONLY, 0);
       break;
     case '>':
-      cmd = redircmd(cmd, q, eq, 0, 1);
+      cmd = redircmd(cmd, q, eq, O_WRONLY | O_CREAT | O_TRUNC, 1);
       break;
     case '+':  // >>
-      cmd = redircmd(cmd, q, eq, 0, 1);
+      cmd = redircmd(cmd, q, eq, O_WRONLY | O_CREAT | O_APPEND, 1);
       break;
     }
   }