A2osX/SYS/KERNEL.S.STAT.txt
2019-12-04 07:56:03 +01:00

371 lines
7.5 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

NEW
AUTO 3,1
*--------------------------------------
* # ChMod
* change permissions of a file
* ## C
* `int chmod(const char *pathname, int mode);`
* ## ASM
* **In:**
* `>PUSHW mode`
* `>LDYA pathname`
* `>SYSCALL chmod`
* ## RETURN VALUE
*--------------------------------------
* only 777-555
*--------------------------------------
K.ChMod jsr PFT.CheckPathYA
bcs K.ChMod.RET2
>PULLW K.S.STAT+S.STAT.MODE
lda K.S.STAT+S.STAT.MODE+1
and /S.STAT.MODE.RU
beq .9
lda K.S.STAT+S.STAT.MODE
and #S.STAT.MODE.XO+S.STAT.MODE.RO+S.STAT.MODE.XG+S.STAT.MODE.RG+S.STAT.MODE.XU+S.STAT.MODE.RU
cmp #S.STAT.MODE.XO+S.STAT.MODE.RO+S.STAT.MODE.XG+S.STAT.MODE.RG+S.STAT.MODE.XU+S.STAT.MODE.RU
bne .9
>MLICALL MLIGETFILEINFO
bcs .90
lda K.MLI.PARAMS+S.FI.A
and #$3D not S.FI.A.RN+S.FI.A.D+S.FI.A.W
ora #S.FI.A.R
tax
lda K.S.STAT+S.STAT.MODE
tay
bit #S.STAT.MODE.WG
beq .1
txa
ora #S.FI.A.RN
tax
tya
.1 bit #S.STAT.MODE.WU
beq .2
txa
ora #S.FI.A.D
tax
tya
.2 bit #S.STAT.MODE.WO
beq .3
txa
ora #S.FI.A.W
tax
.3 stx K.MLI.PARAMS+S.FI.A
>MLICALL MLISETFILEINFO
rts
.9 lda #E.SYN
sec
.90 rts
K.ChMod.RET2 >RET 2 discard statbuf
*--------------------------------------
* # FStat
* Return information about a hFILE
* ## C
* `int fstat(short int hFILE, struct stat *statbuf);`
* ## ASM
* **In:**
* `>PUSHW statbuf`
* `lda hFILE`
* `>SYSCALL fstat`
* ## RETURN VALUE
*--------------------------------------
K.FStat jsr PFT.CheckNodeA
bcs K.ChMod.RET2
tax
lda OF.Table.hPath-1,x
jsr K.GetMemPtr
jsr PFT.YAToMLIPATH
>PULLW K.Stat.Store.2+1
jsr SHARED.Stat.I
bcs K.Stat.Store.RTS
lda (pFD) #S.FD.T
bne K.Stat.Store
ldy #S.FD.REG.REF
lda (pFD),y
sta K.MLI.PARAMS+1
>MLICALL MLIGETEOF
bcs K.Stat.Store.RTS
ldx #2
.1 lda K.MLI.PARAMS+2,x
sta K.S.STAT+S.STAT.SIZE,x
dex
bpl .1
K.Stat.Store ldy #S.STAT-1
K.Stat.Store.1 lda K.S.STAT,y
K.Stat.Store.2 sta $ffff,y SELF MODIFIED
dey
bpl K.Stat.Store.1
* clc
K.Stat.Store.RTS
rts
*/--------------------------------------
* # Stat
* Return information about a file
* ## C
* `int stat(const char *pathname, struct stat *statbuf);`
* ## ASM
* **In:**
* `>PUSHW statbuf`
* `>LDYA pathname`
* `>SYSCALL stat`
* ## RETURN VALUE
*\--------------------------------------
K.Stat jsr PFT.CheckPathYA
bcs K.ChMod.RET2 go discard statbuf
>PULLW K.Stat.Store.2+1
jsr SHARED.Stat.I
bcc K.Stat.Store
rts
*/-------------------------------------
* # MKDir
* create a directory
* ## C
* `int mkdir(const char *pathname, int mode);`
* ## ASM
* **In:**
* `>PUSHW mode`
* `>LDYA pathname`
* `>SYSCALL mkdir`
* ## RETURN VALUE
* CC : success
* CS : error
* A = EC
*\-------------------------------------
K.MKDir jsr PFT.CheckPathYA
bcs K.Stat.Store.RTS
lda #S.FI.T.DIR
sta K.MLI.PARAMS+4
stz K.MLI.PARAMS+5
stz K.MLI.PARAMS+6
lda #S.FI.ST.DIR
jmp IO.MLI.CREATE
*/--------------------------------------
* # MKFIFO
* return a pathname to a new FIFO
* ## C
* `int mkfifo( char *pathname, int mode );`
* ## ASM
* **In:**
* `>PUSHW mode`
* `>LDYA pathname`
* `>SYSCALL mkfifo`
* ## RETURN VALUE
* CC = OK, CS = ERROR
* A = hFD
*\--------------------------------------
K.MKFIFO >STYA ZPPtr1 pathname buffer
>PULLW K.S.STAT+S.STAT.MODE
>LDYAI 512
jsr K.pipe
bcs K.Stat.Store.RTS
ldy #0
.1 lda IO.DEV.FIFO,y
sta (ZPPtr1),y
iny
cpy #9
bne .1
lda IO.hFD
jsr MATH.AToHexAX
sta (ZPPtr1),y
txa
iny
sta (ZPPtr1),y
iny
lda #0
sta (ZPPtr1),y
bra K.MkNod.I
*/--------------------------------------
* # MkNod
* Create a special or ordinary file.
* (CDEV, BDEV, DSOCKS, SSOCK, PIPE)
* ## C
* `hFILE mknod(const char *pathname, int mode, hFD fd);`
* ## ASM
* **In:**
* `>PUSHB fd`
* `>PUSHW mode`
* `>LDYA pathname`
* `>SYSCALL mknod`
* ## RETURN VALUE
* CC = OK, CS = ERROR
* A = hFILE
*\--------------------------------------
K.MkNod >STYA ZPPtr1 pathname
>PULLW K.S.STAT+S.STAT.MODE
>PULLB IO.hFD
K.MkNod.I ldx #2
.1 lda Nod.Table.hPath-2,x
beq .2
inx
cpx #K.Nod.MAX+2
bne .1
lda #E.OOH
* sec
rts
.2 stx .3+1 Store hFILE
>LDYA ZPPtr1
ldx #SYS.StrDup
jsr K.SYSCALL2
bcs .9
txa
.3 ldx #$ff SELF MODIFIED
sta Nod.Table.hPath-2,x
lda IO.hFD
sta Nod.Table.hFD-2,x
txa hNODE
clc
.9 rts
*/--------------------------------------
* # pipe
* ## C
* `hFD pipe(int size);`
* ## ASM
* `>LDYA size`
* `>SYSCALL pipe`
* ## RETURN VALUE
* CC = OK, CS = ERROR
* A = hFD
*\--------------------------------------
K.Pipe sta .1+1 SIZE HI
.DO AUXPIPE=1
ldx #SYS.NewStkObj
jsr K.SYSCALL2.AUX Buffer in AUX mem
.ELSE
jsr K.GetMem
.FIN
bcs .99
stx .8+1 save PIPE buffer
ldx #2
jsr IO.MkFD
bcs .9
.1 lda #$ff SELF MODIFIED
ldy #S.FD.PIPE.Free+1
sta (pFD),y
ldy #S.FD.PIPE.Size+1
sta (pFD),y
ldy #S.FD.PIPE.hMem
.8 lda #$ff Self Modified
sta (pFD),y
txa hFD
* clc
rts
.9 pha save error code
lda .8+1 get back PIPE buffer
.DO AUXPIPE=1
ldx #SYS.FreeStkObj
jsr K.SYSCALL2.AUX
.ELSE
jsr K.FreeMem
.FIN
pla
sec
.99
K.Pipe.RTS rts
*--------------------------------------
SHARED.Stat.I jsr SHARED.ClrStat
>MLICALL MLIGETFILEINFO
bcs K.Pipe.RTS
lda K.MLI.PARAMS+S.FI.A
jsr SHARED.Stat.Access2Mode
ldx #SHARED.Stat.DST-SHARED.Stat.SRC
.3 ldy SHARED.Stat.SRC-1,x
lda K.MLI.PARAMS,y
ldy SHARED.Stat.DST-1,x
sta K.S.STAT,y
dex
bne .3
>PUSHWI K.S.STAT+S.STAT.CTIME
>LDYAI K.MLI.PARAMS+S.FI.CDATE
>SYSCALL2 PTime2Time BANK2
>PUSHWI K.S.STAT+S.STAT.MTIME
>LDYAI K.MLI.PARAMS+S.FI.MDATE
>SYSCALL2 PTime2Time BANK2
clc
rts
*--------------------------------------
SHARED.DirEnt2Stat
* clc
* rts
*--------------------------------------
SHARED.ClrStat ldx #S.STAT-1
.1 stz K.S.STAT,x
dex
bpl .1
rts
*--------------------------------------
SHARED.Stat.Access2Mode
and #S.FI.A.FULL
cmp #S.FI.A.FULL
beq .7
tay
ldx #S.STAT.MODE.RO+S.STAT.MODE.RG+S.STAT.MODE.RU+S.STAT.MODE.XO+S.STAT.MODE.XG+S.STAT.MODE.XU
bit #S.FI.A.W
beq .1
txa
ora #S.STAT.MODE.WO
tax
tya
.1 asl D in C
bpl .2 RN in N
txa
ora #S.STAT.MODE.WG
tax
.2 txa
bcc .8
ora #S.STAT.MODE.WU
.HS 2C BIT ABS
.7 lda #S.STAT.MODE.FO+S.STAT.MODE.FG+S.STAT.MODE.FU rwxrwxrwx
.8 sta K.S.STAT+S.STAT.MODE
lda /S.STAT.MODE.RU ??????R??
ora K.S.STAT+S.STAT.MODE+1 preserve DIR
sta K.S.STAT+S.STAT.MODE+1
rts
*--------------------------------------
SHARED.Stat.SRC .DA #S.FI.T
.DA #S.FI.AUXTYPE,#S.FI.AUXTYPE+1
.DA #S.FI.UBLKS,#S.FI.UBLKS+1
SHARED.Stat.DST .DA #S.STAT.P.TYPE
.DA #S.STAT.P.AUXTYPE,#S.STAT.P.AUXTYPE+1
.DA #S.STAT.BLOCKS,#S.STAT.BLOCKS+1
*--------------------------------------
MAN
SAVE USR/SRC/SYS/KERNEL.S.STAT
LOAD USR/SRC/SYS/KERNEL.S
ASM