diff options
Diffstat (limited to 'nslcd_server/func_handlerequest.go.gen')
-rwxr-xr-x | nslcd_server/func_handlerequest.go.gen | 26 |
1 files changed, 21 insertions, 5 deletions
diff --git a/nslcd_server/func_handlerequest.go.gen b/nslcd_server/func_handlerequest.go.gen index 00e9663..750a7b0 100755 --- a/nslcd_server/func_handlerequest.go.gen +++ b/nslcd_server/func_handlerequest.go.gen @@ -25,12 +25,12 @@ cat <<EOF | gofmt package nslcd_server import ( + "context" "fmt" "io" "os" "time" - "golang.org/x/sys/unix" p "git.lukeshu.com/go/libnslcd/nslcd_proto" ) @@ -70,8 +70,9 @@ type Conn interface { SetWriteDeadline(t time.Time) error } -// Handle a request to nslcd -func HandleRequest(backend Backend, limits Limits, conn Conn, cred unix.Ucred) (err error) { +// Handle a request to nslcd. The caller is responsible for +// initializing the context with PeerCredKey. +func HandleRequest(backend Backend, limits Limits, conn Conn, ctx context.Context) (err error) { defer func() { if r := recover(); r != nil { switch r := r.(type) { @@ -89,6 +90,11 @@ func HandleRequest(backend Backend, limits Limits, conn Conn, cred unix.Ucred) ( if limits.Timeout != 0 { deadlineAll = now.Add(limits.Timeout) } + if deadline, ok := ctx.Deadline(); ok { + if deadlineAll.IsZero() || deadline.Before(deadlineAll) { + deadlineAll = deadline + } + } if limits.ReadTimeout != 0 { deadlineRead = now.Add(limits.ReadTimeout) if !deadlineAll.IsZero() && deadlineAll.Before(deadlineRead) { @@ -149,6 +155,7 @@ while read -r request; do ;; esac ) + if limits.WriteTimeout != 0 { deadlineWrite = time.Now().Add(limits.WriteTimeout) if !deadlineAll.IsZero() && deadlineAll.Before(deadlineWrite) { @@ -161,9 +168,18 @@ while read -r request; do return err } } + + var cancel context.CancelFunc + if deadline, ok := ctx.Deadline(); !ok || (!deadlineWrite.IsZero() && deadline.After(deadlineWrite)) { + ctx, cancel = context.WithDeadline(ctx, deadlineWrite) + } else { + ctx, cancel = context.WithCancel(ctx) + } + defer cancel() + maybePanic(p.Write(out, p.NSLCD_VERSION)) maybePanic(p.Write(out, action)) - ch := backend.${request}(cred, req) + ch := backend.${request}(ctx, req) for result := range ch { if err == nil { err = p.Write(out, p.NSLCD_RESULT_BEGIN) @@ -174,7 +190,7 @@ while read -r request; do } maybePanic(err) maybePanic(p.Write(out, p.NSLCD_RESULT_END)) - return nil + return ctx.Err() // probably nil EOT done < "$requests" ) |