Annotation of lucent/sys/src/9/port/stfcall.c, revision 1.1.1.1

1.1       root        1: #include       "u.h"
                      2: #include       "../port/lib.h"
                      3: #include       "mem.h"
                      4: #include       "dat.h"
                      5: #include       "fns.h"
                      6: #include       "../port/error.h"
                      7: 
                      8: enum
                      9: {
                     10:        Twritehdr       = 16,   /* Min bytes for Twrite */
                     11:        Rreadhdr        = 8,    /* Min bytes for Rread */
                     12:        Twritecnt       = 13,   /* Offset in byte stream of write count */
                     13:        Rreadcnt        = 5,    /* Offset for Readcnt */
                     14: };
                     15: 
                     16: static void fcalliput(Queue*, Block*);
                     17: static void fcalloput(Queue*, Block*);
                     18: static void fcallopen(Queue*, Stream*);
                     19: static void fcallclose(Queue*);
                     20: static void fcallreset(void);
                     21: Qinfo fcallinfo = { fcalliput, fcalloput, fcallopen, fcallclose, "fcall", fcallreset };
                     22: 
                     23: static uchar msglen[256] =
                     24: {
                     25:        [Tnop]          3,
                     26:        [Rnop]          3,
                     27:        [Tsession]      3+CHALLEN,
                     28:        [Rsession]      3+NAMELEN+DOMLEN+CHALLEN,
                     29:        [Terror]        0,
                     30:        [Rerror]        67,
                     31:        [Tflush]        5,
                     32:        [Rflush]        3,
                     33:        [Tattach]       5+2*NAMELEN+TICKETLEN+AUTHENTLEN,
                     34:        [Rattach]       13+AUTHENTLEN,
                     35:        [Tclone]        7,
                     36:        [Rclone]        5,
                     37:        [Twalk]         33,
                     38:        [Rwalk]         13,
                     39:        [Topen]         6,
                     40:        [Ropen]         13,
                     41:        [Tcreate]       38,
                     42:        [Rcreate]       13,
                     43:        [Tread]         15,
                     44:        [Rread]         8,
                     45:        [Twrite]        16,
                     46:        [Rwrite]        7,
                     47:        [Tclunk]        5,
                     48:        [Rclunk]        5,
                     49:        [Tremove]       5,
                     50:        [Rremove]       5,
                     51:        [Tstat]         5,
                     52:        [Rstat]         121,
                     53:        [Twstat]        121,
                     54:        [Rwstat]        5,
                     55:        [Tclwalk]       35,
                     56:        [Rclwalk]       13,
                     57: };
                     58: 
                     59: void
                     60: stfcalllink(void)
                     61: {
                     62:        newqinfo(&fcallinfo);
                     63: }
                     64: 
                     65: static void
                     66: fcallreset(void)
                     67: {
                     68: }
                     69: 
                     70: static void
                     71: fcallopen(Queue *q, Stream *s)
                     72: {
                     73:        USED(q, s);
                     74: }
                     75: 
                     76: static void
                     77: fcallclose(Queue * q)
                     78: {
                     79:        USED(q);
                     80: }
                     81: 
                     82: void
                     83: fcalloput(Queue *q, Block *bp)
                     84: {
                     85:        PUTNEXT(q, bp);
                     86: }
                     87: 
                     88: void
                     89: upstream(Queue *q, ulong len)
                     90: {
                     91:        Block *bl, **tail, *bp;
                     92:        ulong l;
                     93: 
                     94:        tail = &bl;
                     95:        while(len) {
                     96:                l = BLEN(q->first);
                     97:                if(l > len)
                     98:                        break;
                     99:                bp = getq(q);                   /* Consume all of block */
                    100:                *tail = bp;
                    101:                tail = &bp->next;
                    102:                len -= l;
                    103:        }
                    104:        if(len) {                               /* Consume partial block */
                    105:                lock(q);
                    106:                *tail = copyb(q->first, len);
                    107:                q->first->rptr += len;
                    108:                q->len -= len;
                    109:                unlock(q);
                    110:        }
                    111:        for(bp = bl; bp->next; bp = bp->next)
                    112:                ;
                    113:        bp->flags |= S_DELIM;
                    114:        PUTNEXT(q, bl);
                    115: }
                    116: 
                    117: static void
                    118: fcalliput(Queue *q, Block *bp)
                    119: {
                    120:        ulong len, need, off;
                    121: 
                    122:        if(bp->type != M_DATA) {
                    123:                PUTNEXT(q, bp);
                    124:                return;
                    125:        }
                    126:        if(BLEN(bp) == 0) {
                    127:                freeb(bp);
                    128:                return;
                    129:        }
                    130: 
                    131:        /* Stash the data */
                    132:        bp->flags &= ~S_DELIM;
                    133:        putq(q, bp);
                    134: 
                    135:        for(;;) {
                    136:                bp = q->first;
                    137:                if(bp == 0)
                    138:                        return;
                    139:                switch(bp->rptr[0]) {           /* This is the type */
                    140:                default:
                    141:                        len = msglen[bp->rptr[0]];
                    142:                        if(len == 0){
                    143:                                bp = allocb(0);
                    144:                                bp->type = M_HANGUP;
                    145:                                PUTNEXT(q, bp);
                    146:                                return;
                    147:                        }
                    148:                        if(q->len < len)
                    149:                                return;
                    150:        
                    151:                        upstream(q, len);
                    152:                        continue;
                    153: 
                    154:                case Twrite:                    /* Fmt: TGGFFOOOOOOOOCC */
                    155:                        len = Twritehdr;        /* T = type, G = tag, F = fid */
                    156:                        off = Twritecnt;        /* O = offset, C = count */
                    157:                        break;
                    158: 
                    159:                case Rread:                     /* Fmt: TGGFFCC */
                    160:                        len = Rreadhdr;
                    161:                        off = Rreadcnt;
                    162:                        break;
                    163:                }
                    164:        
                    165:                if(q->len < len)
                    166:                        return;
                    167: 
                    168:                /*
                    169:                 *  the lock here is wrong.  it should be a qlock since
                    170:                 *  the pullup may block.  not worth fixing.
                    171:                 */
                    172:                lock(q);
                    173:                bp = q->first = pullup(q->first, len);
                    174:                if(bp == 0)
                    175:                        q->len = 0;
                    176:                unlock(q);
                    177:                need = len+bp->rptr[off]+(bp->rptr[off+1]<<8);
                    178:                if(q->len < need)
                    179:                        return;
                    180:        
                    181:                upstream(q, need);
                    182:        }
                    183: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.