summaryrefslogtreecommitdiff
path: root/src/posix/posix-umask.txt
blob: 5bf49a29c851e6a47d3d9490ed362280299290ba (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
 parsemode() function for posix-umask

 goal: parse the "u+r,g-wx,o=u" symbolic mode string and convert it
to a numeric value suitable for umask().
 In the purest skarnet.org tradition, we implement the parser via a DFA.

class	|	0	1	2	3	4	5	6
st\ev	|	\0	,	+-=	ugo	a	rwxXst	other
------------------------------------------------------------------------
START	|			wo	w	w
0	|	END	START	OP	WHO	WHO	X	X

WHO	|			o	w	w
1	|	END	X	OP	WHO	WHO	X	X

OP	|		r	o	c		p
2	|	END	START	OP	PERMCPY	X	PERM	X

PERMCPY	|	!	!rR	!Ro	
3	|	END	START	OP	X	X	X	X

PERM	|	!	!rR	!Ro			p
4	|	END	START	OP	X	X	PERM	X
------------------------------------------------------------------------

END=5, X=6. -> states: 3 bits
7 actions -> 10 bits total, need uint16_t

 w: 0x020: who |= c
 o: 0x040: store op
 c: 0x080: copy perm from c
 p: 0x100: perm |= c
 r: 0x200: reset who
 R: 0x400: reset perm
 !: 0x800: apply (who, op, perm) change