mirror of
https://github.com/cc65/cc65.git
synced 2025-08-15 06:27:36 +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:
committed by
Oliver Schmidt
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 "errno.inc"
|
||||||
.include "fcntl.inc"
|
.include "fcntl.inc"
|
||||||
.include "_file.inc"
|
.include "_file.inc"
|
||||||
|
.include "stat.inc"
|
||||||
|
|
||||||
|
|
||||||
; ------------------------------------------------------------------------
|
; ------------------------------------------------------------------------
|
||||||
@@ -82,7 +83,10 @@ modeok: ldy #$00
|
|||||||
tya
|
tya
|
||||||
iny
|
iny
|
||||||
sta (sp),y
|
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
|
jsr _open ; Will cleanup the stack
|
||||||
|
|
||||||
; Check the result of the open() call
|
; Check the result of the open() call
|
||||||
|
@@ -169,7 +169,7 @@ static void PVOpen (CPURegs* Regs)
|
|||||||
{
|
{
|
||||||
char Path[1024];
|
char Path[1024];
|
||||||
int OFlag = O_INITIAL;
|
int OFlag = O_INITIAL;
|
||||||
unsigned RetVal, I = 0;
|
unsigned RetVal, I = 0, OMode = 0;
|
||||||
|
|
||||||
unsigned Mode = PopParam (Regs->YR - 4);
|
unsigned Mode = PopParam (Regs->YR - 4);
|
||||||
unsigned Flags = PopParam (2);
|
unsigned Flags = PopParam (2);
|
||||||
@@ -206,10 +206,14 @@ static void PVOpen (CPURegs* Regs)
|
|||||||
OFlag |= O_EXCL;
|
OFlag |= O_EXCL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Avoid gcc warning */
|
if (Mode & 0400) {
|
||||||
(void) Mode;
|
OMode |= S_IREAD;
|
||||||
|
}
|
||||||
|
if (Mode & 0200) {
|
||||||
|
OMode |= S_IWRITE;
|
||||||
|
}
|
||||||
|
|
||||||
RetVal = open (Path, OFlag, (mode_t) 0666);
|
RetVal = open (Path, OFlag, OMode);
|
||||||
|
|
||||||
SetAX (Regs, RetVal);
|
SetAX (Regs, RetVal);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user