A2osX/BIN/USERMOD.S.txt
2022-11-02 07:54:30 +01:00

241 lines
4.9 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
.LIST OFF
.OP 65C02
.OR $2000
.TF bin/usermod
*--------------------------------------
USER.MAX .EQ 16
PASS.MAX .EQ 64
*--------------------------------------
.INB inc/macros.i
.INB inc/a2osx.i
*--------------------------------------
* Zero Page Segment, up to 32 bytes
*--------------------------------------
.DUMMY
.OR ZPBIN
ZS.START
ArgIndex .BS 1
ArgUsername .BS 1
ZPStrPtr .BS 2
ZPTmpPtr .BS 2
ZS.END .ED
*--------------------------------------
* File Header (16 Bytes)
*--------------------------------------
CS.START cld
jmp (.1,x)
.DA #$61 6502,Level 1 (65c02)
.DA #1 BIN Layout Version 1
.DA #0 S.PS.F.EVENT
.DA #0
.DA CS.END-CS.START Code Size (without Constants)
.DA DS.END-DS.START Data Segment Size
.DA #64 Stack Size
.DA #ZS.END-ZS.START Zero Page Size
.DA 0
*--------------------------------------
* Relocation Table
*--------------------------------------
.1 .DA CS.INIT
.DA CS.RUN
.DA CS.DOEVENT
.DA CS.QUIT
L.MSG.USAGE .DA MSG.USAGE
J.CS.RUN.CheckArg
.DA CS.RUN.CheckArg.C
.DA CS.RUN.CheckArg.D
.DA CS.RUN.CheckArg.P
.DA CS.RUN.CheckArg.S
.DA 0
*--------------------------------------
* Called once at process creation
* Put code for loading LIB here
*--------------------------------------
CS.INIT clc
rts
*--------------------------------------
* Called until exit with CS
* if RUN exits with CC, RN entered again
*--------------------------------------
CS.RUN ldy #S.PS.ARGC
lda (pPS),y
beq .9
jsr CS.RUN.CheckArg
bcs .99
>PUSHW pData
>SYSCALL PutPW
bcs .99
lda #0
sec
rts
.9 >LDYA L.MSG.USAGE
>SYSCALL PutS
lda #E.SYN
sec
.99 rts
*--------------------------------------
CS.RUN.CheckArg inc ArgIndex
lda ArgIndex
>SYSCALL ArgV
bcs .8
>STYA ZPStrPtr
lda (ZPStrPtr)
cmp #'-'
bne .4
lda ArgUsername
beq CS.RUN.CheckArg.9
ldy #1
lda (ZPStrPtr),y
ldx #OptionCnt-1
.2 cmp OptionList,x
beq .3
dex
bpl .2
lda #E.SYN
sec
rts
.3 txa
and #$fe
tax
jmp (J.CS.RUN.CheckArg,x)
*--------------------------------------
.4 lda ArgUsername
bne CS.RUN.CheckArg.9
lda ArgIndex
sta ArgUsername
>SYSCALL ArgV
>PUSHYA
>PUSHW pData
>SYSCALL GetPWName
bcs .9
bra CS.RUN.CheckArg
.8 lda ArgUsername
beq CS.RUN.CheckArg.9
clc
rts
.9 lda #E.IUSR
sec
rts
CS.RUN.CheckArg.9
lda #E.SYN
sec
rts
*--------------------------------------
CS.RUN.CheckArg.P
inc ArgIndex
lda ArgIndex
>SYSCALL ArgV
bcs CS.RUN.CheckArg.9
>PUSHYA
>PUSHEA.G S.PW.PASSWD
>SYSCALL MD5
jmp CS.RUN.CheckArg
*--------------------------------------
CS.RUN.CheckArg.C
inc ArgIndex
lda ArgIndex
>SYSCALL ArgV
bcs CS.RUN.CheckArg.9
ldx #S.PW.GECOS
bra CS.RUN.CheckArg.Next
*--------------------------------------
CS.RUN.CheckArg.D
inc ArgIndex
lda ArgIndex
>SYSCALL ArgV
bcs CS.RUN.CheckArg.9
ldx #S.PW.DIR
bra CS.RUN.CheckArg.Next
*--------------------------------------
CS.RUN.CheckArg.S
inc ArgIndex
lda ArgIndex
>SYSCALL ArgV
bcs CS.RUN.CheckArg.9
ldx #S.PW.SHELL
CS.RUN.CheckArg.Next
>STYA ZPStrPtr
* clc
txa
adc pData
sta ZPTmpPtr
lda pData+1
adc #0
sta ZPTmpPtr+1
ldy #$ff
.1 iny
lda (ZPStrPtr),y
sta (ZPTmpPtr),y
beq .8
cpy #64
bne .1
lda #0
sta (ZPTmpPtr),y
.8 jmp CS.RUN.CheckArg
*--------------------------------------
CS.RUN.MkDir >PUSHEA.G S.PW.DIR
>PUSHWI S.STAT.MODE.RO+S.STAT.MODE.RG+S.STAT.MODE.FU
>SYSCALL MKDir
rts
*--------------------------------------
* Called if option S.PS.F.EVENT enabled in Header
* Timer Event : every 10th seconds
*--------------------------------------
CS.DOEVENT sec
rts
*--------------------------------------
* Called once, when RUN exited with CS
* Put code for unloading LIB here
*--------------------------------------
CS.QUIT clc
rts
*--------------------------------------
CS.END
*--------------------------------------
OptionList .AS "CcDdPpSs"
OptionCnt .EQ *-OptionList
*--------------------------------------
* Initialized DATA
*--------------------------------------
MSG.USAGE .CS "Usage : USERMOD username\r\n"
.CS " -c : Comment (GECOS)\r\n"
.CS " -d : Home Directory\r\n"
.CS " -p : Password\r\n"
.CZ " -s : Shell\r\n"
*--------------------------------------
.DUMMY
.OR 0
DS.START
PW .BS S.PW
DS.END .ED
*--------------------------------------
MAN
SAVE usr/src/bin/usermod.s
ASM