1
0
mirror of https://github.com/cc65/cc65.git synced 2025-01-10 19:29:45 +00:00

Allow "mode" argument to open() to be passed from 6502 code.

Implements this suggestion:
https://github.com/cc65/cc65/pull/719#issuecomment-413809096
This commit is contained in:
Patrick Pelletier 2018-08-17 10:43:14 -07:00 committed by Oliver Schmidt
parent d602572bbe
commit aba320eade
4 changed files with 81 additions and 5 deletions

3
asminc/stat.inc Normal file
View File

@ -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

65
include/sys/stat.h Normal file
View File

@ -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

View 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

View 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);
}