From aba320eadea576037fc2130a208b68d0c56c21e7 Mon Sep 17 00:00:00 2001 From: Patrick Pelletier Date: Fri, 17 Aug 2018 10:43:14 -0700 Subject: [PATCH] Allow "mode" argument to open() to be passed from 6502 code. Implements this suggestion: https://github.com/cc65/cc65/pull/719#issuecomment-413809096 --- asminc/stat.inc | 3 ++ include/sys/stat.h | 65 ++++++++++++++++++++++++++++++++++++++++++ libsrc/common/_fopen.s | 6 +++- src/sim65/paravirt.c | 12 +++++--- 4 files changed, 81 insertions(+), 5 deletions(-) create mode 100644 asminc/stat.inc create mode 100644 include/sys/stat.h diff --git a/asminc/stat.inc b/asminc/stat.inc new file mode 100644 index 000000000..d9c74aeaa --- /dev/null +++ b/asminc/stat.inc @@ -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 index 000000000..e49c370f9 --- /dev/null +++ b/include/sys/stat.h @@ -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 diff --git a/libsrc/common/_fopen.s b/libsrc/common/_fopen.s index 29f1c4cd9..0154858dd 100644 --- a/libsrc/common/_fopen.s +++ b/libsrc/common/_fopen.s @@ -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 diff --git a/src/sim65/paravirt.c b/src/sim65/paravirt.c index f210efd57..0c634dc0d 100644 --- a/src/sim65/paravirt.c +++ b/src/sim65/paravirt.c @@ -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); } -- 2.39.5