1 fun isMember (list
, addr
) =
3 val proc
= Unix
.execute ("/usr/sbin/find_member", ["-l", list
, addr
])
5 (case TextIO.inputLine (Unix
.textInstreamOf proc
) of
8 before ignore (Unix
.reap proc
)
11 fun isIdent ch
= Char.isLower ch
orelse Char.isDigit ch
14 size s
> 0 andalso size s
< 20 andalso List.all
isIdent (String.explode s
)
17 size s
> 0 andalso size s
< 100 andalso List.all
validHost (String.fields (fn ch
=> ch
= #
".") s
)
19 fun validEmailUser s
=
20 size s
> 0 andalso size s
< 50 andalso List.all
21 (fn ch
=> Char.isAlphaNum ch
orelse ch
= #
"." orelse ch
= #
"_" orelse ch
= #
"-" orelse ch
= #
"+")
25 (case String.fields (fn ch
=> ch
= #
"@") s
of
26 [user
, host
] => validEmailUser user
andalso validDomain host
30 case CommandLine
.arguments () of
32 if list
<> "hcoop-discuss" andalso list
<> "hcoop-misc" andalso list
<> "hcoop-announce" andalso list
<> "hcoop-sysadmin" then
33 (print
"Bad mailing list name\n";
35 else if not (validEmail addr
) then
36 (print
"Invalid e-mail address\n";
40 if isMember (list
, addr
) then
45 if isMember (list
, addr
) then
48 OS
.Process
.system (String.concat
["echo ", addr
, " | /usr/sbin/add_members -r - ", list
])
50 if list
= "hcoop-announce" then
51 (print
"You can't remove anyone from hcoop-announce.\n";
53 else if isMember (list
, addr
) then
54 OS
.Process
.system (String.concat
["/usr/sbin/remove_members ", list
, " ", addr
])
57 | _
=> (print ("Invalid command " ^ cmd ^
"\n");
59 | _
=> (print
"Bad command-line arguments\n";
62 val _
= OS
.Process
.exit (main ())