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:
parent
d602572bbe
commit
aba320eade
3
asminc/stat.inc
Normal file
3
asminc/stat.inc
Normal 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
65
include/sys/stat.h
Normal 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
|
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user