tfactotum: update for new nbrecvul return value - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit e75dbb6af8fbea53c62efb7176ed2d25a47557c9
 (DIR) parent 2c3c82126b2e59d7951596adb863514eff45cf29
 (HTM) Author: Russ Cox <rsc@swtch.com>
       Date:   Wed, 15 Jan 2020 10:48:20 -0500
       
       factotum: update for new nbrecvul return value
       
       Unclear whether the old semantics were the right ones,
       but at least this preserves what they've been for the past
       however many years.
       
       Diffstat:
         M src/cmd/auth/factotum/confirm.c     |      32 +++++++++++++++++++++++++++++--
       
       1 file changed, 30 insertions(+), 2 deletions(-)
       ---
 (DIR) diff --git a/src/cmd/auth/factotum/confirm.c b/src/cmd/auth/factotum/confirm.c
       t@@ -128,17 +128,33 @@ needkeywrite(char *s)
        int
        needkey(Conv *c, Attr *a)
        {
       +        ulong u;
       +
                if(c == nil || *needkeyinuse == 0)
                        return -1;
        
                lbappend(&needkeybuf, "needkey tag=%lud %A", c->tag, a);
                flog("needkey %A", a);
       -        return nbrecvul(c->keywait);
       +
       +        // Note: This code used to "return nbrecvul(c->keywait)."
       +        // In Jan 2020 we changed nbrecvul to match Plan 9 and
       +        // the man page and return 0 on "no data available" instead
       +        // of -1. This new code with an explicit nbrecv preserves the
       +        // code's old semantics, distinguishing a sent 0 from "no data".
       +        // That said, this code seems to return -1 unconditionally:
       +        // the c->keywait channel is unbuffered, and the only sending
       +        // to it is done with an nbsendul, which won't block waiting for
       +        // a receiver. So there is no sender for nbrecv to find here.
       +        if(nbrecv(c->keywait, &u) < 0)
       +                return -1;
       +        return u;
        }
        
        int
        badkey(Conv *c, Key *k, char *msg, Attr *a)
        {
       +        ulong u;
       +
                if(c == nil || *needkeyinuse == 0)
                        return -1;
        
       t@@ -146,5 +162,17 @@ badkey(Conv *c, Key *k, char *msg, Attr *a)
                        c->tag, k->attr, k->privattr, msg, a);
                flog("badkey %A / %N / %s / %A",
                        k->attr, k->privattr, msg, a);
       -        return nbrecvul(c->keywait);
       +
       +        // Note: This code used to "return nbrecvul(c->keywait)."
       +        // In Jan 2020 we changed nbrecvul to match Plan 9 and
       +        // the man page and return 0 on "no data available" instead
       +        // of -1. This new code with an explicit nbrecv preserves the
       +        // code's old semantics, distinguishing a sent 0 from "no data".
       +        // That said, this code seems to return -1 unconditionally:
       +        // the c->keywait channel is unbuffered, and the only sending
       +        // to it is done with an nbsendul, which won't block waiting for
       +        // a receiver. So there is no sender for nbrecv to find here.
       +        if(nbrecv(c->keywait, &u) < 0)
       +                return -1;
       +        return u;
        }