Annotation of 43BSDReno/contrib/isode-beta/others/quipu/uips/fred/fred.c, revision 1.1.1.1

1.1       root        1: /* fred.c - FRont-End to Dish */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/others/quipu/uips/fred/RCS/fred.c,v 7.6 90/07/27 08:45:23 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/others/quipu/uips/fred/RCS/fred.c,v 7.6 90/07/27 08:45:23 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       fred.c,v $
                     12:  * Revision 7.6  90/07/27  08:45:23  mrose
                     13:  * update
                     14:  * 
                     15:  * Revision 7.5  90/06/11  10:55:14  mrose
                     16:  * UFN
                     17:  * 
                     18:  * Revision 7.4  90/01/16  20:43:24  mrose
                     19:  * last check-out
                     20:  * 
                     21:  * Revision 7.3  90/01/11  18:36:28  mrose
                     22:  * real-sync
                     23:  * 
                     24:  * Revision 7.2  89/12/14  18:48:59  mrose
                     25:  * KIS project
                     26:  * 
                     27:  * Revision 7.1  89/12/13  20:01:46  mrose
                     28:  * errfp
                     29:  * 
                     30:  * Revision 7.0  89/11/23  22:08:56  mrose
                     31:  * Release 6.0
                     32:  * 
                     33:  */
                     34: 
                     35: /*
                     36:  *                               NOTICE
                     37:  *
                     38:  *    Acquisition, use, and distribution of this module and related
                     39:  *    materials are subject to the restrictions of a license agreement.
                     40:  *    Consult the Preface in the User's Manual for the full terms of
                     41:  *    this agreement.
                     42:  *
                     43:  */
                     44: 
                     45: 
                     46: #include <ctype.h>
                     47: #include <setjmp.h>
                     48: #include <signal.h>
                     49: #include <varargs.h>
                     50: #include "fred.h"
                     51: #include "internet.h"
                     52: 
                     53: #ifdef BSD42
                     54: #include <sys/file.h>
                     55: #endif
                     56: #ifdef SYS5
                     57: #include <fcntl.h>
                     58: #endif
                     59: #ifndef        R_OK
                     60: #define        R_OK    4
                     61: #endif
                     62: 
                     63: /*    DATA */
                     64: 
                     65: static char *myname = "fred";
                     66: 
                     67: static char **op = NULLVP;
                     68: 
                     69: static int alarming = 0;
                     70: static int logging = 0;
                     71: static int ontty;
                     72: static int armed;
                     73: static jmp_buf alrmenv;
                     74: static jmp_buf intrenv;
                     75: int    interrupted;
                     76: 
                     77: int    oneshot;
                     78: 
                     79: char    ufn_file[BUFSIZ] = "";
                     80: 
                     81: SFP    astat;
                     82: SFP    istat;
                     83: SFP    qstat;
                     84: 
                     85: SFD    alrmser ();
                     86: SFD    intrser ();
                     87: 
                     88: LLog    _fred_log = {
                     89:     "fred.log", NULLCP, NULLCP, LLOG_FATAL | LLOG_EXCEPTIONS | LLOG_NOTICE,
                     90:     LLOG_NONE, -1, LLOGCLS | LLOGCRT | LLOGZER, NOTOK
                     91: };
                     92: LLog *fred_log = &_fred_log;
                     93: 
                     94: 
                     95: static char *from = NULL;
                     96: static char *reply_to = NULL;
                     97: static char *sender = NULL;
                     98: static char *subject = NULL;
                     99: 
                    100: static struct pair {
                    101:     char   *p_name;
                    102:     char  **p_value;
                    103: } pairs[] = {
                    104:     "From:", &from,
                    105:     "Reply-To:", &reply_to,
                    106:     "Sender:", &sender,
                    107:     "Subject:", &subject,
                    108: };
                    109: 
                    110: /*    MAIN */
                    111: 
                    112: /* ARGSUSED  */
                    113: 
                    114: main (argc, argv, envp)
                    115: int    argc;
                    116: char  **argv,
                    117:       **envp;
                    118: {
                    119:     int            eof,
                    120:            status,
                    121:            vecp;
                    122:     register char   *cp;
                    123:     char    address[BUFSIZ],
                    124:            buffer[BUFSIZ],
                    125:           *vec[NVEC + 1];
                    126:     struct sockaddr_in in_socket,
                    127:                      *isock = &in_socket;
                    128: 
                    129:     arginit (argv);
                    130: 
                    131:     rcinit ();
                    132: 
                    133:     rcfile (isodefile ("fredrc", 0), 0, 1);
                    134:     if (access (isodefile ("ufnrc", 0), R_OK) != NOTOK)
                    135:        area_quantum = -1;
                    136: 
                    137:     status = 0;
                    138: 
                    139:     if (mail) {
                    140:        register int   c;
                    141:        register char *ep;
                    142:        register struct pair *p;
                    143:        FILE   *fp;
                    144: 
                    145:        for (;;) {
                    146:            ep = (cp = buffer) + sizeof buffer - 1;
                    147: 
                    148:            while ((c = getc (stdin)) != EOF)
                    149:                if (c == '\n') {
                    150:                    if ((c = getc (stdin)) == ' ' || c == '\t') {
                    151:                        *cp++ = ' ';
                    152:                        while ((c = getc (stdin)) == ' ' || c == '\t')
                    153:                            continue;
                    154:                        if (c != EOF)
                    155:                            (void) ungetc (c, stdin);
                    156:                        else {
                    157:                            c = NULL;
                    158:                            break;
                    159:                        }
                    160:                    }
                    161:                    else {
                    162:                        if (c == EOF)
                    163:                            c = NULL;
                    164:                        else
                    165:                            (void) ungetc (c, stdin);
                    166:                        break;
                    167:                    }
                    168:                }
                    169:                else
                    170:                    if (cp < ep)
                    171:                        *cp++ = c != '\t' ? c & 0xff : ' ';
                    172: 
                    173:            if (cp == buffer)
                    174:                break;
                    175:            *cp = NULL;
                    176: 
                    177:            for (p = pairs; p -> p_name; p++)
                    178:                if (lexnequ (buffer, p -> p_name, c = strlen (p -> p_name))
                    179:                        == 0) {
                    180:                    if (*p -> p_value == NULL) {
                    181:                        for (cp = buffer + c; *cp == ' ' || *cp == '\t'; cp++)
                    182:                            continue;
                    183:                        if (*cp) {
                    184:                            ep = cp + strlen (cp) - 1;
                    185:                            while (*ep == ' ')
                    186:                                ep--;
                    187:                            *++ep = NULL;
                    188:                            *p -> p_value = strdup (cp);
                    189:                        }
                    190:                    }
                    191:                    break;
                    192:                }
                    193: 
                    194:        }
                    195: 
                    196:        if (!from && !reply_to && !sender)
                    197:            adios (NULLCP, "unable to determine return address");
                    198: 
                    199:        (void) sprintf (buffer, "/bin/mail \"%s\"",
                    200:                        ep = reply_to ? reply_to : from ? from : sender);
                    201:        if (watch) {
                    202:            fprintf (stderr, "%s\n", buffer);
                    203:            (void) fflush (stderr);
                    204:        }
                    205: 
                    206:        (void) signal (SIGPIPE, SIG_IGN);
                    207:        if ((fp = popen (buffer, "w")) == NULL)
                    208:            adios ("failed", "popen");
                    209: 
                    210:        stdfp = errfp = fp;
                    211: 
                    212:        fprintf (stdfp, "To: %s\nSubject: Re: %s\n\n",
                    213:                 ep, subject ? subject : "white pages query");
                    214:        (void) fflush (stdfp);
                    215: 
                    216:        if (f_bind (NULLVP) == NOTOK)
                    217:            adios (NULLCP, "unable to open the white pages");
                    218: 
                    219:        if (subject) {
                    220:            (void) strcpy (buffer, subject);
                    221:            (void) ll_log (fred_log, LLOG_NOTICE, NULLCP, "%s asks: %s",
                    222:                           ep, buffer);
                    223: 
                    224:            bzero ((char *) vec, sizeof vec);
                    225:            if (str2vecY (buffer, vec) < 1)
                    226:                (void) f_help (NULLVP);
                    227:            else
                    228:                if (fredloop (vec, NOTOK) != OK)
                    229:                    status = 1;
                    230:        }
                    231:        else {
                    232:            int     didone = 0;
                    233: 
                    234:            while ((c = getc (stdin)) != EOF)
                    235:                if (c != ' ' || c != '\t' || c != '\n')
                    236:                    break;
                    237: 
                    238:            if (c != EOF)
                    239:                while (fgets (buffer, sizeof buffer, stdin)) {
                    240:                    if (cp = index (buffer, '\n'))
                    241:                        *cp = NULL;
                    242:                    if (buffer[0] == NULL)
                    243:                        break;
                    244: 
                    245:                    (void) ll_log (fred_log, LLOG_NOTICE, NULLCP,
                    246:                                   "%s asks: %s", ep, buffer);
                    247: 
                    248:                    fprintf (stdfp, "%s>>> %s\n", didone ? "\n\n" : "", buffer);
                    249: 
                    250:                    bzero ((char *) vec, sizeof vec);
                    251:                    if (str2vecY (buffer, vec) < 1)
                    252:                        break;
                    253: 
                    254:                    if (fredloop (vec, NOTOK) != OK) {
                    255:                        status = 1;
                    256:                        break;
                    257:                    }
                    258:                    didone = 1;
                    259:                }
                    260: 
                    261:            if (!didone)
                    262:                (void) f_help (NULLVP);
                    263:        }
                    264: 
                    265:        (void) fclose (fp);
                    266: 
                    267:        stdfp = stdout;
                    268: 
                    269:        goto were_out_of_here;
                    270:     }
                    271: 
                    272:     if (network) {
                    273:        int    len;
                    274: 
                    275:        if (getpeername (fileno (stdin), (struct sockaddr *) isock,
                    276:                         (len = sizeof *isock, &len)) != NOTOK) {
                    277:            (void) sprintf (address, "%s/%d",
                    278:                            inet_ntoa (isock -> sin_addr),
                    279:                            ntohs (isock -> sin_port));
                    280: 
                    281:            rcmap (isock);
                    282:        }
                    283:        else {
                    284:            (void) ll_log (fred_log, LLOG_EXCEPTIONS, "failed", "getpeername");
                    285:            (void) strcpy (address, "peer");
                    286:        }
                    287:     }
                    288:     else
                    289:        {
                    290:            register struct hostent *hp;
                    291: 
                    292:            (void) strcpy (address, getlocalhost ());
                    293: 
                    294:            if (hp = gethostbystring (address)) {
                    295:                bzero ((char *) isock, sizeof *isock);
                    296:                isock -> sin_family = hp -> h_addrtype;
                    297:                inaddr_copy (hp, isock);
                    298:                rcmap (isock);
                    299:            }
                    300:            else
                    301:                advise (NULLCP, "%s: unknown host", address);
                    302: 
                    303:        }
                    304: 
                    305:     if (!fflag) {
                    306:        (void) sprintf (buffer, "%s/.fredrc", myhome);
                    307:        rcfile (buffer, op ? 1 : 0, 0);
                    308:     }
                    309: 
                    310:     if (f_bind (NULLVP) == NOTOK)
                    311:        adios (NULLCP, "unable to open the white pages");
                    312: 
                    313:     if (network) {
                    314:        errfp = stdout;
                    315: 
                    316:        switch (fetchline (buffer, sizeof buffer, stdin)) {
                    317:            case NOTOK:
                    318:                adios (NULLCP, "error reading query from %s", address);
                    319:                /* NOTREACHED */
                    320: 
                    321:            case DONE:
                    322:                buffer[0] = NULL;
                    323:                /* and fall... */
                    324: 
                    325:            case OK:
                    326:            default:
                    327:                break;
                    328:        }
                    329:        if (cp = index (buffer, '\r'))
                    330:            *cp = NULL;
                    331:        if (cp = index (buffer, '\n'))
                    332:            *cp = NULL;
                    333: 
                    334:        (void) ll_log (fred_log, LLOG_NOTICE, NULLCP, "%s asks: %s",
                    335:                       address, buffer);
                    336: 
                    337:        bzero ((char *) vec, sizeof vec);
                    338:        if (str2vecY (buffer, vec) < 1)
                    339:            (void) f_help (NULLVP);
                    340:        else
                    341:            if (fredloop (vec, NOTOK) != OK)
                    342:                status = 1;
                    343: 
                    344:        goto were_out_of_here;
                    345:     }
                    346: 
                    347:     if (op) {
                    348:        vecp = 0;
                    349:        if (strcmp (myname, "whois") == 0)
                    350:            vec[vecp++] = myname;
                    351:        while (*op)
                    352:            vec[vecp++] = *op++;
                    353:        vec[vecp] = NULL;
                    354: 
                    355:        if (fredloop (vec, NOTOK) != NOTOK)
                    356:            status = 1;
                    357: 
                    358:        goto were_out_of_here;
                    359:     }
                    360: 
                    361:     istat = signal (SIGINT, intrser);
                    362: 
                    363:     eof = 0;
                    364:     for (interrupted = 0;; interrupted = 0) {
                    365:        if (alarming) {
                    366:            astat = signal (SIGALRM, alrmser);
                    367: 
                    368:            switch (setjmp (alrmenv)) {
                    369:                case OK:
                    370:                    (void) alarm ((unsigned) 300);
                    371:                    break;
                    372: 
                    373:                default:
                    374:                    adios (NULLCP, "timed out due to inactivity");
                    375:            }
                    376:        }
                    377: 
                    378:        if ((usetty ? getline ("%s> ", buffer) : readline (buffer)) == NOTOK) {
                    379:            if (eof)
                    380:                break;
                    381: 
                    382:            eof = 1;
                    383:            continue;
                    384:        }
                    385:        eof = 0;
                    386: 
                    387:        if (alarming)
                    388:            (void) alarm ((unsigned) 0);
                    389: 
                    390:        if (logging)
                    391:            (void) ll_log (fred_log, LLOG_NOTICE, NULLCP, "command: %s",
                    392:                           buffer);
                    393: 
                    394:        bzero ((char *) vec, sizeof vec);
                    395:        if ((vecp = str2vecY (buffer, vec)) < 1)
                    396:            continue;
                    397: 
                    398:        switch (fredloop (vec, OK)) {
                    399:            case NOTOK:
                    400:                status = 1;
                    401:                break;
                    402: 
                    403:            case OK:
                    404:            default:
                    405:                continue;
                    406: 
                    407:            case DONE:
                    408:                status = 0;
                    409:                break;
                    410:        }
                    411:        break;
                    412:     }
                    413: 
                    414:     (void) signal (SIGINT, istat);
                    415: 
                    416: were_out_of_here: ;
                    417:     (void) f_quit (NULLVP);
                    418: 
                    419:     exit (mail ? 0 : status);          /* NOTREACHED */
                    420: }
                    421: 
                    422: /*    ARGINIT */
                    423: 
                    424: static arginit (vec)
                    425: char  **vec;
                    426: {
                    427:     register char  *ap,
                    428:                   *pp;
                    429: 
                    430:     if (myname = rindex (*vec, '/'))
                    431:        myname++;
                    432:     if (myname == NULL || *myname == NULL)
                    433:        myname = *vec;
                    434: 
                    435:     if (strcmp (myname, "in.whitepages") == 0)
                    436:        network++, fflag++;
                    437: 
                    438:     isodetailor (myname, 1);
                    439:     ll_hdinit (fred_log, myname);
                    440: 
                    441:     if (ontty = isatty (fileno (stdin)))
                    442:        verbose++;
                    443:     oneshot = 0;
                    444: 
                    445:     for (vec++; ap = *vec; vec++) {
                    446:        if (*ap == '-') {
                    447:            while (*++ap)
                    448:                switch (*ap) {
                    449:                    case 'a':
                    450:                        alarming++;
                    451:                        break;
                    452: 
                    453:                    case 'd':
                    454:                        debug++;
                    455:                        break;
                    456: 
                    457:                    case 'm':
                    458:                        mail++;
                    459:                        /* and fall... */
                    460: 
                    461:                    case 'n':
                    462:                        network++;
                    463:                        /* and fall... */
                    464: 
                    465:                    case 'f':
                    466:                        fflag++;
                    467:                        break;
                    468: 
                    469:                    case 'k':
                    470:                        kflag++;
                    471:                        break;
                    472: 
                    473:                    case 'l':
                    474:                        logging++;
                    475:                        break;
                    476: 
                    477:                    case 'r':
                    478:                        readonly++;
                    479:                        pager = "internal";
                    480:                        break;
                    481: 
                    482:                    case 'v':
                    483:                        verbose++;
                    484:                        break;
                    485: 
                    486:                    case 'w':
                    487:                        watch++;
                    488:                        break;
                    489: 
                    490:                    case 'q':
                    491:                        if ((pp = *++vec) == NULL
                    492:                                || sscanf (pp, "%d %d", &ifd, &ofd) != 2)
                    493:                            adios (NULLCP, "usage: %s -q fd-pair", myname);
                    494:                        usetty = 0;
                    495:                        break;
                    496:                        
                    497:                    default:
                    498:                        adios (NULLCP, "unknown switch -%c", *ap);
                    499:                }
                    500:            continue;
                    501:        }
                    502:        if (op == NULL) {
                    503:            op = vec;
                    504:            oneshot = 1;
                    505:            break;
                    506:        }
                    507:     }
                    508: 
                    509:     if (debug)
                    510:        ll_dbinit (fred_log, myname);
                    511:     if (logging)
                    512:        log_utmp ();
                    513: }
                    514: 
                    515: /*    INTERACTIVE */
                    516: 
                    517: int    getline (prompt, buffer)
                    518: char   *prompt,
                    519:        *buffer;
                    520: {
                    521:     register int    i;
                    522:     register char  *cp,
                    523:                    *ep;
                    524:     static int  sticky = 0;
                    525: 
                    526:     if (interrupted) {
                    527:        interrupted = 0;
                    528:        return NOTOK;
                    529:     }
                    530: 
                    531:     if (sticky) {
                    532:        sticky = 0;
                    533:        return NOTOK;
                    534:     }
                    535: 
                    536:     switch (setjmp (intrenv)) {
                    537:        case OK:
                    538:            armed++;
                    539:            break;
                    540: 
                    541:        case NOTOK:
                    542:            if (ontty)
                    543:                printf ("\n");  /* and fall */
                    544:        default:
                    545:            armed = 0;
                    546:            return NOTOK;
                    547:     }
                    548:        
                    549:     if (ontty) {
                    550:        printf (prompt, myname);
                    551:        (void) fflush (stdout);
                    552:     }
                    553: 
                    554:     for (ep = (cp = buffer) + BUFSIZ - 1; (i = getchar ()) != '\n';) {
                    555:        if (i == EOF) {
                    556:            if (ontty)
                    557:                printf ("\n");
                    558:            clearerr (stdin);
                    559:            if (cp == buffer)
                    560:                longjmp (intrenv, DONE);
                    561: 
                    562:            sticky++;
                    563:            break;
                    564:        }
                    565: 
                    566:        if (cp < ep)
                    567:            *cp++ = i;
                    568:     }
                    569:     *cp = NULL;
                    570: 
                    571:     armed = 0;
                    572:     
                    573:     return OK;
                    574: }
                    575: 
                    576: /*  */
                    577: 
                    578: static readline (buffer)
                    579: char   *buffer;
                    580: {
                    581:     register int    i;
                    582:     register char  *bp,
                    583:                   *cp,
                    584:                   *ep;
                    585: 
                    586:     (void) signal (SIGINT, istat);
                    587:     (void) signal (SIGQUIT, qstat);
                    588: 
                    589:     ep = (bp = buffer) + BUFSIZ - 1;
                    590: 
                    591:     (void) strcpy (bp, "whois ");
                    592:     bp += strlen (bp);
                    593:     while ((i = read (ifd, bp, ep - bp)) > 0) {
                    594:        for (cp = bp + i; bp < cp; bp++)
                    595:            if (*bp == '\n')
                    596:                break;
                    597:        if (bp < cp)
                    598:            break;
                    599:     }
                    600:     if (i == NOTOK)
                    601:        adios ("failed", "read from pipe");
                    602:     if (i == 0)
                    603:        exit (0);
                    604:     *bp = NULL;
                    605: 
                    606:     if (watch) {
                    607:        fprintf (stderr, "<--- %s\n", buffer);
                    608:        (void) fflush (stderr);
                    609:     }
                    610: 
                    611:     usetty = 1;
                    612: 
                    613:     return OK;
                    614: }
                    615: 
                    616: /*  */
                    617: 
                    618: #ifndef        IAC
                    619: #define        IAC     255
                    620: #endif
                    621: 
                    622: 
                    623: static int  fetchline (s, n, iop)
                    624: register char  *s;
                    625: register int   n;
                    626: register FILE  *iop;
                    627: {
                    628:     register int    c;
                    629:     register char  *p;
                    630: 
                    631:     p = s;
                    632:     while (--n > 0 && (c = getc (iop)) != EOF) {
                    633:        while (c == IAC) {
                    634:            (void) getc (iop);
                    635:            c = getc (iop);
                    636:        }
                    637:        if ((*p++ = c) == '\n')
                    638:            break;
                    639:     }
                    640:     if (ferror (iop))
                    641:        return NOTOK;
                    642:     if (c == EOF && p == s)
                    643:        return DONE;
                    644:     *p++ = NULL;
                    645: 
                    646:     return OK;
                    647: }
                    648: 
                    649: /*  */
                    650: 
                    651: /* ARGSUSED */
                    652: 
                    653: static SFD alrmser (sig)
                    654: int    sig;
                    655: {
                    656: #ifndef        BSDSIGS
                    657:     (void) signal (SIGALRM, alrmser);
                    658: #endif
                    659: 
                    660:     longjmp (alrmenv, NOTOK);
                    661: }
                    662: 
                    663: /*  */
                    664: 
                    665: /* ARGSUSED */
                    666: 
                    667: static SFD intrser (sig)
                    668: int    sig;
                    669: {
                    670: #ifndef        BSDSIGS
                    671:     (void) signal (SIGINT, intrser);
                    672: #endif
                    673: 
                    674:     if (armed)
                    675:        longjmp (intrenv, NOTOK);
                    676: 
                    677:     interrupted++;
                    678: }
                    679: 
                    680: /*  */
                    681: 
                    682: #ifndef        lint
                    683: int    ask (va_alist)
                    684: va_dcl
                    685: {
                    686:     int     x,
                    687:             y,
                    688:             result;
                    689:     char    buffer[BUFSIZ];
                    690:     va_list ap;
                    691: 
                    692:     if (interrupted) {
                    693:        interrupted = 0;
                    694:        return NOTOK;
                    695:     }
                    696: 
                    697:     if (!ontty)
                    698:        return OK;
                    699: 
                    700:     switch (setjmp (intrenv)) {
                    701:        case OK: 
                    702:            armed++;
                    703:            break;
                    704: 
                    705:        case NOTOK: 
                    706:        default: 
                    707:            printf ("\n");
                    708:            armed = 0;
                    709:            return DONE;
                    710:     }
                    711: 
                    712:     va_start (ap);
                    713: 
                    714:     _asprintf (buffer, NULLCP, ap);
                    715: 
                    716:     va_end (ap);
                    717:     
                    718: again: ;
                    719:     printf ("%s? (y)es, (n)o: ", buffer);
                    720: 
                    721:     x = y = getchar ();
                    722:     while (y != '\n' && y != EOF)
                    723:        y = getchar ();
                    724: 
                    725:     switch (x) {
                    726:        case 'y': 
                    727:        case '\n':
                    728:            result = OK;
                    729:            break;
                    730: 
                    731:        case 'n': 
                    732:            result = NOTOK;
                    733:            break;
                    734: 
                    735:        case EOF: 
                    736:            result = DONE;
                    737:            break;
                    738: 
                    739:        default: 
                    740:            goto again;
                    741:     }
                    742: 
                    743:     armed = 0;
                    744: 
                    745:     return result;
                    746: }
                    747: #else
                    748: /* VARARGS */
                    749: 
                    750: int    ask (fmt)
                    751: char   *fmt;
                    752: {
                    753:     return ask (fmt);
                    754: }
                    755: #endif
                    756: 
                    757: /*  */
                    758: 
                    759: int    str2vecY (buffer, vec)
                    760: char   *buffer,
                    761:       **vec;
                    762: {
                    763:     int            i;
                    764:     register char *cp,
                    765:                  *dp;
                    766: 
                    767:     if (nametype <= 1) {
                    768: normal: ;
                    769:         return str2vec (buffer, vec);
                    770:     }
                    771: 
                    772:     for (cp = buffer; isspace (*cp); cp++)
                    773:        continue;
                    774:     for (dp = cp++; !isspace (*cp); cp++)
                    775:        if (!*cp)
                    776:            goto normal;
                    777:     *cp = NULL;
                    778:     if ((i = strlen (dp)) > 5 || strncmp ("whois", dp, i)) {
                    779:        *cp = ' ';
                    780:        goto normal;
                    781:     }
                    782: 
                    783:     vec[0] = dp;
                    784:     vec[1] = ++cp;
                    785:     vec[2] = NULL;
                    786: 
                    787:     return 2;
                    788: }
                    789: 
                    790: /*    MAPPING */
                    791: 
                    792: /* reads fred's IP-address to DN mapping file.
                    793: 
                    794:    for environments like Rutgers where IP-addresses can be more or less
                    795:    trusted, this allows an easy mechanism for mapping local Rutgers users into
                    796:    some DN other than the NULL user
                    797: 
                    798:    Syntax:
                    799: 
                    800:        <addrmask>      <netaddr>       <dn>    <password>
                    801: 
                    802:        Each token is seperated by LWSP, though double-quotes may be used to
                    803:        prevent separation.
                    804: 
                    805:  */
                    806: 
                    807: static rcmap (isock)
                    808: struct sockaddr_in *isock;
                    809: {
                    810:     u_long     hostaddr,
                    811:                netmask,
                    812:                netaddr;
                    813:     register char *cp;
                    814:     char    buffer[BUFSIZ + 1],
                    815:           *vec[NVEC + 1];
                    816:     FILE   *fp;
                    817: 
                    818:     if ((fp = fopen (isodefile ("fredmap", 0), "r")) == NULL)
                    819:        goto done;
                    820: 
                    821:     hostaddr = isock -> sin_addr.s_addr;
                    822: 
                    823:     while (fgets (buffer, sizeof buffer, fp)) {
                    824:        if (*buffer == '#')
                    825:            continue;
                    826:        if (cp = index (buffer, '\n'))
                    827:            *cp = NULL;
                    828:        bzero ((char *) vec, sizeof vec);
                    829:        if (str2vec (buffer, vec) != 4)
                    830:            continue;
                    831:        if ((netmask = inet_network (vec[0])) == NOTOK)
                    832:            continue;
                    833:        if ((netaddr = inet_network (vec[1])) == NOTOK)
                    834:            continue;
                    835:        if ((hostaddr & netmask) != netaddr)
                    836:            continue;
                    837: 
                    838:        vec[1] = "thisis";
                    839: 
                    840:        runcom = 1, rcmode = 0400;
                    841:        if (f_thisis (vec + 1) == NOTOK)
                    842:            adios (NULLCP, "unable to bind as %s for %s",
                    843:                   vec[2], inet_ntoa (isock -> sin_addr));
                    844: 
                    845:        runcom = 0;
                    846:        break;
                    847:     }
                    848: 
                    849:     (void) fclose (fp);
                    850: 
                    851: done: ;
                    852:     (void) setgid (getgid ());
                    853:     (void) setuid (getuid ());
                    854: }
                    855: 
                    856: /*    ERRORS */
                    857: 
                    858: #ifndef        lint
                    859: void   _advise ();
                    860: 
                    861: 
                    862: void   adios (va_alist)
                    863: va_dcl
                    864: {
                    865:     va_list ap;
                    866: 
                    867:     va_start (ap);
                    868: 
                    869:     if (network)
                    870:        (void) _ll_log (fred_log, LLOG_FATAL, ap);
                    871: 
                    872:     _advise (ap);
                    873: 
                    874:     va_end (ap);
                    875: 
                    876:     (void) f_quit (NULLVP);
                    877: 
                    878:     _exit (1);
                    879: }
                    880: #else
                    881: /* VARARGS */
                    882: 
                    883: void   adios (what, fmt)
                    884: char   *what,
                    885:        *fmt;
                    886: {
                    887:     adios (what, fmt);
                    888: }
                    889: #endif
                    890: 
                    891: 
                    892: #ifndef        lint
                    893: void   advise (va_alist)
                    894: va_dcl
                    895: {
                    896:     va_list ap;
                    897: 
                    898:     va_start (ap);
                    899: 
                    900:     _advise (ap);
                    901: 
                    902:     va_end (ap);
                    903: }
                    904: 
                    905: 
                    906: static void  _advise (ap)
                    907: va_list        ap;
                    908: {
                    909:     char    buffer[BUFSIZ];
                    910:     FILE   *fp = network ? stdfp : stderr;
                    911: 
                    912:     asprintf (buffer, ap);
                    913: 
                    914:     (void) fflush (stdfp);
                    915: 
                    916:     fprintf (fp, "%s: ", myname);
                    917:     (void) fputs (buffer, fp);
                    918:     (void) fputs (EOLN, fp);
                    919: 
                    920:     (void) fflush (fp);
                    921: }
                    922: #else
                    923: /* VARARGS */
                    924: 
                    925: void   advise (what, fmt)
                    926: char   *what,
                    927:        *fmt;
                    928: {
                    929:     advise (what, fmt);
                    930: }
                    931: #endif
                    932: 
                    933: /*    MISCELLANY */
                    934: 
                    935: #ifndef        lint
                    936: char   *strdup (s)
                    937: char   *s;
                    938: {
                    939:     char    *p;
                    940: 
                    941:     if ((p = malloc((unsigned) (strlen (s) + 1))) == NULL)
                    942:        adios (NULLCP, "out of memory");
                    943: 
                    944:     (void) strcpy (p, s);
                    945: 
                    946:     return p;
                    947: }
                    948: #endif
                    949: 
                    950: /*  */
                    951: 
                    952: #include <utmp.h>
                    953: 
                    954: #ifdef sun
                    955: #define        BSD42
                    956: #undef SYS5
                    957: #endif
                    958: 
                    959: #ifdef bsd43_ut_host
                    960: #undef BSD42
                    961: #define        SYS5
                    962: #endif
                    963: 
                    964: #ifdef BSD42
                    965: #define        HMAX    (sizeof (ut -> ut_host))
                    966: #endif
                    967: #define        LMAX    (sizeof (ut -> ut_line))
                    968: #define        NMAX    (sizeof (ut -> ut_name))
                    969: 
                    970: #define SCPYN(a, b)    strncpy(a, b, sizeof (a))
                    971: #define SCMPN(a, b)    strncmp(a, b, sizeof (a))
                    972: 
                    973: 
                    974: #ifdef SYS5
                    975: struct utmp *getutent ();
                    976: #endif
                    977: 
                    978: char *ttyname ();
                    979: 
                    980: 
                    981: static log_utmp () {
                    982: #ifndef        SYS5
                    983:     int            ud;
                    984: #endif
                    985:     char   *line;
                    986:     struct utmp uts;
                    987:     register struct utmp *ut = &uts;
                    988: 
                    989:     if ((line = ttyname (fileno (stdin))) == NULL)
                    990:        return;
                    991:     if (strncmp (line, "/dev/", sizeof "/dev/" - 1) == 0)
                    992:        line += sizeof "/dev/" - 1;
                    993: #ifndef        SYS5
                    994:     if ((ud = open ("/etc/utmp", 0)) == NOTOK)
                    995:        return;
                    996:     while (read (ud, (char *) ut, sizeof *ut) == sizeof *ut) {
                    997:        if (ut -> ut_name[0] == NULL || SCMPN (ut -> ut_line, line))
                    998:            continue;
                    999: #ifndef        BSD42
                   1000:        (void) ll_log (fred_log, LLOG_NOTICE, NULLCP, "%.*s on %.*s",
                   1001:                       NMAX, ut -> ut_name, LMAX, ut -> ut_line);
                   1002: #else
                   1003:        (void) ll_log (fred_log, LLOG_NOTICE, NULLCP,
                   1004:                       "%.*s on %.*s (%.*s)",
                   1005:                       NMAX, ut -> ut_name, LMAX, ut -> ut_line,
                   1006:                       HMAX, ut -> ut_host);
                   1007: #endif
                   1008:        break;
                   1009:     }
                   1010:     (void) close (ud);
                   1011: #else
                   1012:     setutent ();
                   1013:     while (ut = getutent ()) {
                   1014:        if (ut -> ut_type != USER_PROCESS || SCMPN (ut -> ut_line, line))
                   1015:            continue;
                   1016:        
                   1017:        (void) ll_log (fred_log, LLOG_NOTICE, NULLCP, "%.*s on %.*s",
                   1018:                       NMAX, ut -> ut_name, LMAX, ut -> ut_line);
                   1019:        break;
                   1020:     }
                   1021:     endutent ();
                   1022: #endif
                   1023: }
                   1024: 
                   1025: 
                   1026: #ifdef bsd43_ut_host
                   1027: #define        BSD42
                   1028: #undef SYS5
                   1029: #endif

unix.superglobalmegacorp.com

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