A2osX/SYS/KERNEL.S.PWDX.txt
2019-07-29 17:38:55 +02:00

625 lines
9.7 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
*--------------------------------------
* ZPPtr1 : UID / pName (Input)
* ZPPtr2 : pPW (Output)
* ZPPtr3 : pDB
* USERNAME:PASSWORD:UID:GID:GECOS:HOME:SHELL\CR
* ....\CR
* \0
*--------------------------------------
*/--------------------------------------
* # GetPWUID
* ## C
* `int getpwuid(short int uid, S.PW* passwd );`
* ## ASM
* `>PUSHW passwd`
* `lda uid`
* `>SYSCALL getpwuid`
* ## RETURN VALUE
*\--------------------------------------
K.GetPWUID sta ZPPtr1+1
jsr SHARED.PullYA
>STYA ZPPtr2
lda PWD.hDB
beq PWD.GetPW.9
jsr K.GetmemPtr
>STYA ZPPtr3
.1 lda (ZPPtr3)
beq PWD.GetPW.99 EOF
ldy #0
jsr PWD.NextString skip USERNAME
jsr PWD.NextString skip PASSWORD
jsr PWD.GetByte get UID
cmp ZPPtr1+1
beq PWD.GetPW.8
jsr PWD.NextLine
bra .1
PWD.GetPW.8 ldx ZPPtr2+1
beq .8 Dry run, no output
jmp PWD.Record2PW
.8 clc a = UID
rts
PWD.GetPW.9 lda #E.IPWDDB
sec
rts
PWD.GetPW.99 lda #E.IUSR
sec
PWD.GetPW.RTS rts
*/--------------------------------------
* # GetPWName
* ## C
* `int getpwname(const char* name, S.PW* passwd );`
* ## ASM
* `>PUSHW passwd`
* `>LDYA name`
* `>SYSCALL getpwname`
* ## RETURN VALUE
*\--------------------------------------
K.GetPWName >STYA TXTPTR
jsr SHARED.PullYA
>STYA ZPPtr2
lda PWD.hDB
beq PWD.GetPW.9
jsr K.GetmemPtr
>STYA ZPPtr3
ldy #0
jsr SHARED.TXTPTR.GetY
beq PWD.GetPW.99
.1 lda (ZPPtr3)
beq PWD.GetPW.99
ldy #$ff
.2 iny
jsr SHARED.TXTPTR.GetY
beq .4
cmp (ZPPtr3),y
beq .2
.3 jsr PWD.NextLine
bra .1
.4 lda (ZPPtr3),y
cmp #':'
bne .3
ldx ZPPtr2+1
beq .8
jmp PWD.Record2PW
.8 iny
jsr PWD.NextString skip PASSWORD
jmp PWD.GetByte get UID
*/--------------------------------------
* # PutPW
* ## C
* `int putpw( S.PW* passwd );`
* ## ASM
* `>LDYA passwd`
* `>SYSCALL putpw`
* ## RETURN VALUE
*\--------------------------------------
K.PutPW >STYA ZPPtr2
>STYA TXTPTR
*--------------------------------------
* ZPPtr2 : pPW (Input)
* ZPPtr3 : pDB
*--------------------------------------
lda PWD.hDB
bne .1
ldy #S.PW.UID
jsr SHARED.TXTPTR.GetY
bne PWD.GetPW.RTS Must be ROOT user
jsr PWD.GetRecordLen
tay
lda #0
>STYA PWD.DBSize
jsr K.getmem
bcs PWD.GetPW.RTS
>STYA ZPPtr3
>STYA PWD.DBPtr
stx PWD.hDB
jmp .8
.1 jsr K.GetmemPtr
>STYA PWD.DBPtr
ldy #S.PW.PASSWD
jsr SHARED.TXTPTR.GetY
bne .12
jsr PWD.DeleteRecord
bcc .80
rts
.12 jsr PWD.DeleteRecord
bcc .11 user exits..
jsr PWD.GetUID new user, get UID
bcs .99
ldy #S.PW.UID
sta CLRWRITEAUX
sta (TXTPTR),y
sta SETWRITEAUX
.11 jsr PWD.GetRecordLen
clc
adc PWD.DBSize
sta PWD.DBSize
bcc .2
inc PWD.DBSize+1
.2 >LDYA PWD.DBPtr
>STYA ZPPtr4
>LDYA PWD.DBSize
jsr K.Getmem
bcs .99
>STYA ZPPtr3
>STYA PWD.DBPtr
ldy #0
.3 lda (ZPPtr4),y
sta (ZPPtr3),y
beq .4
iny
bne .3
inc ZPPtr4
inc ZPPtr3
bra .3
.4 tya
clc
adc ZPPtr3
sta ZPPtr3
bcc .5
inc ZPPtr3+1
.5 lda PWD.hDB
stx PWD.hDB
jsr K.Freemem
.8 jsr PWD.StoreRecord
.80 inc PWD.bDirty
clc
.99 rts
.9 lda #E.IPWDDB
sec
rts
*--------------------------------------
PWD.Save lda PWD.bDirty
beq .9
lda PWD.DBPtr
sta A1L
clc
adc PWD.DBSize
sta A2L
lda PWD.DBPtr+1
sta A1L+1
adc PWD.DBSize+1
sta A2L+1
>LDYA PWD.DBSize
>SYSCALL2 GetMem
bcs .9
stx .8+1
>STYA A4L Save Destination Address in MAIN
clc Aux To Main
jsr AuxMove
>PUSHWZ Aux type
>PUSHBI S.FI.T.TXT
>PUSHBI O.WRONLY+O.CREATE
>LDYAI PWD.FILE
ldx #SYS.FOpen
jsr K.SYSCALL2.BANK
bcc .1
pha
jsr .8
pla
sec
.9 rts
.1 sta .7+1
>PUSHW PWD.DBSize
lda .8+1
jsr K.getmemptr
>PUSHYA
lda .7+1
ldx #SYS.FWrite
jsr K.SYSCALL2.BANK
bcc .2
pha
jsr .7
pla
sec
rts
.2 stz PWD.bDirty
.7 lda #$ff SELF MODIFIED
ldx #SYS.fclose
jsr K.SYSCALL2.BANK
.8 lda #$ff
jmp K.freemem SELF MODIFIED
*--------------------------------------
* PRIVATE
*--------------------------------------
PWD.GetUID >LDYA PWD.DBPtr
>STYA ZPPtr3
stz .8+1
.1 lda (ZPPtr3)
beq .8 End of DB
ldy #0
jsr PWD.NextString skip name
jsr PWD.NextString skip password
jsr PWD.GetByte
cmp .8+1
bcc .4
sta .8+1
.4 jsr PWD.NextLine
bra .1
.8 lda #$ff SELF MODIFIED
inc
beq .9
clc
rts
.9 lda #E.IUSR
sec
rts
*--------------------------------------
PWD.DeleteRecord
jsr PWD.FindRecord
bcs .9
.1 iny
lda (ZPPtr3),y
cmp #C.CR
bne .1
sty .3+1
tya
sec
adc ZPPtr3
sta ZPPtr4
lda ZPPtr3+1
adc #0
sta ZPPtr4+1
ldy #$ff
.2 iny
lda (ZPPtr4),y
sta (ZPPtr3),y
bne .2
lda PWD.DBSize
sec
.3 sbc #$ff SELF MODIFIED
sta PWD.DBSize
bcs .8
dec PWD.DBSize+1
.8 clc
.9 rts
*--------------------------------------
PWD.FindRecord >LDYA PWD.DBPtr
>STYA ZPPtr3
>LDYA ZPPtr2
>STYA TXTPTR
.2 lda (ZPPtr3)
beq .9 End of DB
ldy #$ff
.3 iny
jsr SHARED.TXTPTR.GetY
beq .4
cmp (ZPPtr3),y
beq .3
.5 jsr PWD.NextLine
bra .2
.4 lda (ZPPtr3),y
cmp #':'
bne .5
clc
rts
.9 lda #E.IUSR
sec
rts
*--------------------------------------
PWD.NextString lda (ZPPtr3),y
iny
cmp #':'
bne PWD.NextString
rts
*--------------------------------------
PWD.NextLine iny
lda (ZPPtr3),y
cmp #C.CR
bne PWD.NextLine
tya
sec
adc ZPPtr3
sta ZPPtr3
bcc .8
inc ZPPtr3+1
.8 rts
*--------------------------------------
PWD.Record2PW sta CLRWRITEAUX
ldy #0
ldx #0 NAME
.1 lda (ZPPtr3),y
iny
cmp #':'
beq .2
jsr SHARED.PutCharPtr2
inx
bra .1
.2 lda #0
jsr SHARED.PutCharPtr2
inx
cpx #S.PW.PASSWD
bne .2
.3 lda (ZPPtr3),y
iny
cmp #':'
beq .4
jsr SHARED.PutCharPtr2
inx
bra .3
.4 lda #0
jsr SHARED.PutCharPtr2
inx
cpx #S.PW.UID
bne .4
jsr PWD.GetByte UID
jsr SHARED.PutCharPtr2
jsr PWD.GetByte GID
jsr SHARED.PutCharPtr2
ldx #S.PW.GECOS
.5 lda (ZPPtr3),y
iny
cmp #':'
beq .6
jsr SHARED.PutCharPtr2
inx
bra .5
.6 lda #0
jsr SHARED.PutCharPtr2
inx
cpx #S.PW.DIR
bne .6
.7 lda (ZPPtr3),y
iny
cmp #':'
beq .8
jsr SHARED.PutCharPtr2
inx
bra .7
.8 lda #0
jsr SHARED.PutCharPtr2
inx
cpx #S.PW.SHELL
bne .8
.9 lda (ZPPtr3),y
iny
cmp #C.CR
beq .10
jsr SHARED.PutCharPtr2
inx
bra .9
.10 lda #0
jsr SHARED.PutCharPtr2
sta SETWRITEAUX
clc
rts
*--------------------------------------
PWD.GetByte stz ZPPtr4
.1 lda (ZPPtr3),y
iny
cmp #':'
beq .8
and #$f
pha
lda ZPPtr4
asl
asl
clc
adc ZPPtr4
asl
sta ZPPtr4
pla
clc
adc ZPPtr4
sta ZPPtr4
bra .1
.8 lda ZPPtr4
clc
rts
*--------------------------------------
PWD.StoreRecord sec
.HS 90 BCC
*--------------------------------------
PWD.GetRecordLen
clc
ldx #0
ldy #S.PW.NAME-1
jsr PWD.StoreString
lda #':'
jsr PWD.StoreChar
ldy #S.PW.PASSWD-1
jsr PWD.StoreString
lda #':'
jsr PWD.StoreChar
ldy #S.PW.UID
jsr SHARED.TXTPTR.GetY
jsr PWD.StoreByte
lda #':'
jsr PWD.StoreChar
iny S.PW.UID
jsr SHARED.TXTPTR.GetY
jsr PWD.StoreByte
lda #':'
jsr PWD.StoreChar
* iny S.PW.GECOS
jsr PWD.StoreString
lda #':'
jsr PWD.StoreChar
ldy #S.PW.DIR-1
jsr PWD.StoreString
lda #':'
jsr PWD.StoreChar
ldy #S.PW.SHELL-1
jsr PWD.StoreString
lda #C.CR
jsr PWD.StoreChar
txa
PWD.GetRecordLen.RTS
rts
*--------------------------------------
PWD.StoreString iny
jsr SHARED.TXTPTR.GetY
beq PWD.GetRecordLen.RTS
jsr PWD.StoreChar
bra PWD.StoreString
*--------------------------------------
PWD.StoreByte php
phx
jsr MATH.A2STR10NP
plx
plp
ldy #0
.1 lda A2osX.NumStrBuf,y
beq PWD.GetRecordLen.RTS
iny
jsr PWD.StoreChar
bra .1
*--------------------------------------
PWD.StoreChar inx
bcc .9 Dry run, no store
sta (ZPPtr3)
inc ZPPtr3
bne .9
inc ZPPtr3+1
.9 rts
*--------------------------------------
MAN
SAVE USR/SRC/SYS/KERNEL.S.PWDX
LOAD USR/SRC/SYS/KERNEL.S
ASM