Annotation of 43BSD/etc/named/ns_main.c, revision 1.1.1.1

1.1       root        1: #ifndef lint
                      2: static char sccsid[] = "@(#)ns_main.c  4.3 (Berkeley) 5/30/86";
                      3: #endif
                      4: 
                      5: /*
                      6:  * Copyright (c) 1986 Regents of the University of California
                      7:  *     All Rights Reserved
                      8:  */
                      9: 
                     10: /*
                     11:  * Internet Name server (see rfc883 & others).
                     12:  */
                     13: 
                     14: #include <sys/param.h>
                     15: #include <sys/file.h>
                     16: #include <sys/time.h>
                     17: #include <sys/wait.h>
                     18: #include <sys/resource.h>
                     19: #include <sys/ioctl.h>
                     20: #include <sys/socket.h>
                     21: #include <netinet/in.h>
                     22: #include <stdio.h>
                     23: #include <syslog.h>
                     24: #include <errno.h>
                     25: #include <signal.h>
                     26: #include <arpa/nameser.h>
                     27: #include <arpa/inet.h>
                     28: #include "ns.h"
                     29: #include "db.h"
                     30: 
                     31: #ifdef BOOTFILE                        /* default boot file */
                     32: char   *bootfile = BOOTFILE;
                     33: #else
                     34: char   *bootfile = "/etc/named.boot";
                     35: #endif
                     36: 
                     37: #ifdef DEBUGFILE                       /* default debug output file */
                     38: char   *debugfile = DEBUGFILE;
                     39: #else
                     40: char   *debugfile = "/usr/tmp/named.run";
                     41: #endif
                     42: 
                     43: #ifdef PIDFILE                                 /* file to store current named PID */
                     44: char   *PidFile = PIDFILE;
                     45: #else
                     46: char   *PidFile = "/etc/named.pid";    
                     47: #endif
                     48: 
                     49: #ifndef FD_SET
                     50: #define        NFDBITS         32
                     51: #define        FD_SETSIZE      32
                     52: #define        FD_SET(n, p)    ((p)->fds_bits[(n)/NFDBITS] |= (1 << ((n) % NFDBITS)))
                     53: #define        FD_CLR(n, p)    ((p)->fds_bits[(n)/NFDBITS] &= ~(1 << ((n) % NFDBITS)))
                     54: #define        FD_ISSET(n, p)  ((p)->fds_bits[(n)/NFDBITS] & (1 << ((n) % NFDBITS)))
                     55: #define FD_ZERO(p)     bzero((char *)(p), sizeof(*(p)))
                     56: #endif
                     57: 
                     58: FILE   *fp;                            /* file descriptor for pid file */
                     59: 
                     60: #ifdef DEBUG
                     61: FILE   *ddt;
                     62: #endif
                     63: 
                     64: int    debug = 0;                      /* debugging flag */
                     65: int    ds;                             /* datagram socket */
                     66: int    read_interrupted = 0;           /* flag for read timer */
                     67: int    needreload = 0;                 /* received SIGHUP, need to reload db */
                     68: int    needmaint = 0;                  /* need to call ns_maint()*/
                     69: int    rbufsize = 8 * 1024;            /* UDP recive buffer size */
                     70: 
                     71: struct qstream *streamq = QSTREAM_NULL; /* list of open streams */
                     72: struct sockaddr_in nsaddr;
                     73: struct timeval tt;
                     74: short  ns_port;
                     75: 
                     76: char           **Argv = NULL;          /* pointer to argument vector */
                     77: char           *LastArg = NULL;        /* end of argv */
                     78: 
                     79: extern char *malloc(), *realloc(), *calloc();
                     80: 
                     81: extern int errno;
                     82: 
                     83: 
                     84: 
                     85: main(argc, argv, envp)
                     86:        int argc;
                     87:        char *argv[], *envp[];
                     88: {
                     89:        register int n, udpcnt;
                     90:        register char *arg;
                     91:        register struct qstream *sp;
                     92:        int vs, len;
                     93:        int nfds;
                     94:        int on = 1;
                     95:        int rfd, size;
                     96:        u_long lasttime, maxctime;
                     97:        char buf[BUFSIZ];
                     98: 
                     99:        fd_set mask, tmpmask;
                    100: 
                    101:        struct timeval t, *tp;
                    102:        struct sockaddr_in from;
                    103:        struct qstream *candidate = QSTREAM_NULL;
                    104:        extern int onintr(), maint_alarm(), reapchild(), doadump(), onhup();
                    105:        extern int sigsetdebug(), signodebug(), sigprof();
                    106:        extern struct qstream *sqadd();
                    107:        extern char Version[];
                    108:        struct  sigvec sv;
                    109: 
                    110:        ns_port = htons(NAMESERVER_PORT);
                    111: 
                    112:        /*
                    113:        **  Save start and extent of argv for setproctitle.
                    114:        */
                    115: 
                    116:        Argv = argv;
                    117:        if (envp == 0 || *envp == 0)
                    118:                envp = argv;
                    119:        while (*envp)
                    120:                envp++;
                    121:        LastArg = envp[-1] + strlen(envp[-1]);
                    122: 
                    123:        while (--argc > 0) {
                    124:                arg = *++argv;
                    125:                if (*arg == '-') {
                    126:                        while (*++arg)
                    127:                                switch (*arg) {
                    128:                                case 'b':
                    129:                                        if (--argc <= 0)
                    130:                                                usage();
                    131:                                        bootfile = *++argv;
                    132:                                        break;
                    133: 
                    134:                                case 'd':
                    135:                                        ++argv;
                    136: 
                    137:                                        if (*argv != 0) {
                    138:                                            if (**argv == '-') {
                    139:                                                argv--;
                    140:                                                break;
                    141:                                            }
                    142:                                            debug = atoi(*argv);
                    143:                                            --argc;
                    144:                                        }
                    145:                                        if (debug <= 0)
                    146:                                                debug = 1;
                    147:                                        setdebug(1);
                    148:                                        break;
                    149: 
                    150:                                case 'p':
                    151:                                        if (--argc <= 0)
                    152:                                                usage();
                    153:                                        ns_port = htons((u_short)atoi(*++argv));
                    154:                                        break;
                    155: 
                    156:                                default:
                    157:                                        usage();
                    158:                                }
                    159:                } else
                    160:                        bootfile = *argv;
                    161:        }
                    162: 
                    163:        if (!debug) {
                    164:                if (fork())
                    165:                        exit(0);
                    166:                for (n = getdtablesize() - 1; n >= 0; n--)
                    167:                        (void) close(n);
                    168:                (void) open("/dev/null", O_RDONLY);
                    169:                (void) dup2(0, 1);
                    170:                (void) dup2(0, 2);
                    171:                n = open("/dev/tty", O_RDWR);
                    172:                if (n > 0) {
                    173:                        (void) ioctl(n, TIOCNOTTY, (char *)NULL);
                    174:                        (void) close(n);
                    175:                }
                    176:        }
                    177: #ifdef DEBUG
                    178:        else {
                    179:                fprintf(ddt,"Debug turned ON, Level %d\n",debug);
                    180:                fprintf(ddt,"Version = %s\t",Version);
                    181:                fprintf(ddt,"bootfile = %s\n",bootfile);
                    182:        }               
                    183: #endif
                    184: 
                    185: #ifdef BSD4_3
                    186:        openlog("named", LOG_PID|LOG_CONS|LOG_NDELAY, LOG_DAEMON);
                    187: #else
                    188:        openlog("named", LOG_PID);
                    189: #endif
                    190: 
                    191:        nsaddr.sin_family = AF_INET;
                    192:        nsaddr.sin_addr.s_addr = INADDR_ANY;
                    193:        nsaddr.sin_port = ns_port;
                    194:        /*
                    195:        ** Initialize and load database.
                    196:        */
                    197:        ns_init(bootfile);
                    198: 
                    199:        /* Block signals during maintenance */
                    200:        sv.sv_handler = maint_alarm;
                    201:        sv.sv_onstack = 0;
                    202:        sv.sv_mask = ~0;
                    203: 
                    204:        (void) sigvec(SIGALRM, &sv, (struct sigvec *)0);
                    205: 
                    206:        (void) signal(SIGHUP, onhup);
                    207:        (void) signal(SIGCHLD, reapchild);
                    208:        (void) signal(SIGPIPE, SIG_IGN);
                    209:        (void) signal(SIGSYS, sigprof);
                    210: 
                    211: #if    BSD >= 43
                    212:        /* flames to [email protected] - I lost the battle -KJD */
                    213:        (void) signal(SIGINT, doadump);
                    214:        (void) signal(SIGUSR1, sigsetdebug);
                    215:        (void) signal(SIGUSR2, signodebug);
                    216: #else  BSD
                    217:        (void) signal(SIGQUIT, doadump);
                    218:        (void) signal(SIGEMT, sigsetdebug);
                    219:        (void) signal(SIGFPE, signodebug);
                    220: #endif BSD
                    221: 
                    222: #ifdef DEBUG
                    223:        if (debug) {
                    224:                fprintf(ddt,"database initialized\n");
                    225:        }
                    226: #endif
                    227:        /*
                    228:        ** Open stream port.
                    229:        */
                    230:        if ((vs = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
                    231:                syslog(LOG_ERR, "socket(SOCK_STREAM): %m");
                    232:                exit(1);
                    233:        }       
                    234:        (void)setsockopt(vs, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on));
                    235:        if (bind(vs, &nsaddr, sizeof(nsaddr))) {
                    236:                syslog(LOG_ERR, "bind(vs): %m");
                    237:                exit(1);
                    238:        }
                    239:        (void) listen(vs, 5);
                    240:        /*
                    241:        ** Open datagram port.
                    242:        */
                    243:        if ((ds = socket(AF_INET, SOCK_DGRAM, 0)) < 0) {
                    244:                syslog(LOG_ERR, "socket(SOCK_DGRAM): %m");
                    245:                exit(1);
                    246:        }       
                    247:        (void)setsockopt(ds, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on));
                    248: #ifdef BSD4_3
                    249:        (void)setsockopt(ds, SOL_SOCKET, SO_RCVBUF, (char *)&rbufsize,
                    250:            sizeof(rbufsize));
                    251: #endif
                    252:        (void) fcntl(ds, F_SETFL, FNDELAY);
                    253:        if (bind(ds, &nsaddr, sizeof(nsaddr))) {
                    254:                syslog(LOG_ERR, "bind(ds): %m");
                    255:                exit(1);
                    256:        }
                    257:        /* tuck my process id away */
                    258:        fp = fopen(PidFile, "w");
                    259:        if (fp != NULL) {
                    260:                fprintf(fp, "%d\n", getpid());
                    261:                (void) fclose(fp);
                    262:        }
                    263: 
                    264:        t.tv_usec = 0;
                    265: 
                    266: #ifdef DEBUG
                    267:        if (debug)
                    268:                fprintf(ddt,"Ready to answer queries.\n");
                    269: #endif
                    270:        nfds = getdtablesize();       /* get the number of file descriptors */
                    271:        if (nfds > FD_SETSIZE) {
                    272:                syslog(LOG_ERR, "Return from getdtablesize() > FD_SETSIZE");
                    273: #ifdef DEBUG
                    274:                if (debug)
                    275:                      fprintf(ddt,"Return from getdtablesize() > FD_SETSIZE\n");
                    276: #endif
                    277:        }
                    278:        FD_ZERO(&mask);
                    279:        FD_SET(vs, &mask);
                    280:        FD_SET(ds, &mask);
                    281:        for (;;) {
                    282:                /*
                    283:                ** Wait until a query arrives; can be interrupted by maintenance
                    284:                */
                    285:                if (retryqp != NULL) {
                    286:                        if (gettimeofday(&tt, (struct timezone *)0) < 0)
                    287:                                syslog(LOG_ERR, "gettimeofday failed: %m");
                    288:                        t.tv_sec = (long) retryqp->q_time - tt.tv_sec;
                    289:                        if (t.tv_sec <= 0) {
                    290:                                retry(retryqp);
                    291:                                continue;
                    292:                        }
                    293:                        tp = &t;
                    294:                } else
                    295:                        tp = NULL;
                    296:                if(needreload) {
                    297:                        needreload = 0;
                    298:                        db_reload();
                    299:                }
                    300:                if(needmaint) {
                    301:                        needmaint = 0;
                    302:                        ns_maint();
                    303:                }
                    304:                tmpmask = mask;
                    305:                n = select(nfds, &tmpmask, (fd_set *)NULL, (fd_set *)NULL, tp);
                    306:                if (n < 0) {
                    307:                        if (errno == EINTR)
                    308:                                continue;
                    309:                        syslog(LOG_ERR, "select: %m");
                    310:                        break;
                    311:                }
                    312:                if (n == 0) {
                    313:                        retry(retryqp);
                    314:                        continue;
                    315:                }
                    316:                if (gettimeofday(&tt, (struct timezone *)0) < 0) {
                    317:                        syslog(LOG_ERR, "gettimeofday failed: %m");
                    318:                        break;
                    319:                }
                    320:                /*
                    321:                ** Process datagram
                    322:                */
                    323:                if (FD_ISSET(ds, &tmpmask))
                    324:                    for(udpcnt = 0; udpcnt < 25; udpcnt++) {
                    325:                        len = sizeof(from);
                    326:                        if ((n = recvfrom(ds, buf, sizeof(buf), 0,
                    327:                                &from, &len)) < 0)
                    328:                        {
                    329:                                if ((n == -1) && (errno == EWOULDBLOCK))
                    330:                                        break;
                    331:                                syslog(LOG_WARNING, "recvfrom: %m");
                    332:                                break;
                    333:                        }
                    334: #ifdef DEBUG
                    335:                        if (debug)
                    336:                                fprintf(ddt,"datagram from %s, %d (%d)\n",
                    337:                                        inet_ntoa(from.sin_addr),
                    338:                                        ntohs(from.sin_port), n);
                    339:                        if (debug >= 10)
                    340:                                fp_query(buf, ddt);
                    341: #endif
                    342:                        /*
                    343:                         * Consult database to get the answer.
                    344:                         */
                    345:                        if (gettimeofday(&tt, (struct timezone *)0) < 0) {
                    346:                                syslog(LOG_ERR, "gettimeofday failed: %m");
                    347:                                break;
                    348:                        }
                    349:                        ns_req(buf, n, PACKETSZ, QSTREAM_NULL, &from);
                    350:                    }
                    351:                /*
                    352:                ** Process stream connection
                    353:                */
                    354:                if (FD_ISSET(vs, &tmpmask)) {
                    355:                        len = sizeof(from);
                    356:                        rfd = accept(vs, &from, &len);
                    357:                        if (gettimeofday(&tt, (struct timezone *)0) < 0) {
                    358:                                syslog(LOG_ERR, "gettimeofday failed: %m");
                    359:                                break;
                    360:                        }
                    361:                        if (rfd < 0) {
                    362:                            if (errno == EMFILE) {
                    363:                                if (streamq != NULL) {
                    364:                                    maxctime = 0;
                    365:                                    candidate = QSTREAM_NULL;
                    366:                                    for (sp = streamq; sp != QSTREAM_NULL;
                    367:                                       sp = sp->s_next)
                    368:                                    {
                    369:                                        if (sp->s_refcnt != 0)
                    370:                                            continue;
                    371:                                        lasttime = tt.tv_sec - sp->s_time;
                    372:                                        if (lasttime >= 900)
                    373:                                            sqrm(sp, &tmpmask);
                    374:                                        else if (lasttime > maxctime) {
                    375:                                            candidate = sp;
                    376:                                            maxctime = lasttime;
                    377:                                        }
                    378:                                    }
                    379:                                    rfd = accept(vs, &from, &len);
                    380:                                    if ((rfd < 0) && (errno == EMFILE))
                    381:                                        if (candidate != QSTREAM_NULL) {
                    382:                                            sqrm(candidate, &tmpmask);
                    383:                                            rfd = accept(vs, &from, &len);
                    384:                                            if (rfd < 0)
                    385:                                                syslog(LOG_WARNING,
                    386:                                                    "accept: %m");
                    387:                                                continue;
                    388:                                        }
                    389:                                } else {
                    390:                                        syslog(LOG_WARNING, "accept: %m");
                    391:                                        continue;
                    392:                                }
                    393:                            } else {
                    394:                                syslog(LOG_WARNING, "accept: %m");
                    395:                                continue;
                    396:                            }
                    397:                        }
                    398:                        (void) fcntl(rfd, F_SETFL, FNDELAY);
                    399:                        (void) setsockopt(rfd, SOL_SOCKET, SO_KEEPALIVE,
                    400:                                (char *)&on, sizeof(on));
                    401:                        if ((sp = sqadd()) == QSTREAM_NULL)
                    402:                                (void) close(rfd);
                    403:                        sp->s_rfd = rfd;        /* stream file descriptor */
                    404:                        sp->s_size = -1;        /* amount of data to recive */
                    405:                        if (gettimeofday(&tt, (struct timezone *)0) < 0) {
                    406:                                syslog(LOG_ERR, "gettimeofday failed: %m");
                    407:                                break;
                    408:                        }
                    409:                        sp->s_time = tt.tv_sec; /* last transaction time */
                    410:                        sp->s_from = from;      /* address to respond to */
                    411:                        sp->s_bufsize = 0;
                    412:                        sp->s_bufp = (char *)&sp->s_tempsize;
                    413:                        sp->s_refcnt = 0;
                    414:                        FD_SET(rfd, &mask);
                    415:                        FD_SET(rfd, &tmpmask);
                    416: #ifdef DEBUG
                    417:                        if (debug)
                    418:                        {
                    419:                                fprintf(ddt,"stream from %s, %d (%d)\n",
                    420:                                        inet_ntoa(sp->s_from.sin_addr),
                    421:                                        ntohs(sp->s_from.sin_port), n);
                    422:                        }
                    423: #endif
                    424:                }
                    425: #ifdef DEBUG
                    426:                if (debug > 2)
                    427:                        fprintf(ddt,"streamq  = x%x\n",streamq);
                    428: #endif
                    429:                if (streamq != NULL) {
                    430:                        for (sp = streamq; sp != QSTREAM_NULL; sp = sp->s_next)
                    431:                            if (FD_ISSET(sp->s_rfd, &tmpmask)) {
                    432: #ifdef DEBUG
                    433:                                if (debug > 5) {
                    434:                                    fprintf(ddt,
                    435:                                        "sp x%x rfd %d size %d time %d ",
                    436:                                        sp, sp->s_rfd, sp->s_size,
                    437:                                        sp->s_time );
                    438:                                    fprintf(ddt," next x%x \n", sp->s_next );
                    439:                                    fprintf(ddt,"\tbufsize %d",sp->s_bufsize);
                    440:                                    fprintf(ddt," buf x%x%d ",sp->s_buf);
                    441:                                    fprintf(ddt," bufp x%x%d\n",sp->s_bufp);
                    442:                                }
                    443: #endif DEBUG
                    444:                            if (sp->s_size < 0) {
                    445:                                size = sizeof(u_short) -
                    446:                                (sp->s_bufp - (char *)&sp->s_tempsize);
                    447:                                while (size > 0 &&
                    448:                                   (n = read(sp->s_rfd, sp->s_bufp, size)) > 0){
                    449:                                            sp->s_bufp += n;
                    450:                                            size -= n;
                    451:                                }
                    452:                                if ((n == -1) && (errno == EWOULDBLOCK))
                    453:                                            continue;
                    454:                                if (n <= 0) {
                    455:                                            sp->s_refcnt = 0;
                    456:                                            sqrm(sp, &mask);
                    457:                                            continue;
                    458:                                }
                    459:                                if ((sp->s_bufp - (char *)&sp->s_tempsize) ==
                    460:                                        sizeof(u_short)) {
                    461:                                        sp->s_size = htons(sp->s_tempsize);
                    462:                                        if (sp->s_bufsize == 0) {
                    463:                                            if ( (sp->s_buf = malloc(BUFSIZ))
                    464:                                                == NULL) {
                    465:                                                    sp->s_buf = buf;
                    466:                                                    sp->s_size  = sizeof(buf);
                    467:                                            } else {
                    468:                                                    sp->s_bufsize = BUFSIZ;
                    469:                                            }
                    470:                                        }
                    471:                                        if (sp->s_size > sp->s_bufsize &&
                    472:                                          sp->s_bufsize != 0) {
                    473:                                            if ((sp->s_buf = realloc(
                    474:                                                (char *)sp->s_buf,
                    475:                                                (unsigned)sp->s_size)) == NULL){
                    476:                                                    sp->s_buf = buf;
                    477:                                                    sp->s_bufsize = 0;
                    478:                                                    sp->s_size  = sizeof(buf);
                    479:                                           } else {
                    480:                                                    sp->s_bufsize = sp->s_size;
                    481:                                           }
                    482:                                        }
                    483:                                        sp->s_bufp = sp->s_buf; 
                    484:                                    }
                    485:                            }
                    486:                            if (gettimeofday(&tt, (struct timezone *)0) < 0) {
                    487:                                    syslog(LOG_ERR, "gettimeofday failed: %m");
                    488:                                    break;
                    489:                            }
                    490:                            sp->s_time = tt.tv_sec;
                    491:                            while (sp->s_size > 0 &&
                    492:                              (n = read(sp->s_rfd, sp->s_buf, sp->s_size)) > 0)
                    493:                            {
                    494:                                    sp->s_bufp += n;
                    495:                                    sp->s_size -= n;
                    496:                            }
                    497:                            /*
                    498:                             * we don't have enough memory for the query.
                    499:                             * if we have a query id, then we will send an
                    500:                             * error back to the user.
                    501:                             */
                    502:                            if (sp->s_bufsize == 0 &&
                    503:                                (sp->s_bufp - sp->s_buf > sizeof(u_short))) {
                    504:                                    HEADER *hp;
                    505: 
                    506:                                    hp = (HEADER *)sp->s_buf;
                    507:                                    hp->qr = 1;
                    508:                                    hp->ra = 1;
                    509:                                    hp->ancount = 0;
                    510:                                    hp->qdcount = 0;
                    511:                                    hp->nscount = 0;
                    512:                                    hp->arcount = 0;
                    513:                                    hp->rcode = SERVFAIL;
                    514:                                    (void) writemsg(sp->s_rfd, sp->s_buf,
                    515:                                        sizeof(HEADER));
                    516:                                    continue;
                    517:                            }
                    518:                            if ((n == -1) && (errno == EWOULDBLOCK))
                    519:                                    continue;
                    520:                            if (n <= 0) {
                    521:                                    sp->s_refcnt = 0;
                    522:                                    sqrm(sp, &mask);
                    523:                                    continue;
                    524:                            }
                    525:                            /*
                    526:                             * Consult database to get the answer.
                    527:                             */
                    528:                            if (sp->s_size == 0) {
                    529:                                    sp->s_refcnt++;
                    530:                                    ns_req(sp->s_buf,
                    531:                                        sp->s_bufp - sp->s_buf,
                    532:                                        sp->s_bufsize, sp,
                    533:                                        &sp->s_from);
                    534:                                    sp->s_bufp = (char *)&sp->s_tempsize;
                    535:                                    sp->s_size = -1;
                    536:                                    continue;
                    537:                            }
                    538:                    }
                    539:                }
                    540:        }
                    541:        (void) close(vs);
                    542:        (void) close(ds);
                    543:        return (0);
                    544: }
                    545: 
                    546: usage()
                    547: {
                    548:        fprintf(stderr, "Usage: named [-d #] [-p port] [{-b} bootfile]\n");
                    549:        exit(1);
                    550: }
                    551: 
                    552: /*
                    553: ** Set flag saying to reload database upon receiving SIGHUP.
                    554: ** Must make sure that someone isn't walking through a data
                    555: ** structure at the time.
                    556: */
                    557: 
                    558: onhup()
                    559: {
                    560:        needreload = 1;
                    561: }
                    562: 
                    563: /*
                    564: ** Set flag saying to call ns_maint()
                    565: ** Must make sure that someone isn't walking through a data
                    566: ** structure at the time.
                    567: */
                    568: 
                    569: maint_alarm()
                    570: {
                    571:        needmaint = 1;
                    572: }
                    573: 
                    574: /*
                    575: ** Set flag saying to read was interrupted
                    576: ** used for a read timer
                    577: */
                    578: 
                    579: read_alarm()
                    580: {
                    581:        extern int read_interrupted;
                    582:        read_interrupted = 1;
                    583: }
                    584: 
                    585: reapchild()
                    586: {
                    587:        union wait status;
                    588: 
                    589:        while (wait3(&status, WNOHANG, (struct rusage *)NULL) > 0)
                    590:                ;
                    591: }
                    592: 
                    593: /*
                    594: ** Turn on or off debuging by open or closeing the debug file
                    595: */
                    596: 
                    597: setdebug(code)
                    598: int code;
                    599: {
                    600: #if defined(lint) && !defined(DEBUG)
                    601:        code = code;
                    602: #endif
                    603: #ifdef DEBUG
                    604: 
                    605:        if (code) {
                    606:                ddt = freopen(debugfile, "w+", stderr);
                    607:                if ( ddt == NULL)
                    608:                        syslog(LOG_WARNING, "can't open debug file: %m");
                    609:                else
                    610:                        setlinebuf(ddt);
                    611:        }
                    612:        else {
                    613:                fprintf(ddt,"Debug turned OFF, Level %d\n",debug);
                    614:                (void) fclose(ddt);
                    615:                debug = 0;
                    616:        }
                    617: #endif
                    618: }
                    619: 
                    620: /*
                    621: ** Catch a special signal  SIGEMT and set debug level
                    622: **
                    623: **  SIGEMT - if debuging is off then turn on debuging else incremnt the level
                    624: **
                    625: ** Handy for looking in on long running name servers.
                    626: */
                    627: 
                    628: sigsetdebug()
                    629: {
                    630: 
                    631: #ifdef DEBUG
                    632:        if (debug == 0) {
                    633:                debug++;
                    634:                setdebug(1);
                    635:        }
                    636:        else {
                    637:                debug++;
                    638:        }
                    639:        fprintf(ddt,"Debug turned ON, Level %d\n",debug);
                    640: #endif
                    641: }
                    642: 
                    643: /*
                    644: ** Catch a special signal's SIGFPE and turn off debugging
                    645: **
                    646: **  SIGFPE - turn off debugging
                    647: */
                    648: 
                    649: signodebug()
                    650: {
                    651:        setdebug(0);
                    652: }
                    653: 
                    654: 
                    655: /*
                    656: ** Catch a special signal SIGSYS
                    657: **
                    658: **  this is setup to fork and exit to drop to /usr/tmp/gmon.out
                    659: **   and keep the server running
                    660: */
                    661: 
                    662: sigprof()
                    663: {
                    664: #ifdef DEBUG
                    665:        if (debug)
                    666:                fprintf(ddt,"sigprof()\n");
                    667: #endif
                    668:        if ( fork() == 0)
                    669:        {
                    670:                (void) chdir("/usr/tmp");
                    671:                exit(1);
                    672:        }
                    673: }
                    674: 
                    675: /*
                    676: ** Routines for managing stream queue
                    677: */
                    678: 
                    679: struct qstream *
                    680: sqadd()
                    681: {
                    682:        register struct qstream *sqp;
                    683: 
                    684:        if ((sqp = (struct qstream *)calloc(1, sizeof(struct qstream)))
                    685:            == NULL ) {
                    686: #ifdef DEBUG
                    687:                if (debug >= 5)
                    688:                        fprintf(ddt,"sqadd: malloc error\n");
                    689: #endif
                    690:                syslog(LOG_ERR, "sqadd: Out Of Memory");
                    691:                return(QSTREAM_NULL);
                    692:        }
                    693: #ifdef DEBUG
                    694:        if (debug > 3)
                    695:                fprintf(ddt,"sqadd(x%x)\n", sqp);
                    696: #endif
                    697: 
                    698:        sqp->s_next = streamq;
                    699:        streamq = sqp;
                    700:        return(sqp);
                    701: }
                    702: 
                    703: sqrm(qp, mask)
                    704:        register struct qstream *qp;
                    705:        fd_set *mask;
                    706: {
                    707:        register struct qstream *qsp;
                    708: 
                    709: #ifdef DEBUG
                    710:        if (debug > 1) {
                    711:                fprintf(ddt,"sqrm(%#x, %d ) rfcnt=%d\n",
                    712:                    qp, qp->s_rfd, qp->s_refcnt);
                    713:        }
                    714: #endif
                    715:        if (qp->s_refcnt != 0)
                    716:                return;
                    717: 
                    718:        if (qp->s_bufsize != 0)
                    719:                (void) free(qp->s_buf);
                    720:        FD_CLR(qp->s_rfd, mask);
                    721:        (void) close(qp->s_rfd);
                    722:        if (qp == streamq) {
                    723:                streamq = qp->s_next;
                    724:        } else {
                    725:                for (qsp = streamq; qsp->s_next != qp; qsp = qsp->s_next)
                    726:                        ;
                    727:                qsp->s_next = qp->s_next;
                    728:        }
                    729:        (void)free((char *)qp);
                    730: }
                    731: 
                    732: setproctitle(a, s)
                    733:        char *a;
                    734:        int s;
                    735: {
                    736:        int size;
                    737:        register char *cp;
                    738:        struct sockaddr_in sin;
                    739:        char buf[80];
                    740: 
                    741:        cp = Argv[0];
                    742:        size = sizeof(sin);
                    743:        if (getpeername(s, &sin, &size) == 0)
                    744:                (void) sprintf(buf, "-%s [%s]", a, inet_ntoa(sin.sin_addr));
                    745:        else
                    746:                (void) sprintf(buf, "-%s", a);
                    747:        (void) strncpy(cp, buf, LastArg - cp);
                    748:        cp += strlen(cp);
                    749:        while (cp < LastArg)
                    750:                *cp++ = ' ';
                    751: }

unix.superglobalmegacorp.com

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