Currently, for user shell access, we use custom C executables for cvs.sv and symlink to sftp-server for arch.sv.
Savane distributes sv_membersh, a simple Perl script, that loads another Perl script in /etc for configuration. Using a Perl script as a login shell may yeld some efficiency concerns.
Another tool is rssh (http://packages.debian.org/stable/net/rssh). This package does not check the command line arguments to cvs (in util.c), though it faced some security issues that sv_membersh was also vulnerable to (https://gna.org/bugs/?func=detailitem&item_id=4824). It is interesting to check upon that tool even if we do not use it for that reason. This package is in C but looks somewhat bloated, so maybe it is not a good idea to use it (plus we'd have to patch the CVS validation).
I think a good move is to use sv_membersh and to translate it to C if we think that can reduce the load.