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

unix.superglobalmegacorp.com

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