]> git.sur5r.net Git - cc65/commitdiff
Allow "mode" argument to open() to be passed from 6502 code.
authorPatrick Pelletier <code@funwithsoftware.org>
Fri, 17 Aug 2018 17:43:14 +0000 (10:43 -0700)
committerOliver Schmidt <ol.sc@web.de>
Fri, 17 Aug 2018 21:28:45 +0000 (23:28 +0200)
Implements this suggestion:
https://github.com/cc65/cc65/pull/719#issuecomment-413809096

asminc/stat.inc [new file with mode: 0644]
include/sys/stat.h [new file with mode: 0644]
libsrc/common/_fopen.s
src/sim65/paravirt.c

diff --git a/asminc/stat.inc b/asminc/stat.inc
new file mode 100644 (file)
index 0000000..d9c74ae
--- /dev/null
@@ -0,0 +1,3 @@
+; File mode constants, must match the values in the C headers
+S_IREAD         = $0100  ; octal 0400
+S_IWRITE        = $0080  ; octal 0200
diff --git a/include/sys/stat.h b/include/sys/stat.h
new file mode 100644 (file)
index 0000000..e49c370
--- /dev/null
@@ -0,0 +1,65 @@
+/*****************************************************************************/
+/*                                                                           */
+/*                                  stat.h                                   */
+/*                                                                           */
+/*                   Constants for the mode argument of open                 */
+/*                                                                           */
+/*                                                                           */
+/*                                                                           */
+/* (C) 2003      Ullrich von Bassewitz                                       */
+/*               Römerstrasse 52                                             */
+/*               D-70794 Filderstadt                                         */
+/* EMail:        uz@cc65.org                                                 */
+/*                                                                           */
+/*                                                                           */
+/* This software is provided 'as-is', without any expressed or implied       */
+/* warranty.  In no event will the authors be held liable for any damages    */
+/* arising from the use of this software.                                    */
+/*                                                                           */
+/* Permission is granted to anyone to use this software for any purpose,     */
+/* including commercial applications, and to alter it and redistribute it    */
+/* freely, subject to the following restrictions:                            */
+/*                                                                           */
+/* 1. The origin of this software must not be misrepresented; you must not   */
+/*    claim that you wrote the original software. If you use this software   */
+/*    in a product, an acknowledgment in the product documentation would be  */
+/*    appreciated but is not required.                                       */
+/* 2. Altered source versions must be plainly marked as such, and must not   */
+/*    be misrepresented as being the original software.                      */
+/* 3. This notice may not be removed or altered from any source              */
+/*    distribution.                                                          */
+/*                                                                           */
+/*****************************************************************************/
+
+
+
+#ifndef _STAT_H
+#define _STAT_H
+
+
+
+/*****************************************************************************/
+/*                                   Data                                    */
+/*****************************************************************************/
+
+
+
+/* These are the values for the traditional UNIX mode bits:
+** https://en.wikipedia.org/wiki/File_system_permissions#Numeric_notation
+** (S_IREAD and S_IWRITE are aliases for S_IRUSR and S_IWUSR)
+**
+** Must match the values in asminc/stat.inc and src/sim65/paravirt.c
+*/
+
+#define S_IREAD  0400
+#define S_IWRITE 0200
+
+
+/*****************************************************************************/
+/*                                   Code                                    */
+/*****************************************************************************/
+
+
+
+/* End of stat.h */
+#endif
index 29f1c4cd92165ff1de2d1d4f03a522793a3c514c..0154858dd34180969da9d50ad2de46a72b6da1c9 100644 (file)
@@ -15,6 +15,7 @@
         .include        "errno.inc"
         .include        "fcntl.inc"
         .include        "_file.inc"
+        .include        "stat.inc"
 
 
 ; ------------------------------------------------------------------------
@@ -82,7 +83,10 @@ modeok: ldy     #$00
         tya
         iny
         sta     (sp),y
-        ldy     #4              ; Size of arguments in bytes
+        lda     #<(S_IREAD|S_IWRITE)
+        ldx     #>(S_IREAD|S_IWRITE)
+        jsr     pushax          ; Push the "mode" argument onto the stack
+        ldy     #6              ; Size of arguments in bytes
         jsr     _open           ; Will cleanup the stack
 
 ; Check the result of the open() call
index f210efd57e28c202832f4c367ad2d2c0f60ba5e1..0c634dc0d2a3f580a76273974f778dc84a01f252 100644 (file)
@@ -169,7 +169,7 @@ static void PVOpen (CPURegs* Regs)
 {
     char Path[1024];
     int OFlag = O_INITIAL;
-    unsigned RetVal, I = 0;
+    unsigned RetVal, I = 0, OMode = 0;
 
     unsigned Mode  = PopParam (Regs->YR - 4);
     unsigned Flags = PopParam (2);
@@ -206,10 +206,14 @@ static void PVOpen (CPURegs* Regs)
         OFlag |= O_EXCL;
     }
 
-    /* Avoid gcc warning */
-    (void) Mode;
+    if (Mode & 0400) {
+        OMode |= S_IREAD;
+    }
+    if (Mode & 0200) {
+        OMode |= S_IWRITE;
+    }
 
-    RetVal = open (Path, OFlag, (mode_t) 0666);
+    RetVal = open (Path, OFlag, OMode);
 
     SetAX (Regs, RetVal);
 }