92 lines
1.1 KiB
ArmAsm
92 lines
1.1 KiB
ArmAsm
/ makdir -- make a directory
|
|
|
|
sys getuid
|
|
mov r0,uid
|
|
mov sp,r5
|
|
tst (r5)+
|
|
|
|
loop:
|
|
tst (r5)+
|
|
dec (sp)
|
|
bgt 1f
|
|
sys exit
|
|
1:
|
|
mov (r5),r0
|
|
mov $buf1,r1
|
|
mov $buf2,r2
|
|
clr r3
|
|
1:
|
|
movb (r0)+,r4
|
|
beq 2f
|
|
movb r4,(r1)+
|
|
movb r4,(r2)+
|
|
cmpb r4,$'/
|
|
bne 1b
|
|
mov r2,r3
|
|
br 1b
|
|
2:
|
|
movb $'/,(r1)+
|
|
movb $'.,(r1)+
|
|
clrb (r1)
|
|
mov $dot,dir
|
|
tst r3
|
|
beq 1f
|
|
mov $buf2,dir
|
|
clrb (r3)
|
|
cmp r3,$buf2+1
|
|
beq 1f
|
|
clrb -(r3) / ???
|
|
1:
|
|
tstb uid
|
|
beq 2f
|
|
sys stat; dir:..; stbuf / status of parent dir
|
|
bes error
|
|
mov stbuf+4,r0
|
|
cmpb uid,stbuf+7
|
|
bne 1f
|
|
ash $-6,r0
|
|
1:
|
|
ror r0
|
|
ror r0
|
|
bcc error / no write permission in parent
|
|
2:
|
|
mov (r5),0f
|
|
sys makdir; 0:..; 140777; 0
|
|
bes error / prob already exists
|
|
mov (r5),0f
|
|
sys chown; 0:..; uid:..
|
|
mov (r5),0f
|
|
sys link; 0:..; buf1
|
|
bes error
|
|
movb $'.,(r1)+
|
|
clrb (r1)
|
|
mov dir,0f
|
|
sys link; 0:..; buf1
|
|
bec loop
|
|
|
|
error:
|
|
mov (r5),r0
|
|
mov r0,0f
|
|
clr 0f+2
|
|
1:
|
|
tstb (r0)+
|
|
beq 1f
|
|
inc 0f+2
|
|
br 1b
|
|
1:
|
|
mov $1,r0
|
|
sys write; 0:..; ..
|
|
mov $1,r0
|
|
sys write; ques; 3
|
|
br loop
|
|
|
|
dot: <.\0>
|
|
ques: < ?\n>
|
|
.even
|
|
|
|
.bss
|
|
buf1: .=.+100.
|
|
buf2: .=.+100.
|
|
stbuf: .=.+40.
|
|
|