diff options
Diffstat (limited to 'src/nslcd/proto/server/func_handlerequest.go.sh')
-rwxr-xr-x | src/nslcd/proto/server/func_handlerequest.go.sh | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/src/nslcd/proto/server/func_handlerequest.go.sh b/src/nslcd/proto/server/func_handlerequest.go.sh new file mode 100755 index 0000000..3ef2758 --- /dev/null +++ b/src/nslcd/proto/server/func_handlerequest.go.sh @@ -0,0 +1,101 @@ +#!/usr/bin/env bash +# -*- Mode: Go -*- +# Copyright (C) 2015 Luke Shumaker <lukeshu@sbcglobal.net> +# +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; either +# version 2.1 of the License, or (at your option) any later version. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 USA + +requests=$1 +printf '//' +printf ' %q' "$0" "$@" +printf '\n// MACHINE GENERATED BY THE COMMAND ABOVE; DO NOT EDIT\n\n' +cat <<EOF | gofmt +package nslcd_server + +import ( + "fmt" + "io" + p "nslcd/proto" + "os" + s "syscall" +) + +// Handle a request to nslcd +func HandleRequest(backend Backend, in io.Reader, out io.Writer, cred s.Ucred) (err error) { + err = nil + defer func() { + if r := recover(); r != nil { + switch r := r.(type) { + case error: + err = r + default: + panic(r) + } + } + }() + handleRequest(backend, in, out, cred) + return +} + +func handleRequest(backend Backend, in io.Reader, out io.Writer, cred s.Ucred) { + var version int32 + p.Read(in, &version) + if version != p.NSLCD_VERSION { + panic(p.NslcdError(fmt.Sprintf("Version mismatch: server=%#08x client=%#08x", p.NSLCD_VERSION, version))) + } + var action int32 + p.Read(in, &action) + + ch := make(chan interface{}) + switch action { +$( +while read -r request; do + cat <<EOT + case p.NSLCD_ACTION_${request^^}: + var req p.Request_${request} + p.Read(in, &req) + $( + if [[ $request == PAM_Authentication ]]; then + echo '_req := req' + echo '_req.Password = "<omitted-from-log>"' + echo 'fmt.Fprintf(os.Stderr, "Request: %#v\n", _req)' + else + echo 'fmt.Fprintf(os.Stderr, "Request: %#v\n", req)' + fi + ) + _ch := backend.${request}(cred, req) + go func() { + defer close(ch) + for obj := range _ch { + ch <- obj + } + }() +EOT +done < "$requests" +) + default: + close(ch) + panic(p.NslcdError(fmt.Sprintf("Unknown request action: %#08x", action))) + } + p.Write(out, p.NSLCD_VERSION) + p.Write(out, action) + + for result := range ch { + p.Write(out, p.NSLCD_RESULT_BEGIN) + p.Write(out, result) + } + p.Write(out, p.NSLCD_RESULT_END) +} +EOF |