Annotation of 43BSD/ingres/source/support/ildr.c, revision 1.1.1.1

1.1       root        1: /*     
                      2:  *     ilwrite() : write driver
                      3:  *             1. copy Lock request info to lockbuf
                      4:  *             2. follow action in l_act
                      5:  *             3. Error return conditions
                      6:  *                     -1: lockrequest fails(only on act=1)
                      7:  *                     -2: attempt to release a lock not set
                      8:  *                         by calling program
                      9:  *                     -3: illegal action requested
                     10:  */
                     11: 
                     12: # include      <stdio.h>
                     13: # include      <sys/param.h>
                     14: # include      <sys/socket.h>
                     15: # include      <netinet/in.h>
                     16: # include      <sys/ioctl.h>
                     17: # include      <errno.h>
                     18: # include      <ildr.h>
                     19: # include      <sys/time.h>
                     20: # include      <netdb.h>
                     21: # include      <sccs.h>
                     22: 
                     23: # define       TRUE    1
                     24: # define       FALSE   0
                     25: 
                     26: # ifdef        DEBUG
                     27: static int ildebug = TRUE;
                     28: # endif        DEBUG
                     29: 
                     30: SCCSID(@(#)ildr.c      8.1     12/31/84)
                     31: 
                     32: int    From_server;            /* read connection from socket server */
                     33: long   Read_fmt;               /* bit mask for select */
                     34: char   *Prog_name;             /* program name for abnormal errors */
                     35: extern int     errno;          /* error number */
                     36: 
                     37: /*
                     38: ** main
                     39: ** initilize the socket to the socket server, and then sit and on
                     40: ** a select waiting for input.
                     41: */
                     42: main(ac,av)
                     43: int    ac;
                     44: char   **av;
                     45: {
                     46:        long            read_fd,                /* bit mask of useable descriptors*/
                     47:                        num_des;                /* number of readable descriptors */
                     48:        int             abnormal();             /* error function */
                     49:        register        int     i;              /* index */
                     50: 
                     51: 
                     52:        /*
                     53:        ** close all the files descriptors, so we can have more INGRES
                     54:        ** processes. We are lmited by file descriptors.
                     55:        */
                     56: # ifdef        DEBUG
                     57:        setbuf(stdout,NULL);
                     58:        printf("DRIVER: starting up\n");
                     59:        close(0);                               /* guarantee that 0 is what is attached to the socket server */
                     60:        for ( i = 3 ; i < NOFILE ; i++ )
                     61: # else
                     62:        for ( i = 0 ; i < NOFILE ; i++ )
                     63: # endif        DEBUG
                     64:                close(i);
                     65: 
                     66:        /*
                     67:        ** set up all the signals. Catching any signal
                     68:        ** is an error. We do a "warm start" in this condition
                     69:        */
                     70:        for ( i = 0 ; i < NSIG ; i++ )
                     71:                signal(i,abnormal);
                     72:        signal(SIGPIPE,SIG_IGN);        /* ignore this one, in case a process simply dies in mid stride */
                     73:        Prog_name = *av;
                     74:        /*
                     75:        ** if ac == 2, then we are restarted from the the lock driver
                     76:        ** itself, and we don't have to reattach ourselves to the magic
                     77:        ** ingres socket.
                     78:        */
                     79:        if ( ac == 2 )
                     80:                From_server = 0;
                     81:        else
                     82:                From_server = init_socket();
                     83:        Read_fmt = (1<<From_server);
                     84: 
                     85:        /*
                     86:        ** infinite loop waiting for something to happen
                     87:        */
                     88:        for ( ;; )
                     89:        {
                     90:                read_fd = Read_fmt;
                     91: 
                     92:                /*
                     93:                ** wake up whenever something happens
                     94:                */
                     95:                while ( (num_des = select(NOFILE,&read_fd,0,0,0)) == 0 )
                     96:                {
                     97: # ifdef        DEBUG
                     98:                printf("select returns 0 (%o)\n",read_fd);
                     99: # endif        DEBUG
                    100:                        read_fd = Read_fmt;
                    101:                }
                    102: # ifdef        DEBUG
                    103:                printf("select returns %d (%o)\n",num_des,read_fd);
                    104: # endif        DEBUG
                    105:                if ( num_des == -1 )
                    106:                {
                    107: # ifdef        DEBUG
                    108:                        perror("DRIVER:num_des = -1");
                    109: # endif DEBUG
                    110:                        /*
                    111:                        ** a bit of defensive programming.
                    112:                        ** If there is an EBADF (bad file descriptor) error 
                    113:                        ** then we assume that a file descriptor has shut down,
                    114:                        ** with out tellng us. We go to a function to figure
                    115:                        ** out what has died.
                    116:                        */
                    117:                        if ( errno == EBADF )
                    118:                                close_up(Read_fmt);
                    119:                        sleep(1);
                    120:                        continue;
                    121:                }
                    122:                if ( (read_fd & (1<<From_server)) )
                    123:                {
                    124:                        num_des--;
                    125:                        new_proc();
                    126:                        read_fd &= ~(1<<From_server);
                    127:                }
                    128:                if ( num_des > 0 )
                    129:                {
                    130:                        for ( i = 0 ; i < NOFILE ; i++ )
                    131:                                if ( (read_fd & (1<<i)) )
                    132:                                        ilwrite(i);
                    133:                }
                    134:        }
                    135: }/* main */
                    136: 
                    137: /*
                    138: ** new_proc
                    139: ** start up a new connection to an Ingres process
                    140: */
                    141: new_proc()
                    142: {
                    143:        register        int     fd;
                    144:        auto            int     to_ioctl = 1;
                    145:        struct  sockaddr_in     addr;
                    146:        auto            int     len;
                    147: 
                    148:        len = sizeof (addr);
                    149:        if ( (fd = accept(From_server,&addr,&len)) != -1 )
                    150:        {
                    151:                Read_fmt |= (1<<fd);
                    152:                ioctl(fd,FIONBIO,&to_ioctl);
                    153:        }
                    154: # ifdef        DEBUG
                    155:        else
                    156:        {
                    157:                perror("accept");
                    158:                sleep(1);
                    159:        }
                    160:        printf("DRIVER: new file %d (%o)\n",fd,(1<<fd));
                    161: # endif        DEBUG
                    162: }/* new_proc */
                    163: 
                    164: 
                    165: 
                    166: ilwrite(read_desc)
                    167: register       int     read_desc;
                    168: {
                    169:        struct Lockreq  lockbuf;
                    170:        register int i;
                    171:        register int blockflag;
                    172:        extern  int     errno;
                    173: 
                    174:        errno = 0;
                    175: # ifdef        DEBUG
                    176:        printf("DRIVER: entering ilwrite, read_desc = %d\n",read_desc);
                    177: # endif        DEBUG
                    178:        if ( read(read_desc,&lockbuf, sizeof ( lockbuf)) != sizeof ( lockbuf ) )
                    179:        {
                    180: # ifdef        DEBUG
                    181:                printf("Read error, errno = %d\n",errno);
                    182: # endif        DEBUG
                    183:                if ( errno == EWOULDBLOCK )
                    184:                        return;
                    185:                if ( errno == ECONNRESET )
                    186:                {
                    187:                        ilrma(read_desc,TRUE);
                    188:                        close(read_desc);
                    189:                        Read_fmt &= ~(1<<read_desc);
                    190:                        return;
                    191:                }
                    192:                send_info(read_desc,-5);
                    193:                return;
                    194:        }
                    195: 
                    196: # ifdef        DEBUG
                    197:        if (ildebug)
                    198:                printf("ildr: act %d, type %d, mode %d, read_desc %d\n",
                    199:                        lockbuf.lr_act, lockbuf.lr_type, lockbuf.lr_mod, read_desc);
                    200: # endif        DEBUG
                    201:        if (( lockbuf.lr_act < A_RLS1)
                    202:        && ((lockbuf.lr_type < T_CS) || (lockbuf.lr_type > T_DB )
                    203:           || (lockbuf.lr_mod < M_EXCL) || (lockbuf.lr_mod > M_SHARE )))
                    204:        {
                    205: # ifdef        DEBUG
                    206:                printf("Illegal request\n");
                    207: # endif        DEBUG
                    208:                send_info(read_desc,-5);
                    209:                return;
                    210:        }
                    211: /*
                    212:  *             follow action from lock request
                    213:  */
                    214:        switch(lockbuf.lr_act)
                    215:        {
                    216:          case A_RTN:
                    217: # ifdef        DEBUG
                    218:                if ( ildebug )
                    219:                        printf("Driver: A_RTN\n");
                    220: # endif        DEBUG
                    221: 
                    222:                /*
                    223:                ** attempt to set lock.
                    224:                ** error return if failure.
                    225:                */
                    226:                for ( i = 0; i <= lockbuf.lr_type; i++) 
                    227:                {
                    228:                        if (Lockset[i] == 0) 
                    229:                        {
                    230: # ifdef        DEBUG
                    231:                                if (ildebug)
                    232:                                        printf("ildr: lock %d not available\n", i);
                    233: # endif        DEBUG
                    234:                                send_info(read_desc,-1);
                    235:                                return;
                    236:                        }
                    237:                }
                    238:                if (ilunique(&lockbuf) >= 0) 
                    239:                {
                    240:                        send_info(read_desc,-1);
                    241:                        return;
                    242:                }
                    243: # ifdef        DEBUG
                    244:                if ( ildebug )
                    245:                        printf("Driver: lock assigned\n");
                    246: # endif        DEBUG
                    247:                ilenter(&lockbuf,read_desc);
                    248:                break;
                    249: 
                    250:          case A_SLP:
                    251: # ifdef        DEBUG
                    252:                if ( ildebug )
                    253:                        printf("Driver: A_SLP\n");
                    254: # endif        DEBUG
                    255:                if ( set_lock(read_desc,lockbuf) == -1 )
                    256:                        return;
                    257: # ifdef        DEBUG
                    258:                if ( ildebug )
                    259:                        printf("Driver: got lock\n");
                    260: # endif        DEBUG
                    261:                break;
                    262:          case A_RLS1:
                    263:                                /* remove 1 lock */
                    264: # ifdef        DEBUG
                    265:                if ( ildebug )
                    266:                        printf("Driver: A_RLS1\n");
                    267: # endif        DEBUG
                    268:                if ((i = ilfind(&lockbuf,read_desc)) >= 0)
                    269:                {
                    270:                        ilrm(i,read_desc);
                    271:                }
                    272:                else
                    273:                {
                    274:                        send_info(read_desc,-2);
                    275:                        return;
                    276:                }
                    277: # ifdef        DEBUG
                    278:                if ( ildebug )
                    279:                        printf("Driver: released\n");
                    280: # endif        DEBUG
                    281:                break;
                    282: 
                    283:          case A_RLSA:
                    284:                                /* remove all locks for this process id*/
                    285: # ifdef        DEBUG
                    286:                if ( ildebug )
                    287:                        printf("Driver: A_RLSA\n");
                    288: # endif        DEBUG
                    289:                ilrma(read_desc,FALSE);
                    290:                break;
                    291: 
                    292:          case A_ABT:           /* remove all locks */
                    293: # ifdef        DEBUG
                    294:                if ( ildebug )
                    295:                        printf("Driver: A_ABT\n");
                    296: # endif        DEBUG
                    297:                ilclose();
                    298:                break;
                    299: 
                    300:          default :
                    301: # ifdef        DEBUG
                    302:                if ( ildebug )
                    303:                        printf("DRIVER: garbage\n");
                    304: # endif        DEBUG
                    305:                send_info(read_desc,-3);
                    306:        }
                    307:        send_info(read_desc,0);
                    308: }
                    309: /*
                    310:  *     ilunique- check for match on key
                    311:  *     
                    312:  *     return index of Locktab if match found
                    313:  *     else return -1
                    314:  */
                    315: static
                    316: ilunique(ll)
                    317: register struct Lockreq *ll;
                    318: {
                    319:        register int    k;
                    320:        register struct Lockform        *p;
                    321:        register struct Lockreq *q;
                    322: 
                    323:        for (k = 0; k < NLOCKS; k++)
                    324:        {
                    325:                p = &Locktab[k];
                    326:                if ((p->l_mod != M_EMTY)
                    327:                && (ilcomp(p->l_key,ll->lr_key) == 0)
                    328:                && (p->l_type == ll->lr_type)
                    329:                && ( (p->l_mod == M_EXCL) || (ll->lr_mod == M_EXCL)) ) {
                    330: # ifdef        DEBUG
                    331:                        if (ildebug) {
                    332:                                register int i;
                    333: 
                    334:                                printf("ildr: lock ");
                    335:                                for (i = 0; i < KEYSIZE; i++)
                    336:                                        printf("%c", ll->lr_key[i]);
                    337:                                printf(" busy\n");
                    338:                        }
                    339: # endif        DEBUG
                    340:                        return(k);
                    341:                }
                    342:        }
                    343:        return(-1);
                    344: }
                    345: 
                    346: static
                    347: ilfind(ll,key)
                    348: register struct Lockreq *ll;
                    349: int    key;
                    350: {
                    351:        register int    k;
                    352:        register struct Lockform        *p;
                    353:        register struct Lockreq *q;
                    354: 
                    355:        for (k = 0; k < NLOCKS; k++)
                    356:        {
                    357:                p = &Locktab[k];
                    358:                if ((p->l_mod != M_EMTY)
                    359:                && (ilcomp(p->l_key,ll->lr_key) == 0)
                    360:                && (p->l_type == ll->lr_type)
                    361:                && (p->l_pid == key))
                    362:                        return(k);
                    363:        }
                    364:        return(-1);
                    365: }/* ilfind */
                    366: 
                    367: /*
                    368:  *     remove the lth Lock
                    369:  *             if the correct user is requesting the move.
                    370:  */
                    371: static
                    372: ilrm(l,key,remove_all)
                    373: int l;
                    374: int    key;
                    375: int    remove_all;
                    376: {
                    377:        register struct Lockform *a;
                    378:        register        k;
                    379: 
                    380: 
                    381:        a = &Locktab[l];
                    382:        if (a->l_pid == key && a->l_mod != M_EMTY)
                    383:        {
                    384:                if ( !remove_all && a->l_type == T_DB )
                    385:                        return;
                    386:                a->l_mod = M_EMTY;
                    387:                a->l_pid = 0;
                    388:                if (a->l_wflag == W_ON)
                    389:                {
                    390:                        a->l_wflag = W_OFF;
                    391:                        wakeup(&Locktab[l]);
                    392:                }
                    393:                for (k = 0; k <= a->l_type; k++)
                    394:                {
                    395:                        Lockset[k]++;
                    396:                        if (Lockset[k] == 1)
                    397:                                wakeup(&Lockset[k]);
                    398:                }
                    399:        }
                    400: }/* ilrm */
                    401: 
                    402: /*
                    403:  *     ilrma releases all locks for a given process id(pd)
                    404:  *     -- called from sys1.c$exit() code.
                    405:  */
                    406: ilrma(key,remove_all)
                    407: int key;
                    408: int    remove_all;
                    409: {
                    410:        register int    i;
                    411: 
                    412: # ifdef        DEBUG
                    413:        printf("DRVIER: Removing all, key = %d\n",key);
                    414: # endif        DEBUG
                    415:        for ( i = 0; i < NLOCKS; i++ )
                    416:                ilrm(i,key,remove_all);
                    417: }
                    418: 
                    419: /*
                    420:  *     enter Lockbuf in locktable
                    421:  *     return position in Locktable
                    422:  *     error return of -1
                    423:  */
                    424: static
                    425: ilenter(ll,key)
                    426: register struct Lockreq *ll;
                    427: int key;
                    428: {
                    429:        int     k,l;
                    430:        register char   *f,*t;
                    431:        register struct Lockform        *p;
                    432: 
                    433:        for (k = 0; k < NLOCKS; k++)
                    434:        {
                    435:                p = &Locktab[k];
                    436:                if (p->l_mod == M_EMTY)
                    437:                {
                    438:                        p->l_pid = key;
                    439:                        p->l_type = ll->lr_type;
                    440:                        Locktab[k].l_mod = p->l_mod = ll->lr_mod;
                    441:                        f = ll->lr_key;
                    442:                        t = p->l_key;
                    443:                        for (l = 0; l < KEYSIZE; l++)
                    444:                                *t++ = *f++;
                    445:                        for (l = 0; l <= ll->lr_type; l++)
                    446:                                Lockset[l]--;
                    447: # ifdef        DEBUG
                    448:                        if ( ildebug )
                    449:                                printf("DRIVER: ilenter %d, mod %d, omod = %d\n",k,p->l_mod,Locktab[k].l_mod);
                    450: # endif        DEBUG
                    451:                        return(k);
                    452:                }
                    453:        }
                    454: # ifdef        DEBUG
                    455:        if ( ildebug )
                    456:                printf("DRIVER: ilenter -1\n");
                    457: # endif        DEBUG
                    458:        return (-1);
                    459: }
                    460: 
                    461: /*
                    462:  *     ilcomp- string compare
                    463:  *             returns 0 if strings match
                    464:  *             returns -1 otherwise
                    465:  */
                    466: static
                    467: ilcomp(s1,s2)
                    468: register char *s1,*s2;
                    469: {
                    470:        register int    k;
                    471: 
                    472:        for (k = 0; k < KEYSIZE; k++)
                    473:                if ( *s1++ != *s2++)
                    474: # ifdef        DEBUG
                    475:                {
                    476:                        if ( ildebug )
                    477:                                printf("DRIVER: ilcomp returning -1\n");
                    478:                        return ( -1 );
                    479:                }
                    480: # else DEBUG
                    481:                        return (-1);
                    482: # endif        DEBUG
                    483:        return (0);
                    484: }
                    485: 
                    486: /*
                    487:  *     ilclose- releases all locks
                    488:  */
                    489: static
                    490: ilclose()
                    491: {
                    492:        register int    k;
                    493:        register caddr_t c;
                    494: # ifdef        DEBUG
                    495:        printf("DRIVER: entered close\n");
                    496: # endif        DEBUG
                    497: 
                    498:        for (k = 0; k < NLOCKS; k++)
                    499:                wakeup( &Locktab[k] );
                    500:        for (k = 0; k < 4; k++)
                    501:                wakeup( &Lockset[k]);
                    502:        for (c = (caddr_t)&Locktab[0].l_pid; c < (caddr_t)&Locktab[NLOCKS];)
                    503:                *c++ = 0;
                    504:        Lockset[0] = NLOCKS;
                    505:        Lockset[1] = PLOCKS;
                    506:        Lockset[2] = RLOCKS;
                    507:        Lockset[3] = DLOCKS;
                    508: }/* ilclose */
                    509: 
                    510: /*
                    511: ** set_lock
                    512: ** attempt to set a lock. If we can't, block the process and
                    513: ** return -1, if we can than set the lock and return 0.
                    514: */
                    515: set_lock(read_desc,lockbuf)
                    516: register       int     read_desc;
                    517: struct Lockreq lockbuf;
                    518: {
                    519:        register        int     blockflag;
                    520:        register        int     i;
                    521: 
                    522:        /*
                    523:        ** attempt to set lock.
                    524:        ** sleep on blocking address if failure.
                    525:        */
                    526: 
                    527:        do
                    528:        {
                    529:                do
                    530:                {
                    531:                        blockflag = TRUE;
                    532:                        for ( i = 0; i <= lockbuf.lr_type; i++)
                    533:                                if (Lockset[i] == 0)
                    534:                                {
                    535: # ifdef        DEBUG
                    536:                                        if (ildebug)
                    537:                                                printf("ildr: lock %d not available\n", i);
                    538: # endif        DEBUG
                    539:                                        wait_on(read_desc,&Lockset[i],lockbuf);
                    540:                                        return(-1);
                    541:                                }
                    542:                } while (!blockflag);
                    543: 
                    544:                if (( i = ilunique(&lockbuf)) >= 0 )
                    545:                {
                    546:                        blockflag = FALSE;
                    547:                        Locktab[i].l_wflag = W_ON;
                    548:                        wait_on(read_desc,&Locktab[i],lockbuf);
                    549:                        return(-1);
                    550:                }
                    551:        } while (!blockflag);
                    552:        ilenter(&lockbuf,read_desc);
                    553:        return ( 0 );
                    554: }/* set_lock */
                    555: 
                    556: /*
                    557: ** send_info
                    558: ** Send the data down the socket. Don't do it if it would cause the driver
                    559: ** to block.
                    560: */
                    561: send_info(fd,data)
                    562: register       int     fd;
                    563: int    data;
                    564: {
                    565:        auto    int     wdes = ( 1<<fd );
                    566:        struct  timeval time;
                    567: 
                    568:        errno = 0;
                    569:        time.tv_sec = 10;
                    570:        time.tv_usec = 0;
                    571: 
                    572:        if ( select(NOFILE,0,&wdes,0,&time) != 1 )
                    573:        {
                    574:                Read_fmt &= ~(1<<fd);
                    575:                ilrma(fd,TRUE);
                    576:                close(fd);
                    577:        }
                    578:        else
                    579:                if ( write(fd,&data,sizeof (int)) != sizeof (int) )
                    580:                {
                    581:                        if ( errno == 0 )
                    582:                                return;
                    583:                        Read_fmt &= ~(1<<fd);
                    584:                        ilrma(fd,TRUE);
                    585:                        close(fd);
                    586:                }
                    587: }/* send_info */
                    588: 
                    589: struct Wait {
                    590:        int     wait_fd;                /* file descriptor to send lock info to off of */
                    591:        int     wait_lock;              /* what lock we are waiting for */
                    592:        struct  Lockreq wait_req;       /* the lock request */
                    593:        struct  Wait    *next;
                    594: };
                    595: struct Wait    *Wait_queue = NULL;
                    596: 
                    597: /*
                    598: ** wait_on
                    599: ** Set up to wait for a free lock.
                    600: */
                    601: wait_on(fd,lock,req)
                    602: register       int     fd, lock;
                    603: struct         Lockreq req;
                    604: {
                    605:        register        struct  Wait    *ptr;
                    606:        char    *calloc();
                    607: 
                    608:        ptr = (struct Wait *)calloc(1,sizeof (struct Wait));
                    609:        ptr->wait_fd = fd;
                    610:        ptr->wait_lock = lock;
                    611:        ptr->wait_req = req;
                    612:        ptr->next = Wait_queue;
                    613:        Wait_queue = ptr;
                    614: }/* wait_on */
                    615: 
                    616: /*
                    617: ** wakeup
                    618: ** See if there is anythng waiting on the newly freed lock. If there is,
                    619: ** tell it it can have the lock now.
                    620: */
                    621: wakeup(lock)
                    622: register       int     lock;
                    623: {
                    624:        register        struct  Wait    *ptr,*back;
                    625: 
                    626:        for ( back = NULL, ptr = Wait_queue ; ptr != NULL ; back = ptr, ptr = ptr->next )
                    627:        {
                    628:                if ( ptr->wait_lock == lock )
                    629:                {
                    630:                        if ( set_lock(ptr->wait_fd,ptr->wait_req) == 0 )
                    631:                        {
                    632:                                send_info(ptr->wait_fd,0);
                    633:                                if ( back != NULL )
                    634:                                        back->next = ptr->next;
                    635:                                else
                    636:                                        Wait_queue = Wait_queue->next;
                    637:                                cfree(ptr);
                    638:                                return;
                    639:                        }
                    640:                }
                    641:        }
                    642: }/* wakeup */
                    643: 
                    644: /*
                    645: ** abnormal
                    646: ** a signal has come down and hit us. We restart the entire
                    647: ** program, and hope it goes away
                    648: */
                    649: abnormal(sig)
                    650: int    sig;
                    651: {
                    652:        extern  int     errno;
                    653: 
                    654: # ifdef        DEBUG
                    655:        printf("DRIVER: error %d, restarting\n",sig);
                    656: # endif
                    657: 
                    658:        execl("/etc/lock_driver","lock_driver","restart",0);
                    659:        execl(Prog_name,Prog_name,"restart",0);
                    660:        execlp("lock_driver","lock_driver","restart",0);
                    661:        exit(4);
                    662: }/* abnormal */
                    663: 
                    664: /*
                    665: ** close_up
                    666: ** try and find a closed up file descriptor.
                    667: */
                    668: close_up(fmt)
                    669: long   fmt;
                    670: {
                    671:        long    rdesc;
                    672:        register        int     i;
                    673:        struct  timeval time;
                    674: 
                    675:        errno = 0;
                    676:        time.tv_sec  = 0;
                    677:        time.tv_usec = 0;
                    678: 
                    679:        for ( i = 0 ; i < NOFILE ; i++ )
                    680:        {
                    681:                if ( (1<<i) & fmt )
                    682:                {
                    683:                        rdesc = (1<<i);
                    684:                        if ( select(NOFILE,&rdesc,0,0,&time) == -1 )
                    685:                        {
                    686:                                /*
                    687:                                ** the server socket has closed down.
                    688:                                ** BOY ARE WE IN TROUBLE
                    689:                                */
                    690:                                if ( i == From_server )
                    691:                                {
                    692:                                        sleep(1);
                    693: # ifdef        DEBUG
                    694:                                        printf("Restarting socket\n");
                    695: # endif        DEBUG
                    696:                                        init_socket();
                    697:                                }
                    698:                                if ( errno == EBADF )
                    699:                                {
                    700:                                        shutdown(i,2);
                    701:                                        close(i);
                    702:                                        Read_fmt &= ~(1<<i);
                    703:                                        ilrma(i,TRUE);
                    704:                                }
                    705:                        }
                    706:                }
                    707:        }
                    708: }/* close_up */

unix.superglobalmegacorp.com

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