Annotation of XNU/bsd/netat/adsp_stream.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * The contents of this file constitute Original Code as defined in and
                      7:  * are subject to the Apple Public Source License Version 1.1 (the
                      8:  * "License").  You may not use this file except in compliance with the
                      9:  * License.  Please obtain a copy of the License at
                     10:  * http://www.apple.com/publicsource and read it before using this file.
                     11:  * 
                     12:  * This Original Code and all software distributed under the License are
                     13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     17:  * License for the specific language governing rights and limitations
                     18:  * under the License.
                     19:  * 
                     20:  * @APPLE_LICENSE_HEADER_END@
                     21:  */
                     22: /*
                     23:  *     Copyright (c) 1995-1998 Apple Computer, Inc.
                     24:  *     All Rights Reserved.
                     25:  */
                     26: 
                     27: /*
                     28:  * 09/07/95 - Modified for performance (Tuyen Nguyen)
                     29:  *    Modified for MP, 1996 by Tuyen Nguyen
                     30:  *   Modified, April 9, 1997 by Tuyen Nguyen for MacOSX.
                     31:  */
                     32: #include <sys/errno.h>
                     33: #include <sys/types.h>
                     34: #include <sys/param.h>
                     35: #include <machine/spl.h>
                     36: #include <sys/systm.h>
                     37: #include <sys/kernel.h>
                     38: #include <sys/proc.h>
                     39: #include <sys/filedesc.h>
                     40: #include <sys/fcntl.h>
                     41: #include <sys/mbuf.h>
                     42: #include <sys/socket.h>
                     43: #include <sys/socketvar.h>
                     44: #include <sys/time.h>
                     45: #include <sys/ioctl.h>
                     46: #include <sys/malloc.h>
                     47: 
                     48: #include <net/if.h>
                     49: 
                     50: #include <netat/sysglue.h>
                     51: #include <netat/appletalk.h>
                     52: #include <netat/ddp.h>
                     53: #include <netat/at_snmp.h>
                     54: #include <netat/at_pcb.h>
                     55: #include <netat/debug.h>
                     56: #include <netat/at_var.h>
                     57: #include <netat/adsp.h>
                     58: #include <netat/adsp_internal.h>
                     59: 
                     60: void SndMsgUp();
                     61: void adsp_rput();
                     62: static void adsp_iocack();
                     63: static void adsp_iocnak();
                     64: void adsp_dequeue_ccb();
                     65: unsigned char adspAssignSocket();
                     66: int adspallocate(), adsprelease();
                     67: int adspInited = 0;
                     68: 
                     69: atlock_t adspall_lock;
                     70: atlock_t adspgen_lock;
                     71: GLOBAL adspGlobal;
                     72: 
                     73: /**********/
                     74: 
                     75: int adsp_pidM[256];
                     76: char adsp_inputC[256];
                     77: CCB *adsp_inputQ[256];
                     78: 
                     79: extern char ot_adsp_socketM[];
                     80: extern at_ifaddr_t *ifID_home;
                     81: 
                     82: CCB *ccb_used_list;
                     83: 
                     84: void adsp_input(mp)
                     85:        gbuf_t *mp;
                     86: {
                     87:        gref_t *gref;
                     88:        CCBPtr sp;
                     89:        at_ddp_t *p;
                     90:        int s, l;
                     91:        gbuf_t *mb;
                     92: 
                     93:        switch (gbuf_type(mp)) {
                     94:        case MSG_DATA:
                     95:                p = (at_ddp_t *)gbuf_rptr(mp);
                     96:                ATDISABLE(s, adspall_lock);
                     97:                sp = adsp_inputQ[p->dst_socket];
                     98:                if ((sp == 0) || (sp->gref==0) || (sp->state==sClosed))
                     99:                {
                    100:                        ATENABLE(s, adspall_lock);
                    101:                        gbuf_freem(mp);
                    102:                        return;
                    103:                }
                    104:                else if (sp->otccbLink != 0) {
                    105:                        do {
                    106:                                if ((sp->remoteAddress.a.node == p->src_node)
                    107:                                        && (sp->remoteAddress.a.socket == p->src_socket)
                    108:                                && (sp->remoteAddress.a.net == NET_VALUE(p->src_net)))
                    109:                                        break;
                    110:                        } while ((sp = sp->otccbLink) != 0);
                    111:                        if (sp == 0)
                    112:                        {
                    113:                                ATENABLE(s, adspall_lock);
                    114:                                gbuf_freem(mp);
                    115:                                return;
                    116:                        }
                    117:                }
                    118:                if (sp->lockFlag) {
                    119:                        gbuf_next(mp) = 0;
                    120:                        if (sp->deferred_mb) {
                    121:                                for (mb=sp->deferred_mb; gbuf_next(mb); mb=gbuf_next(mb)) ; 
                    122:                                gbuf_next(mb) = mp;
                    123:                        } else
                    124:                                sp->deferred_mb = mp;
                    125:                        ATENABLE(s, adspall_lock);
                    126:                        return;
                    127:                }
                    128:                ATDISABLE(l, sp->lockRemove);
                    129:                sp->lockFlag = 1;
                    130:                ATENABLE(l, adspall_lock);
                    131:                while (mp) {
                    132:                        adsp_rput(sp->gref, mp);
                    133:                        if ((mp = sp->deferred_mb) != 0) {
                    134:                                sp->deferred_mb = gbuf_next(mp);
                    135:                                gbuf_next(mp) = 0;
                    136:                        }
                    137:                }
                    138:                sp->lockFlag = 0;
                    139:                ATENABLE(s, sp->lockRemove);
                    140:                return;
                    141: 
                    142:        case MSG_IOCACK:
                    143:        case MSG_IOCNAK:
                    144:                gref = (gref_t *)((ioc_t *)gbuf_rptr(mp))->ioc_private;
                    145:                break;
                    146: 
                    147:        case MSG_IOCTL:
                    148: #ifdef APPLETALK_DEBUG
                    149:                kprintf("unexpected MSG_IOCTL in adsp_input()");
                    150: #endif
                    151:                /* fall through */
                    152: 
                    153:        default:
                    154:                gbuf_freem(mp);
                    155:                return;
                    156:        }
                    157: 
                    158:        adsp_rput(gref, mp);
                    159: }
                    160: 
                    161: /**********/
                    162: int adsp_readable(gref)
                    163:        gref_t *gref;
                    164: {
                    165:        int rc;
                    166:        CCBPtr sp;
                    167: 
                    168:        sp = (CCBPtr)gbuf_rptr(((gbuf_t *)gref->info));
                    169:        rc = sp->rData;
                    170: 
                    171:        return rc;
                    172: }
                    173: 
                    174: int adsp_writeable(gref)
                    175:        gref_t *gref;
                    176: {
                    177:        int s, rc;
                    178:        CCBPtr sp;
                    179: 
                    180:        sp = (CCBPtr)gbuf_rptr(((gbuf_t *)gref->info));
                    181:        ATDISABLE(s, sp->lock);
                    182:        rc = CalcSendQFree(sp);
                    183:        ATENABLE(s, sp->lock);
                    184: 
                    185:        return rc;
                    186: }
                    187: 
                    188: static void adsp_init()
                    189: {
                    190:        adspInited++;
                    191:        InitGlobals();
                    192:        ccb_used_list = 0;
                    193:        bzero(adsp_pidM, sizeof(adsp_pidM));
                    194:        bzero(adsp_inputC, sizeof(adsp_inputC));
                    195:        bzero(adsp_inputQ, sizeof(adsp_inputQ));
                    196: }
                    197: 
                    198: /*
                    199:  * Description:
                    200:  *     ADSP open and close routines.  These routines
                    201:  *     initalize and release the ADSP structures.  They do not
                    202:  *     have anything to do with "connections"
                    203:  */
                    204: 
                    205: int adsp_open(gref)
                    206:        gref_t *gref;
                    207: {
                    208:     register CCBPtr sp;
                    209:     int s;
                    210:     
                    211:     if (!adspInited)
                    212:                adsp_init();
                    213: 
                    214:     if (!adspAllocateCCB(gref))
                    215:        return(ENOBUFS);        /* can't get buffers */
                    216:  
                    217:        sp = (CCBPtr)gbuf_rptr(((gbuf_t *)gref->info));
                    218:        gref->readable = adsp_readable;
                    219:        gref->writeable = adsp_writeable;
                    220:        ATDISABLE(s, adspall_lock);
                    221:        if ((sp->otccbLink = ccb_used_list) != 0)
                    222:                sp->otccbLink->ccbLink = sp;
                    223:        ccb_used_list = sp;
                    224:        ATENABLE(s, adspall_lock);
                    225:        return 0;
                    226: }
                    227: 
                    228: int adsp_close(gref)
                    229:        gref_t *gref;
                    230: {
                    231:   int s, l;
                    232:   unsigned char localSocket;
                    233: 
                    234:   /* make sure we've not yet removed the CCB (e.g., due to TrashSession) */
                    235:   ATDISABLE(l, adspgen_lock);
                    236:   if (gref->info) {
                    237:        CCBPtr sp = (CCBPtr)gbuf_rptr(((gbuf_t *)gref->info));
                    238:        ATDISABLE(s, sp->lock);
                    239:        ATENABLE(s, adspgen_lock);
                    240:        localSocket = sp->localSocket;
                    241:        ATENABLE(l, sp->lock);
                    242:        if (localSocket)
                    243:                adspRelease(gref);
                    244:        else
                    245:        {
                    246:                adsp_dequeue_ccb(sp);
                    247:                gbuf_freeb((gbuf_t *)gref->info);
                    248:        }
                    249:   } else
                    250:        ATENABLE(l, adspgen_lock);
                    251:     return 0;
                    252: }
                    253: 
                    254: 
                    255: /*
                    256:  * Name:
                    257:  *     adsp_rput
                    258:  *
                    259:  * Description:
                    260:  *     ADSP streams read put and service routines.
                    261:  */
                    262: 
                    263: void adsp_rput(gref, mp)
                    264:     gref_t *gref;                      /* READ queue */
                    265:     gbuf_t *mp;
                    266: {
                    267:   switch (gbuf_type(mp)) {
                    268:   case MSG_HANGUP:
                    269:   case MSG_IOCACK:
                    270:   case MSG_IOCNAK:
                    271:        switch (adspReadHandler(gref, mp)) {
                    272:        case STR_PUTNEXT:       
                    273:            atalk_putnext(gref, mp); 
                    274:            break;
                    275:        case STR_IGNORE:
                    276:            break;
                    277:         }
                    278:        break;
                    279:   case MSG_ERROR:
                    280: #ifdef APPLETALK_DEBUG
                    281:        kprintf("adsp_rput received MSG_ERROR");
                    282: #endif
                    283:        /* fall through */
                    284:   default:
                    285:        CheckReadQueue(gbuf_rptr(((gbuf_t *)gref->info)));
                    286:        CheckSend(gbuf_rptr(((gbuf_t *)gref->info)));
                    287: 
                    288:        switch (gbuf_type(mp)) {
                    289:        case MSG_IOCTL:
                    290:        case MSG_DATA:
                    291:        case MSG_PROTO:
                    292:            if (adspReadHandler(gref, mp) == STR_PUTNEXT)
                    293:                atalk_putnext(gref, mp);
                    294:            break;
                    295:        default:
                    296:            atalk_putnext(gref, mp);
                    297:            break;
                    298:        }
                    299:   }
                    300: }
                    301: 
                    302: /*
                    303:  * Name:
                    304:  *     adsp_wput
                    305:  *
                    306:  * Description:
                    307:  *     ADSP streams write put and service routines.
                    308:  *
                    309:  */
                    310: 
                    311: int adsp_wput(gref, mp)
                    312:     gref_t *gref;                      /* WRITE queue */
                    313:     gbuf_t *mp;
                    314: {
                    315:        int rc;
                    316:        int s;
                    317:        gbuf_t *xm;
                    318:        ioc_t *iocbp;
                    319:        CCBPtr sp = (CCBPtr)gbuf_rptr(((gbuf_t *)gref->info));
                    320: 
                    321:        if (gbuf_type(mp) == MSG_IOCTL) {
                    322:                iocbp = (ioc_t *)gbuf_rptr(mp);
                    323:                switch (iocbp->ioc_cmd) {
                    324:                case ADSPBINDREQ: 
                    325:                        {
                    326:                        unsigned char v;
                    327: 
                    328:                        if (gbuf_cont(mp) == NULL) {
                    329:                                iocbp->ioc_rval = -1;
                    330:                                adsp_iocnak(gref, mp, EINVAL);
                    331:                        }
                    332:                        v = *(unsigned char *)gbuf_rptr(gbuf_cont(mp));
                    333:                        ATDISABLE(s, adspall_lock);
                    334:                        if ( (v != 0)
                    335:                             && ((v > DDP_SOCKET_LAST) || (v < 2)
                    336:                                 || (adsp_inputQ[v] != 0) 
                    337:                                 || (ot_adsp_socketM[v] != 0)) ) {
                    338:                                ATENABLE(s, adspall_lock);
                    339:                                iocbp->ioc_rval = -1;
                    340:                                adsp_iocnak(gref, mp, EINVAL);
                    341:                        }
                    342:                        else {
                    343:                                if (v == 0) {
                    344:                                        ATENABLE(s, adspall_lock);
                    345:                                        if ((v = adspAssignSocket(gref, 0)) == 0) {
                    346:                                                iocbp->ioc_rval = -1;
                    347:                                                adsp_iocnak(gref, mp, EINVAL);
                    348:                                                return 0;
                    349:                                        }
                    350:                                } else {
                    351:                                        adsp_inputC[v] = 1;
                    352:                                        adsp_inputQ[v] = sp;
                    353:                                        adsp_pidM[v] = sp->pid;
                    354:                                        ATENABLE(s, adspall_lock);
                    355:                                        adsp_dequeue_ccb(sp);
                    356:                                }
                    357:                                *(unsigned char *)gbuf_rptr(gbuf_cont(mp)) = v;
                    358:                                sp->localSocket = v;
                    359:                                iocbp->ioc_rval = 0;
                    360:                                adsp_iocack(gref, mp);
                    361:                        }
                    362:                        return 0;
                    363:                        }
                    364: 
                    365:                case ADSPGETSOCK:
                    366:                case ADSPGETPEER:
                    367:                        {
                    368:                        at_inet_t *addr;
                    369: 
                    370:                        if (((xm = gbuf_cont(mp)) == NULL)
                    371:                            && ((xm = gbuf_alloc(sizeof(at_inet_t), PRI_MED)) == NULL)) {
                    372:                                iocbp->ioc_rval = -1;
                    373:                                adsp_iocnak(gref, mp, ENOBUFS);
                    374:                                return 0;
                    375:                        }
                    376:                        gbuf_cont(mp) = xm;
                    377:                        gbuf_wset(xm,sizeof(at_inet_t));
                    378:                        addr = (at_inet_t *)gbuf_rptr(xm);
                    379:                        if (iocbp->ioc_cmd == ADSPGETSOCK) {
                    380:                                /* Obtain Network and Node Id's from DDP */
                    381:                                /* *** was ddp_get_cfg() *** */
                    382:                                addr->net = ifID_home->ifThisNode.s_net;
                    383:                                addr->node = ifID_home->ifThisNode.s_node;
                    384:                                addr->socket = (sp)? sp->localSocket: 0;
                    385:                        } else
                    386:                                if (sp)
                    387:                                        *addr = sp->remoteAddress.a;
                    388:                                else {
                    389:                                        addr->net = 0;
                    390:                                        addr->node = 0;
                    391:                                        addr->socket = 0;
                    392:                                }
                    393:                        iocbp->ioc_rval = 0;
                    394:                        adsp_iocack(gref, mp);
                    395:                        return 0;
                    396:                        }
                    397:                case DDP_IOC_GET_CFG:
                    398:                        /* respond to an DDP_IOC_GET_CFG sent on an adsp fd */
                    399:                        if (((xm = gbuf_cont(mp)) == NULL) &&
                    400:                            (xm = gbuf_alloc(sizeof(at_inet_t), PRI_MED)) == NULL) {
                    401:                            iocbp->ioc_rval = -1;
                    402:                            adsp_iocnak(gref, mp, ENOBUFS);
                    403:                            return 0;
                    404:                        }
                    405:                        gbuf_cont(mp) = xm;
                    406:                        gbuf_wset(xm, sizeof(ddp_addr_t));
                    407:                        /* Obtain Network and Node Id's from DDP */
                    408:                        {
                    409:                        /* *** was ddp_get_cfg() *** */
                    410:                          ddp_addr_t *cfgp = 
                    411:                            (ddp_addr_t *)gbuf_rptr(gbuf_cont(mp));
                    412:                          cfgp->inet.net = ifID_home->ifThisNode.s_net;
                    413:                          cfgp->inet.node = ifID_home->ifThisNode.s_node;
                    414:                          cfgp->inet.socket = (sp)? sp->localSocket: 0;
                    415:                          cfgp->ddptype = DDP_ADSP;
                    416:                        }
                    417:                        iocbp->ioc_rval = 0;
                    418:                        adsp_iocack(gref, mp);
                    419:                        return 0;
                    420:                } /* switch */
                    421:        }
                    422: 
                    423:        if (!gref->info)
                    424:            gbuf_freem(mp);
                    425:        else {
                    426:            ATDISABLE(s, sp->lockClose);
                    427:            rc = adspWriteHandler(gref, mp);
                    428:            ATENABLE(s, sp->lockClose);
                    429: 
                    430:            switch (rc) {
                    431:            case STR_PUTNEXT:
                    432:                if (gbuf_type(mp) == MSG_IOCTL) {
                    433:                    iocbp = (ioc_t *)gbuf_rptr(mp);
                    434:                    iocbp->ioc_private = (void *)gref;
                    435:                }
                    436:                DDP_OUTPUT(mp);
                    437:                break;
                    438:            case STR_IGNORE:
                    439:            case STR_IGNORE+99:
                    440:                break;
                    441:            default:
                    442:                gbuf_freem(mp);
                    443:                break;
                    444:            }
                    445:        }
                    446: 
                    447:        return 0;
                    448: } /* adsp_wput */
                    449: 
                    450: void adspioc_ack(errno, m, gref)
                    451:     int errno;
                    452:     gbuf_t *m;
                    453:     gref_t *gref;
                    454: {
                    455:     ioc_t *iocbp;
                    456: 
                    457:     if (m == NULL)
                    458:        return;
                    459:     iocbp = (ioc_t *) gbuf_rptr(m);
                    460: 
                    461:     iocbp->ioc_error = errno;  /* set the errno */
                    462:     iocbp->ioc_count = gbuf_msgsize(gbuf_cont(m));
                    463:     if (gbuf_type(m) == MSG_IOCTL)     /* if an ioctl, this is an ack */
                    464:        gbuf_set_type(m, MSG_IOCACK);   /* and ALWAYS update the user */
                    465:                                        /* ioctl structure */
                    466:     trace_mbufs(D_M_ADSP,"A ", m);
                    467:     SndMsgUp(gref, m);
                    468: }
                    469: 
                    470: static void adsp_iocack(gref, m)
                    471:      gref_t *gref;
                    472:      register gbuf_t *m;
                    473: {
                    474:        if (gbuf_type(m) == MSG_IOCTL)
                    475:                gbuf_set_type(m, MSG_IOCACK);
                    476: 
                    477:        if (gbuf_cont(m))
                    478:                ((ioc_t *)gbuf_rptr(m))->ioc_count = gbuf_msgsize(gbuf_cont(m));
                    479:        else
                    480:                ((ioc_t *)gbuf_rptr(m))->ioc_count = 0;
                    481: 
                    482:        SndMsgUp(gref, m);
                    483: }
                    484: 
                    485: 
                    486: static void adsp_iocnak(gref, m, err)
                    487:      gref_t *gref;
                    488:      register gbuf_t *m;
                    489:      register int err;
                    490: {
                    491:        if (gbuf_type(m) == MSG_IOCTL)
                    492:                gbuf_set_type(m, MSG_IOCNAK);
                    493:        ((ioc_t *)gbuf_rptr(m))->ioc_count = 0;
                    494: 
                    495:        if (err == 0)
                    496:                err = ENXIO;
                    497:        ((ioc_t *)gbuf_rptr(m))->ioc_error = err;
                    498: 
                    499:        if (gbuf_cont(m)) {
                    500:                gbuf_freem(gbuf_cont(m));
                    501:                gbuf_cont(m) = NULL;
                    502:        }
                    503:        SndMsgUp(gref, m);
                    504: }
                    505: 
                    506: unsigned char
                    507: adspAssignSocket(gref, flag)
                    508:        gref_t *gref;
                    509:        int flag;
                    510: {
                    511:        unsigned char sVal, sMax, sMin, sSav, inputC;
                    512:        CCBPtr sp;
                    513:        int s;
                    514: 
                    515:        sMax = flag ? DDP_SOCKET_LAST-46 : DDP_SOCKET_LAST-6;
                    516:        sMin = DDP_SOCKET_1st_DYNAMIC-64;
                    517: 
                    518:        ATDISABLE(s, adspall_lock);
                    519:        for (inputC=255, sVal=sMax; sVal >= sMin; sVal--) {
                    520:                if (!ot_adsp_socketM[sVal]) {
                    521:                        if (!adsp_inputQ[sVal])
                    522:                                break;
                    523:                        else if (flag) {
                    524:                                if ((adsp_inputC[sVal] < inputC)
                    525:                                                && (adsp_inputQ[sVal]->state == sOpen)) {
                    526:                                        inputC = adsp_inputC[sVal];
                    527:                                        sSav = sVal;
                    528:                                }
                    529:                        }
                    530:                }
                    531:        }
                    532: 
                    533:        if (sVal < sMin) {
                    534:                if (!flag || (inputC == 255)) {
                    535:                        ATENABLE(s, adspall_lock);
                    536:                        return 0;
                    537:                }
                    538:                sVal = sSav;
                    539:        }
                    540:        sp = (CCBPtr)gbuf_rptr(((gbuf_t *)gref->info));
                    541:        ATENABLE(s, adspall_lock);
                    542:        adsp_dequeue_ccb(sp);
                    543:        ATDISABLE(s, adspall_lock);
                    544:        adsp_inputC[sVal]++;
                    545:        sp->otccbLink = adsp_inputQ[sVal];
                    546:        adsp_inputQ[sVal] = sp;
                    547:        if (!flag)
                    548:                adsp_pidM[sVal] = sp->pid;
                    549:        ATENABLE(s, adspall_lock);
                    550:        return sVal;
                    551: }
                    552: 
                    553: int
                    554: adspDeassignSocket(sp)
                    555:        CCBPtr sp;
                    556: {
                    557:        unsigned char sVal;
                    558:        CCBPtr curr_sp;
                    559:        CCBPtr prev_sp;
                    560:        int pid = 0;
                    561:        int s, l;
                    562: 
                    563:        dPrintf(D_M_ADSP, D_L_TRACE, ("adspDeassignSocket: pid=%d,s=%d\n",
                    564:                sp->pid, sp->localSocket));
                    565:        ATDISABLE(s, adspall_lock);
                    566:        sVal = sp->localSocket;
                    567:        if ((curr_sp = adsp_inputQ[sVal]) != 0) {
                    568:                prev_sp = 0;
                    569:                while (curr_sp != sp) {
                    570:                        prev_sp = curr_sp;
                    571:                        curr_sp = curr_sp->otccbLink;
                    572:                }
                    573:                if (curr_sp) {
                    574:                        ATDISABLE(l, sp->lockRemove);
                    575:                        if (prev_sp)
                    576:                                prev_sp->otccbLink = sp->otccbLink;
                    577:                        else
                    578:                                adsp_inputQ[sVal] = sp->otccbLink;
                    579:                        ATENABLE(l, sp->lockRemove);
                    580:                        if (adsp_inputQ[sVal])
                    581:                                adsp_inputC[sVal]--;
                    582:                        else {
                    583:                                pid = adsp_pidM[sVal];
                    584:                                adsp_inputC[sVal] = 0;
                    585:                                adsp_pidM[sVal] = 0;
                    586:                        }
                    587:                        sp->ccbLink = 0;
                    588:                        sp->otccbLink = 0;
                    589:                        sp->localSocket = 0;
                    590:                        ATENABLE(s, adspall_lock);
                    591:                    return pid ? 0 : 1;
                    592:                }
                    593:        }
                    594:        ATENABLE(s, adspall_lock);
                    595: 
                    596:        dPrintf(D_M_ADSP, D_L_ERROR, 
                    597:                ("adspDeassignSocket: closing, no CCB block, trouble ahead\n"));
                    598:        return -1;
                    599: } /* adspDeassignSocket */
                    600: 
                    601: /*
                    602:  * remove CCB from the use list
                    603:  */
                    604: void
                    605: adsp_dequeue_ccb(sp)
                    606:        CCB *sp;
                    607: {
                    608:        int s;
                    609: 
                    610:        ATDISABLE(s, adspall_lock);
                    611:        if (sp == ccb_used_list) {
                    612:                if ((ccb_used_list = sp->otccbLink) != 0)
                    613:                        sp->otccbLink->ccbLink = 0;
                    614:        } else if (sp->ccbLink) {
                    615:                if ((sp->ccbLink->otccbLink = sp->otccbLink) != 0)
                    616:                        sp->otccbLink->ccbLink = sp->ccbLink;
                    617:        }
                    618: 
                    619:        sp->otccbLink = 0;
                    620:        sp->ccbLink = 0;
                    621:        ATENABLE(s, adspall_lock);
                    622: }
                    623: 
                    624: void SndMsgUp(gref, mp)
                    625:     gref_t *gref;                      /* WRITE queue */
                    626:        gbuf_t *mp;
                    627: {
                    628: /*
                    629:     dPrintf(D_M_ADSP, D_L_TRACE, 
                    630:          ("SndMsgUp: gref=0x%x, mbuf=0x%x\n",  (unsigned)gref, (unsigned)mp));
                    631:     trace_mbufs(D_M_ADSP, "        m", mp);
                    632: */
                    633:     atalk_putnext(gref, mp);
                    634: }

unix.superglobalmegacorp.com

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