retroforth/example/unix-does-user-exist.retro
crc 8c441b820f whitespace cleanups, add back -h startup option
FossilOrigin-Name: aa18384826a4134b64001c9b64b15bfd84f1d1326e1613da8dbdcc6c7a3a3631
2021-04-30 15:09:01 +00:00

38 lines
916 B
Forth

This implements a word to determine if a user exists. This is done by
parsing the results of `finger`.
~~~
:pipe> (s-s) file:R unix:popen [ file:read-line ] [ unix:pclose ] bi ;
{{
:command 'finger_%s_2>&1 s:format ;
:parse ASCII:SPACE s:tokenize ;
:login? #0 a:th fetch 'Login: s:eq? ;
---reveal---
:user:exists? (s-f)
&Heap [ command pipe> parse login? ] v:preserve ;
}}
'crc user:exists?
'fakeuser user:exists?
'root user:exists?
~~~
A second way is to parse the `/etc/passwd` file.
~~~
{{
:setup (s-fs) FALSE swap ': s:append s:keep ;
:match? (fss-fsf) over s:begins-with? ;
:found (fs-fs) drop-pair TRUE s:empty s:keep ;
:check (fss-fs) match? [ found ] if ;
:seek (fs-fs) '/etc/passwd [ check ] file:for-each-line ;
---reveal---
:user:exists? (s-f)
&Heap [ setup seek drop ] v:preserve ;
}}
'crc user:exists?
'fakeuser user:exists?
'root user:exists?
~~~