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

1.1       root        1: /* whois.c - fred whois function */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/others/quipu/uips/fred/RCS/whois.c,v 7.14 90/07/27 08:45:10 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/others/quipu/uips/fred/RCS/whois.c,v 7.14 90/07/27 08:45:10 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       whois.c,v $
                     12:  * Revision 7.14  90/07/27  08:45:10  mrose
                     13:  * update
                     14:  * 
                     15:  * Revision 7.13  90/07/09  14:41:21  mrose
                     16:  * sync
                     17:  * 
                     18:  * Revision 7.12  90/06/11  21:17:12  mrose
                     19:  * touch-up
                     20:  * 
                     21:  * Revision 7.11  90/06/11  10:55:38  mrose
                     22:  * UFN
                     23:  * 
                     24:  * Revision 7.10  90/03/23  02:39:29  mrose
                     25:  * network
                     26:  * 
                     27:  * Revision 7.9  90/03/15  11:20:45  mrose
                     28:  * quipu-sync
                     29:  * 
                     30:  * Revision 7.8  90/03/08  08:05:10  mrose
                     31:  * phone
                     32:  * 
                     33:  * Revision 7.7  90/01/16  20:43:45  mrose
                     34:  * last check-out
                     35:  * 
                     36:  * Revision 7.6  90/01/11  18:36:41  mrose
                     37:  * real-sync
                     38:  * 
                     39:  * Revision 7.5  89/12/18  08:44:23  mrose
                     40:  * typo
                     41:  * 
                     42:  * Revision 7.4  89/12/14  18:49:05  mrose
                     43:  * KIS project
                     44:  * 
                     45:  * Revision 7.3  89/12/01  10:45:11  mrose
                     46:  * touch-up
                     47:  * 
                     48:  * Revision 7.2  89/11/26  15:09:32  mrose
                     49:  * sync
                     50:  * 
                     51:  * Revision 7.1  89/11/26  14:25:22  mrose
                     52:  * sync
                     53:  * 
                     54:  * Revision 7.0  89/11/23  22:09:06  mrose
                     55:  * Release 6.0
                     56:  * 
                     57:  */
                     58: 
                     59: /*
                     60:  *                               NOTICE
                     61:  *
                     62:  *    Acquisition, use, and distribution of this module and related
                     63:  *    materials are subject to the restrictions of a license agreement.
                     64:  *    Consult the Preface in the User's Manual for the full terms of
                     65:  *    this agreement.
                     66:  *
                     67:  */
                     68: 
                     69: 
                     70: #include <ctype.h>
                     71: #include <signal.h>
                     72: #include "fred.h"
                     73: 
                     74: /*    DATA */
                     75: 
                     76: struct whois {
                     77:     char   *w_input;
                     78:     int            w_inputype;
                     79: #define        W_NULL          0x00
                     80: #define        W_HANDLE        0x01
                     81: #define        W_MAILBOX       0x02
                     82: #define        W_NAME          0x03
                     83: 
                     84:     int            w_nametype;
                     85: #define        W_COMMONAME     0x01
                     86: #define        W_SURNAME       0x02
                     87: 
                     88:     int            w_record;   /* same values as ag_record */
                     89: 
                     90:     char   *w_title;
                     91: 
                     92:     char   *w_area;
                     93:     int            w_areatype;
                     94:     char   *w_geography;
                     95: 
                     96:     int            w_output;
                     97: #define        W_EXPAND        0x01
                     98: #define        W_FULL          0x02
                     99: #define        W_SUMMARY       0x04
                    100: #define        W_SUBDISPLAY    0x08
                    101: };
                    102: 
                    103: 
                    104: char   *eqstr ();
                    105: 
                    106: /*  */
                    107: 
                    108: char *whois_help[] = {
                    109:     "whois input-field [record-type] [area-designator] [output-control]",
                    110:     "    input-field is one of:",
                    111:     "\tname NAME\t\te.g., surname \"smith\", or fullname \"john smith\"",
                    112:     "\thandle HANDLE\t\te.g., handle @c=US@cn=Manager",
                    113:     "\tmailbox LOCAL@DOMAIN\te.g., mailbox [email protected]",
                    114:     "    record-type is one of:",
                    115:     "\tperson or -title NAME\te.g., -title scientist",
                    116:     "\torganization",
                    117:     "\tunit (a division under an organization)",
                    118:     "\trole (a role within an organization)",
                    119:     "\tlocality",
                    120:     "\tdsa (white pages server)",
                    121:     "    area-designator is one of:",
                    122:     "\t-org NAME\t\te.g., -org nyser",
                    123:     "\t-unit NAME\t\te.g., -unit engineering",
                    124:     "\t-locality NAME\t\te.g., -locality rensselaer",
                    125:     "\t-area HANDLE\t\te.g., -area \"@c=US@o=NYSERNet Inc.\"",
                    126:     "\t    and may be optionally followed by -geo HANDLE, e.g., -geo @c=GB",
                    127:     "    output-control is any of:",
                    128:     "\texpand\t   - give a detailed listing, followed by children",
                    129:     "\tsubdisplay - give a one-listing listing, followed by children",
                    130:     "\tfull\t   - give a detailed listing, even on ambiguous matches",
                    131:     "\tsummary\t   - give a one-line listing, even on unique matches",
                    132: 
                    133:     NULL
                    134: };
                    135: 
                    136: /*  */
                    137: 
                    138: static int seqno = 0;
                    139: static char fredseq[10];
                    140: 
                    141: 
                    142: char   *limits ();
                    143: FILE   *capture ();
                    144: 
                    145: /*    WHOIS */
                    146: 
                    147: int    f_whois (vec)
                    148: char  **vec;
                    149: {
                    150:     if (strcmp (*vec, "whois") == 0)
                    151:        vec++;
                    152: 
                    153:     return (nametype > 1 ? f_ufn (vec) : f_whois_aux (vec));
                    154: }
                    155: 
                    156: /*  */
                    157: 
                    158: static int  f_whois_aux (vec)
                    159: char  **vec;
                    160: {
                    161:     int            c,
                    162:            didany,
                    163:            multiple,
                    164:            result;
                    165:     register char *bp,
                    166:                  *cp,
                    167:                  *dp;
                    168:     char    buffer[BUFSIZ],
                    169:            onehit[BUFSIZ],
                    170:            orgname[BUFSIZ],
                    171:           *args[NVEC + 1];
                    172:     register struct area_guide *ag;
                    173:     struct whois ws;
                    174:     register struct whois *w = &ws;
                    175:     FILE   *fp;
                    176: 
                    177:     bzero ((char *) w, sizeof *w);
                    178: 
                    179:     while (cp = *vec++) {
                    180: postscan: ;
                    181: 
                    182:        switch (*cp) {
                    183:            case '.':
                    184:                if (w -> w_inputype != W_NULL) {
                    185: too_many_fields: ;
                    186:                    advise (NULLCP,
                    187:                           "only one of NAME, HANDLE, or MAILBOX allowed");
                    188:                    goto you_really_lose;
                    189:                }
                    190:                if (*++cp == NULL) {
                    191:                    advise (NULLCP, "expecting NAME after \".\"");
                    192:                    goto you_really_lose;
                    193:                }
                    194:                w -> w_inputype = W_NAME;
                    195:                w -> w_input = cp;
                    196:                break;
                    197: 
                    198:            case '!':
                    199:                if (w -> w_inputype != W_NULL)
                    200:                    goto too_many_fields;
                    201:                if (*++cp == NULL) {
                    202:                    advise (NULLCP, "expecting HANDLE after \"!\"");
                    203:                    goto you_really_lose;
                    204:                }
                    205:                goto got_handle;
                    206: 
                    207:            case '*':
                    208:                if (cp[1] == '*') {
                    209:                    cp++;
                    210:                    goto name_or_something;
                    211:                }
                    212:                w -> w_output |= W_EXPAND;
                    213:                if (*++cp)
                    214:                    goto postscan;
                    215:                break;
                    216:                
                    217:            case '~':
                    218:                w -> w_output &= ~W_EXPAND;
                    219:                if (*++cp)
                    220:                    goto postscan;
                    221:                break;
                    222:                
                    223:            case '|':
                    224:                w -> w_output |= W_FULL;
                    225:                if (*++cp)
                    226:                    goto postscan;
                    227:                break;
                    228:                
                    229:            case '$':
                    230:                w -> w_output |= W_SUMMARY;
                    231:                if (*++cp)
                    232:                    goto postscan;
                    233:                break;
                    234:                
                    235:            case '%':
                    236:                w -> w_output |= W_SUBDISPLAY;
                    237:                if (*++cp)
                    238:                    goto postscan;
                    239:                break;
                    240:                
                    241:            case '-':
                    242:                if (test_arg (cp, "-area", 4)) {
                    243:                    result = W_NULL;
                    244: 
                    245: stuff_area: ;
                    246:                    if (w -> w_area != NULL) {
                    247:                        advise (NULLCP, "only one AREA specification allowed");
                    248:                        goto you_really_lose;
                    249:                    }
                    250:                    if (*vec == NULL) {
                    251:                        advise (NULLCP, "expecting %s after \"%s\"",
                    252:                                result != W_NULL ? "NAME" : "HANDLE", cp);
                    253:                        goto you_really_lose;
                    254:                    }
                    255:                    if (*(dp = *vec) == '!')
                    256:                        result = W_NULL;
                    257:                    else {
                    258:                        for (; *dp; dp++)
                    259:                            if (!isdigit (*dp))
                    260:                                break;
                    261:                        if (!*dp)
                    262:                            result = NULL;
                    263:                    }
                    264:                    w -> w_area = *vec++, w -> w_areatype = result;
                    265:                    break;
                    266: 
                    267:                }
                    268:                if (test_arg (cp, "-expand", 4)) {
                    269:                    w -> w_output |= W_EXPAND;
                    270:                    break;
                    271:                }
                    272:                if (test_arg (cp, "-full", 4)) {
                    273:                    w -> w_output |= W_FULL;
                    274:                    break;
                    275:                }
                    276:                if (test_arg (cp, "-geography", 4)) {
                    277:                    if (*vec == NULL) {
                    278:                        advise (NULLCP,
                    279:                                "expecting location after \"-geography\"");
                    280:                        goto you_really_lose;
                    281:                    }
                    282:                    w -> w_geography = *vec++;
                    283:                    break;
                    284:                }
                    285:                if (test_arg (cp, "-help", 5))
                    286:                    goto print_help;
                    287:                if (test_arg (cp, "-locality", 4)) {
                    288:                    result = W_LOCALITY;
                    289:                    goto stuff_area;
                    290:                }
                    291:                if (test_arg (cp, "-organization", 4)) {
                    292:                    result = W_ORGANIZATION;
                    293:                    goto stuff_area;
                    294:                }
                    295:                if (test_arg (cp, "-summary", 4)) {
                    296:                    w -> w_output |= W_SUMMARY;
                    297:                    break;
                    298:                }
                    299:                if (test_arg (cp, "-subdisplay", 4)) {
                    300:                    w -> w_output |= W_SUBDISPLAY;
                    301:                    break;
                    302:                }
                    303:                if (test_arg (cp, "-title", 4)) {
                    304:                    if (*vec == NULL) {
                    305:                        advise (NULLCP,
                    306:                                "expecting something after \"-title\"");
                    307:                        goto you_really_lose;
                    308:                    }
                    309:                    w -> w_title = *vec++;
                    310:                    break;
                    311:                }
                    312:                if (test_arg (cp, "-unit", 4)) {
                    313:                    result = W_UNIT;
                    314:                    goto stuff_area;
                    315:                }
                    316: 
                    317:                advise (NULLCP, "unknown switch: %s", cp);
                    318: you_really_lose: ;
                    319:                if (mail) {
                    320:                    fprintf (stdfp, "\n\n");
                    321:                    goto print_help;
                    322:                }
                    323:                return NOTOK;
                    324: 
                    325:            case 'd':
                    326:                if (strcmp (cp, "dsa"))
                    327:                    goto name_or_something;
                    328:                if (w -> w_record != W_NULL)
                    329:                    goto too_many_fields;
                    330:                w -> w_record = W_DSA;
                    331:                break;
                    332:                
                    333:            case 'e':
                    334:                if (strcmp (cp, "expand"))
                    335:                    goto name_or_something;
                    336:                w -> w_output |= W_EXPAND;
                    337:                break;
                    338:                
                    339:            case 'f':
                    340:                if (strcmp (cp, "full") == 0) {
                    341:                    w -> w_output |= W_FULL;
                    342:                    break;
                    343:                }
                    344:                if (strcmp (cp, "fullname") == 0) {
                    345:                    w -> w_nametype = W_COMMONAME;
                    346:                    goto name;
                    347:                }
                    348:                goto name_or_something;
                    349:                
                    350:            case 'h':
                    351:                if (strcmp (cp, "handle"))
                    352:                    goto name_or_something;
                    353:                if (w -> w_inputype != W_NULL)
                    354:                    goto too_many_fields;
                    355:                if ((cp = *vec++) == NULL) {
                    356:                    advise (NULLCP, "expecting HANDLE after \"handle\"");
                    357:                    goto you_really_lose;
                    358:                }
                    359: got_handle: ;
                    360:                if (!mail && strcmp (cp, "me") == 0) {
                    361:                    if (mydn == NULL) {
                    362:                        advise (NULLCP,
                    363:                                "who are you?  use the \"thisis\" command first...");
                    364:                        return NOTOK;
                    365:                    }
                    366:                    cp = mydn;
                    367:                }
                    368:                w -> w_inputype = W_HANDLE;
                    369:                w -> w_input = cp;
                    370:                break;
                    371: 
                    372:            case 'l':
                    373:                if (strcmp (cp, "locality"))
                    374:                    goto name_or_something;
                    375:                if (w -> w_record != W_NULL)
                    376:                    goto too_many_fields;
                    377:                w -> w_record = W_LOCALITY;
                    378:                break;
                    379:                
                    380:            case 'm':
                    381:                if (strcmp (cp, "mailbox"))
                    382:                    goto name_or_something;
                    383:                if (w -> w_inputype != W_NULL)
                    384:                    goto too_many_fields;
                    385:                if ((cp = *vec++) == NULL) {
                    386:                    advise (NULLCP, "expecting MAILBOX after \"mailbox\"");
                    387:                    goto you_really_lose;
                    388:                }
                    389:                w -> w_inputype = W_MAILBOX;
                    390:                w -> w_input = cp;
                    391:                break;
                    392: 
                    393:            case 'n':
                    394:                if (strcmp (cp, "name"))
                    395:                    goto name_or_something;
                    396: name: ;
                    397:                if (w -> w_inputype != W_NULL)
                    398:                    goto too_many_fields;
                    399:                if ((cp = *vec++) == NULL) {
                    400:                    advise (NULLCP, "expecting NAME after \"%sname\"",
                    401:                            w -> w_nametype == W_COMMONAME ? "full"
                    402:                          : w -> w_nametype == W_SURNAME ? "sur" : "");
                    403:                    goto you_really_lose;
                    404:                }
                    405:                w -> w_inputype = W_NAME;
                    406:                w -> w_input = cp;
                    407:                break;
                    408: 
                    409:            case 'o':
                    410:                if (strcmp (cp, "organization") && strcmp (cp, "org"))
                    411:                    goto name_or_something;
                    412:                if (w -> w_record != W_NULL)
                    413:                    goto too_many_fields;
                    414:                w -> w_record = W_ORGANIZATION;
                    415:                break;
                    416:                
                    417:            case 'p':
                    418:                if (strcmp (cp, "person"))
                    419:                    goto name_or_something;
                    420:                if (w -> w_record != W_NULL)
                    421:                    goto too_many_fields;
                    422:                w -> w_record = W_PERSON;
                    423:                break;
                    424:                
                    425:            case 'r':
                    426:                if (strcmp (cp, "role"))
                    427:                    goto name_or_something;
                    428:                if (w -> w_record != W_NULL)
                    429:                    goto too_many_fields;
                    430:                w -> w_record = W_ROLE;
                    431:                break;
                    432:                
                    433:            case 's':
                    434:                if (strcmp (cp, "subdisplay") == 0) {
                    435:                    w -> w_output |= W_SUBDISPLAY;
                    436:                    break;
                    437:                }
                    438:                if (strcmp (cp, "summary") == 0) {
                    439:                    w -> w_output |= W_SUMMARY;
                    440:                    break;
                    441:                }
                    442:                if (strcmp (cp, "surname") == 0) {
                    443:                    w -> w_nametype = W_SURNAME;
                    444:                    goto name;
                    445:                }
                    446:                goto name_or_something;
                    447:                
                    448:            case 'u':
                    449:                if (strcmp (cp, "unit"))
                    450:                    goto name_or_something;
                    451:                if (w -> w_record != W_NULL)
                    452:                    goto too_many_fields;
                    453:                w -> w_record = W_UNIT;
                    454:                break;
                    455:                
                    456:            default:
                    457: name_or_something: ;
                    458:                if (w -> w_inputype != W_NULL)
                    459:                    goto too_many_fields;
                    460:                for (dp = cp; *dp; dp++)
                    461:                    if (!isdigit (*dp))
                    462:                        break;
                    463:                if (!*dp)
                    464:                    goto got_handle;
                    465:                if ((dp = index (cp, '@')) == NULL) {
                    466:                    w -> w_inputype = W_NAME;
                    467:                    w -> w_input = cp;
                    468:                    break;
                    469:                }
                    470:                if (index (dp + 1, '@') || index (dp + 1, '=')) {
                    471:                    w -> w_inputype = W_HANDLE;
                    472:                    w -> w_input = cp;
                    473:                    break;
                    474:                }
                    475:                w -> w_inputype = W_MAILBOX;
                    476:                w -> w_input = cp;
                    477:                break;
                    478:        }
                    479:     }
                    480: 
                    481:     if (w -> w_nametype != W_NULL)
                    482:        switch (w -> w_record) {
                    483:            default:
                    484:                advise (NULLCP, "record-type ignored with \"%sname\"",
                    485:                        w -> w_nametype == W_COMMONAME ? "full" : "sur");
                    486:                /* and fall... */
                    487: 
                    488:            case W_NULL:
                    489:                w -> w_record = W_PERSON;
                    490:                /* and fall... */
                    491: 
                    492:            case W_PERSON:
                    493:                break;
                    494:        }
                    495: 
                    496:     if (w -> w_input && strcmp (w -> w_input, "*") == 0)
                    497:        w -> w_input = NULL, w -> w_inputype = W_NULL;
                    498:     if (w -> w_title && strcmp (w -> w_title, "*") == 0)
                    499:        w -> w_title = NULL;
                    500:     if ((w -> w_input || w -> w_title)
                    501:            && w -> w_area
                    502:            && strcmp (w -> w_area, "*") == 0)
                    503:        w -> w_area = NULL, w -> w_areatype = W_NULL;
                    504: 
                    505:     if (w -> w_title) {
                    506:        if (w -> w_inputype == W_NULL)
                    507:            w -> w_inputype = W_NAME;
                    508:        if (w -> w_inputype != W_NAME) {
                    509:            advise (NULLCP, "title specification ignored with %s",
                    510:                    w -> w_inputype == W_HANDLE ? "HANDLE" : "MAILBOX");
                    511:            w -> w_title = NULL;
                    512:        }
                    513:        else
                    514:            if (w -> w_record == W_NULL)
                    515:                w -> w_record = W_PERSON;
                    516:     }
                    517: 
                    518:     if (w -> w_inputype == W_HANDLE && w -> w_geography) {
                    519:        advise (NULLCP, "geography specification ignored with HANDLE");
                    520:        w -> w_geography = NULL;
                    521:     }
                    522:     if (w -> w_geography)
                    523:        if (w -> w_area == NULL) {
                    524:            w -> w_area = w -> w_geography, w -> w_areatype = W_LOCALITY;
                    525:            w -> w_geography = NULL;
                    526:        }
                    527:        else
                    528:            if (*w -> w_geography == '!')
                    529:                w -> w_geography++;
                    530: 
                    531:     if (w -> w_inputype == W_HANDLE && w -> w_area) {
                    532:        advise (NULLCP, "area specification ignored with HANDLE");
                    533:        w -> w_area = NULL, w -> w_areatype = W_NULL;
                    534:     }
                    535:     if (w -> w_area)
                    536:        if (w -> w_inputype == W_NULL) {
                    537:            if (*w -> w_area != '!') {
                    538:                for (dp = w -> w_area; *dp; dp++)
                    539:                    if (!isdigit (*dp))
                    540:                        break;
                    541:                w -> w_inputype = *dp ? W_NAME : W_HANDLE,
                    542:                w -> w_input = w -> w_area;
                    543:            }
                    544:            else
                    545:                w -> w_inputype = W_HANDLE, w -> w_input = w -> w_area + 1;
                    546:            w -> w_record = w -> w_areatype;
                    547:            w -> w_area = NULL, w -> w_areatype = W_NULL;
                    548:        }
                    549:        else
                    550:            if (*w -> w_area == '!')
                    551:                w -> w_area++;
                    552: 
                    553:     if (w -> w_inputype == W_NULL) {
                    554:        register char **ap;
                    555: 
                    556:        if (w -> w_record != W_NULL || w -> w_output != W_NULL) {
                    557:             advise (NULLCP, "input-field missing");
                    558:             return NOTOK;
                    559:        }
                    560: 
                    561: print_help: ;
                    562:        for (ap = whois_help; *ap; ap++)
                    563:            fprintf (stdfp, "%s%s", *ap, EOLN);
                    564: 
                    565:        return OK;
                    566:     }
                    567:     else
                    568:        if (w -> w_inputype == W_NAME && w -> w_nametype == W_NULL)
                    569:            w -> w_nametype = nametype ? W_SURNAME : W_COMMONAME;
                    570: 
                    571:     (void) sprintf (fredseq, "fred%d", seqno++);
                    572: 
                    573:     bp = buffer;
                    574: 
                    575:     if (w -> w_areatype == W_NULL) {
                    576:        if (w -> w_inputype == W_MAILBOX
                    577:                && w -> w_area == NULL
                    578:                && (cp = index (w -> w_input, '@'))
                    579:                && !index (++cp, '*')) {
                    580:            (void) sprintf (bp, "fred -dm2dn %s", cp);
                    581:            bp += strlen (bp);
                    582: 
                    583:            goto multiple_searching;
                    584:        }
                    585: 
                    586:        result = whois_aux (w);
                    587:        if (ifd == NOTOK)
                    588:            return result;
                    589:        goto check_wp;
                    590:     }
                    591: 
                    592:     (void) sprintf (bp,
                    593:                    "search %s -norelative -singlelevel -dontdereference -sequence default -types aliasedObjectName -value -nosearchalias ",
                    594:                    limits (-1));
                    595:     bp += strlen (bp);
                    596: 
                    597:     for (ag = areas; ag -> ag_record; ag++)
                    598:        if (ag -> ag_record == w -> w_areatype)
                    599:            break;
                    600:     if (w -> w_geography) {
                    601:        (void) sprintf (bp, "\"%s\" ", w -> w_geography);
                    602:        bp += strlen (bp);
                    603: 
                    604:        w -> w_geography = NULL;
                    605:     }
                    606:     else
                    607:        if (ag -> ag_area) {
                    608:            (void) sprintf (bp, "\"%s\" ", ag -> ag_area);
                    609:            bp += strlen (bp);
                    610:        }
                    611: 
                    612:     (void) sprintf (bp, "-filter \"objectClass=%s & %s%s\"",
                    613:                    ag -> ag_class, ag -> ag_rdn, eqstr (w -> w_area, 0));
                    614:     bp += strlen (bp);
                    615: 
                    616: multiple_searching: ;
                    617:     if ((fp = capture (buffer)) == NULL)
                    618:        return NOTOK;
                    619: 
                    620:     if (interrupted) {
                    621: you_lose: ;
                    622:        (void) fclose (fp);
                    623:        return NOTOK;
                    624:     }
                    625: 
                    626:     w -> w_area = orgname, w -> w_areatype = W_NULL;
                    627: 
                    628:     multiple = 0;
                    629:     while (fgets (buffer, sizeof buffer, fp) && !interrupted) {
                    630:        if ((cp = index (buffer, '\n')) == NULL) {
                    631:            advise (NULLCP, "internal error(1)");
                    632:            goto you_lose;
                    633:        }
                    634:        *cp = NULL;
                    635:     
                    636:        if (!isdigit (*buffer)) {
                    637:            fprintf (stderr, "%s\n", buffer);
                    638:            continue;
                    639:        }
                    640: 
                    641:        if ((cp = index (buffer, ' ')) == NULL) {
                    642:            advise (NULLCP, "internal error(2)");
                    643:            goto you_lose;
                    644:        }
                    645:        *cp++ = NULL;
                    646:        while (*cp == ' ')
                    647:            cp++;
                    648:        
                    649:        if (multiple == 0 && (c = getc (fp)) != EOF) {
                    650:            (void) ungetc (c, fp);
                    651:            multiple = 1;
                    652:        }
                    653: 
                    654:        if (multiple && query && !network)
                    655:            switch (ask ("try %s", cp)) {
                    656:                case NOTOK:
                    657:                    continue;
                    658: 
                    659:               case OK:
                    660:               default:
                    661:                    break;
                    662: 
                    663:               case DONE:
                    664:                    goto out;
                    665:            }
                    666:        else
                    667:            if (verbose) {
                    668:                fprintf (stdfp, "Trying @%s ...\n", cp);
                    669:                (void) fflush (stdfp);
                    670:            }
                    671: 
                    672:        (void) sprintf (orgname, "@%s", cp);
                    673:        (void) whois_aux (w);
                    674: 
                    675:        fprintf (stdfp, EOLN);
                    676:        (void) fflush (stdfp);
                    677:     }
                    678: 
                    679: out: ;
                    680:     (void) fclose (fp);
                    681: 
                    682:     if (ifd == NOTOK)
                    683:        return OK;
                    684: 
                    685: check_wp: ;
                    686:     (void) sprintf (buffer, "squid -sequence %s", fredseq);
                    687: 
                    688:     if ((fp = capture (buffer)) == NULL)
                    689:        return NOTOK;
                    690: 
                    691:     didany = 0;
                    692:     while (fgets (buffer, sizeof buffer, fp)) {
                    693:        char    disher[BUFSIZ];
                    694: 
                    695:        if ((cp = index (buffer, '\n')) == NULL) {
                    696:            advise (NULLCP, "internal error(3)");
                    697:            goto you_lose;
                    698:        }
                    699:        *cp = NULL;
                    700:     
                    701:        if (strncmp (buffer, "Sequence ", sizeof "Sequence " - 1) == 0)
                    702:            continue;
                    703: 
                    704:        if ((cp = index (buffer, ' ')) == NULL) {
                    705:            advise (NULLCP, "internal error(4)");
                    706:            goto you_lose;
                    707:        }
                    708:        *cp++ = NULL;
                    709:        while (*cp == ' ')
                    710:            cp++;
                    711:        
                    712:        if (!didany++) {
                    713:            fprintf (stdfp, "-------\n\n");
                    714: 
                    715:            if ((c = getc (fp)) != EOF) {
                    716:                (void) ungetc (c, fp);
                    717:                fprintf (stdfp, "Select one of:\n\n");
                    718:            }
                    719:            else
                    720:                fprintf (stdfp, "One entry matched:\n\n");
                    721: 
                    722:            (void) strcpy (onehit, buffer);
                    723:        }
                    724: 
                    725:        (void) sprintf (disher,
                    726:                        "showentry \"%s\" -fred -dontdereference -summary",
                    727:                        cp);
                    728:        dontpage = 1;
                    729:        (void) dish (disher, 0);
                    730:        dontpage = 0;
                    731: 
                    732:        fprintf (stdfp, "     %s\n\n", cp);
                    733:        (void) fflush (stdfp);
                    734:     }
                    735:     (void) fclose (fp);
                    736: 
                    737:     if (!didany) {
                    738:        fprintf (stdfp,
                    739:                 "\nenter new \"whois\" command to continue searching (or \"quit\" to abort)\n");
                    740:        return OK;
                    741:     }
                    742: 
                    743:     if (didany == 1) {
                    744:        if (getline ("enter RETURN to use this entry (or \"no\" to look some more): ",
                    745:                     buffer) == NOTOK
                    746:                || (str2vec (buffer, args) > 0 && *args[0] != 'y'))
                    747:            return OK;
                    748:        args[0] = onehit;
                    749:     }
                    750:     else
                    751:        if (getline ("enter number (or RETURN to look some more): ", buffer)
                    752:                    == NOTOK
                    753:                || str2vec (buffer, args) < 1)
                    754:            return OK;
                    755: 
                    756:     if (sscanf (args[0], "%d", &result) != 1) {
                    757:        advise (NULLCP, "invalid number \"%s\"", args[0]);
                    758:        return OK;
                    759:     }
                    760: 
                    761:     (void) sprintf (buffer, "show -sequence %s %d -types rfc822Mailbox -value",
                    762:                    fredseq, result);
                    763: 
                    764:     if ((fp = capture (buffer)) == NULL)
                    765:        return NOTOK;
                    766: 
                    767:     if (fgets (buffer, sizeof buffer, fp) == NULL
                    768:            || (cp = index (buffer, '\n')) == NULL) {
                    769:        advise (NULLCP, "internal error(5)");
                    770:        goto you_lose;
                    771:     }
                    772:     (void) fclose (fp);
                    773: 
                    774:     if (strncmp (buffer, "Invalid sequence number",
                    775:                 sizeof "Invalid sequence number" - 1) == 0) {
                    776:        advise (NULLCP, "invalid selection \"%d\"", result);
                    777:        return OK;
                    778:     }
                    779:     if (strncmp (buffer, "No attributes", sizeof "No attributes" - 1) == 0) {
                    780:        advise (NULLCP, "no rfc822Mailbox attribute for this entry!");
                    781:        return OK;
                    782:     }
                    783:     if (strncmp (buffer, "rfc822Mailbox", sizeof "rfc822Mailbox" - 1) == 0) {
                    784:        if ((cp = index (buffer, '-')) == NULL) {
                    785:            advise (NULLCP, "internal error(6)");
                    786:            return NOTOK;
                    787:        }
                    788:        for (cp++; isspace (*cp); cp++)
                    789:            continue;
                    790:        if (verbose)
                    791:            fprintf (stdfp, "using %s\n", cp);
                    792:        result = strlen (cp);
                    793: 
                    794:        if (write (ofd, cp, result) != result)
                    795:            adios ("failed", "write to UA");
                    796: 
                    797:        istat = signal (SIGINT, SIG_IGN);
                    798:        qstat = signal (SIGQUIT, SIG_IGN);
                    799: 
                    800:        if (watch) {
                    801:            fprintf (stderr, "---> %s", cp);
                    802:            (void) fflush (stderr);
                    803:        }
                    804: 
                    805:        usetty = 0;
                    806: 
                    807:        return OK;
                    808:     }
                    809: 
                    810:     advise (NULLCP, "internal error(7): \"%s\"", buffer);
                    811:     return NOTOK;
                    812: }
                    813:     
                    814: /*  */
                    815: 
                    816: static whois_aux (w)
                    817: register struct whois *w;
                    818: {
                    819:     register char *bp,
                    820:                  *cp;
                    821:     char   *handle,
                    822:            buffer[BUFSIZ];
                    823:     register struct area_guide *ag;
                    824: 
                    825:     for (ag = areas; ag -> ag_record; ag++)
                    826:        if (ag -> ag_record == w -> w_record)
                    827:            break;
                    828: 
                    829:     bp = buffer;
                    830:     switch (w -> w_inputype) {
                    831:        case W_NULL:
                    832:        default:
                    833:            advise (NULLCP, "internal error(8)");
                    834:            return NOTOK;
                    835: 
                    836:        case W_HANDLE:
                    837:            (void) sprintf (bp, "showentry \"%s\" %s -fred -dontdereference",
                    838:                            w -> w_input, limits (0));
                    839:            bp += strlen (bp);
                    840:            goto options;
                    841: 
                    842:        case W_MAILBOX:
                    843:            (void) sprintf (bp, "search %s -fred ", limits (1));
                    844:            bp += strlen (bp);
                    845: 
                    846:            if (w -> w_area) {
                    847:                (void) sprintf (bp, "\"%s\" ", w -> w_area);
                    848:                bp += strlen (bp);
                    849:            }
                    850: 
                    851:            (void) sprintf (bp, "-subtree -filter \"");
                    852:            bp += strlen (bp);
                    853: 
                    854:            cp = w -> w_input;
                    855:            if (*cp == '@')
                    856:                (void) sprintf (bp, "mail=*%s", cp);
                    857:            else
                    858:                if (*(cp + strlen (cp) - 1) == '@' || !index (cp, '@'))
                    859:                    (void) sprintf (bp, "mail=%s*", cp);
                    860:                else
                    861:                    (void) sprintf (bp, "(mail=%s | otherMailbox=internet$%s)",
                    862:                                    cp, cp);
                    863:            bp += strlen (bp);
                    864:            break;
                    865: 
                    866:        case W_NAME:
                    867:            if (cp = w -> w_input) {
                    868:                cp += strlen (cp) - 1;
                    869:                if (*cp == '.')
                    870:                    *cp = '*';
                    871:            }
                    872: 
                    873:            (void) sprintf (bp, "search %s -%s ", limits (1),
                    874:                            kflag ? "show" : "fred");
                    875:            bp += strlen (bp);
                    876: 
                    877:            if (w -> w_area) {
                    878:                (void) sprintf (bp, "\"%s\" -subtree ", w -> w_area);
                    879:                bp += strlen (bp);
                    880:            }
                    881:            else
                    882:                if (w -> w_geography) {
                    883:                    (void) sprintf (bp, "\"%s\" ", w -> w_geography);
                    884:                    bp += strlen (bp);
                    885:                }
                    886:                else
                    887:                    if (ag -> ag_area) {
                    888:                        (void) sprintf (bp, "\"%s\" %s ", ag -> ag_area,
                    889:                                        ag -> ag_search);
                    890:                        bp += strlen (bp);
                    891:                    }
                    892:                    else {
                    893:                        (void) sprintf (bp, "-subtree ");
                    894:                        bp += strlen (bp);
                    895:                    }
                    896:            (void) sprintf (bp, "-filter \"");
                    897:            bp += strlen (bp);
                    898: 
                    899:            handle = eqstr (w -> w_input, 0);
                    900:            switch (w -> w_record) {
                    901:                case W_NULL:
                    902:                case W_PERSON:
                    903:                    if (handle) {
                    904:                        if (w -> w_title
                    905:                                && (w -> w_record == W_NULL
                    906:                                    || w -> w_nametype == W_SURNAME)) {
                    907:                            (void) sprintf (bp, "( ");
                    908:                            bp += strlen (bp);
                    909:                        }
                    910:                        if (w -> w_record == W_NULL) {
                    911:                            (void) sprintf (bp, "o%s | ou%s | l%s | ",
                    912:                                            handle, handle, handle, handle);
                    913:                            bp += strlen (bp);
                    914:                        }
                    915: 
                    916:                        if (w -> w_nametype == W_SURNAME) {
                    917:                            if (w -> w_record == W_PERSON && !w -> w_title) {
                    918:                                (void) sprintf (bp, "( ");
                    919:                                bp += strlen (bp);
                    920:                            }
                    921:                            (void) sprintf (bp, "surname%s | mail=%s@* ",
                    922:                                            eqstr (w -> w_input, 1),
                    923:                                            w -> w_input);
                    924:                            bp += strlen (bp);
                    925:                            if (w -> w_record == W_PERSON && !w -> w_title) {
                    926:                                (void) sprintf (bp, ") ");
                    927:                                bp += strlen (bp);
                    928:                            }
                    929:                        }
                    930:                        else {
                    931:                            (void) sprintf (bp, "cn%s ", handle);
                    932:                            bp += strlen (bp);
                    933:                        }
                    934: 
                    935:                        if (w -> w_title
                    936:                                && (w -> w_record == W_NULL
                    937:                                    || w -> w_nametype == W_SURNAME)) {
                    938:                            (void) sprintf (bp, ") ");
                    939:                            bp += strlen (bp);
                    940:                        }
                    941:                    }
                    942:                    if (w -> w_title) {
                    943:                        (void) sprintf (bp, "%stitle%s",
                    944:                                        handle ? "& " : "",
                    945:                                        eqstr (w -> w_title, 1));
                    946:                        bp += strlen (bp);
                    947:                    }
                    948:                    break;
                    949: 
                    950:                default:
                    951:                    if (strcmp (handle, "=*")) {
                    952:                        (void) sprintf (bp, "%s%s", ag -> ag_rdn, handle);
                    953:                        bp += strlen (bp);
                    954:                    }
                    955:                    break;
                    956:            }
                    957:            break;
                    958:     }
                    959: 
                    960:     if (w -> w_record == W_PERSON
                    961:            || (w -> w_record != W_NULL && strcmp (handle, "=*"))) {
                    962:        (void) sprintf (bp, " & ");
                    963:        bp += strlen (bp);
                    964:     }
                    965: 
                    966:     if (w -> w_record != W_NULL) {
                    967:        (void) sprintf (bp, "objectClass=%s", ag -> ag_class);
                    968:        bp += strlen (bp);
                    969:     }
                    970: 
                    971:     (void) sprintf (bp, "\"");
                    972:     bp += strlen (bp);
                    973:     
                    974: options: ;
                    975:     if (w -> w_output & W_EXPAND) {
                    976:        (void) sprintf (bp, " -expand");
                    977:        bp += strlen (bp);
                    978:     }
                    979:     if (w -> w_output & W_FULL) {
                    980:        (void) sprintf (bp, " -full");
                    981:        bp += strlen (bp);
                    982:     }
                    983:     if (w -> w_output & W_SUMMARY) {
                    984:        (void) sprintf (bp, " -summary");
                    985:        bp += strlen (bp);
                    986:     }
                    987:     if (w -> w_output & W_SUBDISPLAY) {
                    988:        (void) sprintf (bp, " -subdisplay");
                    989:        bp += strlen (bp);
                    990:     }
                    991: 
                    992:     (void) sprintf (bp, " -sequence %s", ifd != NOTOK ? fredseq : "default");
                    993:     bp += strlen (bp);
                    994: 
                    995:     return dish (buffer, 0);
                    996: }
                    997: 
                    998: /*  */
                    999: 
                   1000: static int  test_arg (user, full, minlen)
                   1001: char   *user,
                   1002:        *full;
                   1003: int    minlen;
                   1004: {
                   1005:     int            i;
                   1006: 
                   1007:     if ((i = strlen (user)) < minlen
                   1008:            || i > strlen (full)
                   1009:            || strncmp (user, full, i))
                   1010:        return 0;
                   1011: 
                   1012:     return 1;
                   1013: }
                   1014: 
                   1015: /*  */
                   1016: 
                   1017: static char *eqstr (s, exact)
                   1018: char   *s;
                   1019: int    exact;
                   1020: {
                   1021:     static char buffer[BUFSIZ];
                   1022: 
                   1023:     if (s == NULL)
                   1024:        return NULL;
                   1025: 
                   1026:     if (index (s, '*'))
                   1027:        (void) sprintf (buffer, "=%s", s);
                   1028:     else
                   1029:        if (soundex)
                   1030:            (void) sprintf (buffer, "~=%s", s);
                   1031:        else
                   1032:            if (exact)
                   1033:                (void) sprintf (buffer, "=%s", s);
                   1034:            else
                   1035:                (void) sprintf (buffer, "=*%s*", s);
                   1036: 
                   1037:     return buffer;
                   1038: }
                   1039: 
                   1040: /*  */
                   1041: 
                   1042: static char  *limits (isearch)
                   1043: int    isearch;
                   1044: {
                   1045:     register char *bp;
                   1046:     static char buffer[100];
                   1047: 
                   1048:     bp = buffer;
                   1049: 
                   1050:     if (phone) {
                   1051:        (void) strcpy (bp, "-phone ");
                   1052:        bp += strlen (bp);
                   1053:     }
                   1054: 
                   1055: #ifdef notdef  /* don't do this! */
                   1056:     if (isearch) {
                   1057:        (void) strcpy (bp, "-searchalias ");
                   1058:        bp += strlen (bp);
                   1059:     }
                   1060: #endif
                   1061: 
                   1062:     (void) strcpy (bp, "-nosizelimit ");
                   1063:     bp += strlen (bp);
                   1064: 
                   1065:     if (timelimit > 0)
                   1066:        (void) sprintf (bp, "-timelimit %d", timelimit);
                   1067:     else
                   1068:        (void) strcpy (bp, "-notimelimit");
                   1069:     bp += strlen (bp);
                   1070: 
                   1071:     if (isearch >= 0 && (network || oneshot)) {
                   1072:        (void) strcpy (bp, " -nofredseq");
                   1073:        bp += strlen (bp);
                   1074:     }
                   1075: 
                   1076:     return buffer;
                   1077: }
                   1078: 
                   1079: /*  */
                   1080: 
                   1081: static FILE *capture (command)
                   1082: char   *command;
                   1083: {
                   1084:     int            savnet,
                   1085:            savpage;
                   1086:     char    tmpfil[BUFSIZ];
                   1087:     FILE   *fp,
                   1088:           *savfp;
                   1089: 
                   1090:     (void) sprintf (tmpfil, "/tmp/fredXXXXXX");
                   1091:     (void) unlink (mktemp (tmpfil));
                   1092:     
                   1093:     if ((fp = fopen (tmpfil, "w+")) == NULL) {
                   1094:        advise (tmpfil, "unable to create");
                   1095:        return NULL;
                   1096:     }
                   1097:     (void) unlink (tmpfil);
                   1098: 
                   1099:     savfp = stdfp, stdfp = fp;
                   1100:     savnet = network, network = 0;
                   1101:     savpage = dontpage, dontpage = 1;
                   1102:     
                   1103:     (void) dish (command, 0);
                   1104: 
                   1105:     dontpage = savpage;
                   1106:     network = savnet;
                   1107:     stdfp = savfp;
                   1108: 
                   1109:     rewind (fp);
                   1110: 
                   1111:     return fp;
                   1112: }
                   1113: 
                   1114: /*  */
                   1115: 
                   1116: static int  f_ufn (vec)
                   1117: char  **vec;
                   1118: {
                   1119:     register char *dp;
                   1120:     char   *cp,
                   1121:            buffer[BUFSIZ];
                   1122:     static int lastq = -1;
                   1123: 
                   1124:     if ((cp = vec[0]) == NULL || strcmp (cp, "-help") == 0) {
                   1125: help: ;
                   1126:         fprintf (stdfp, "whois name...\n");
                   1127:        fprintf (stdfp, "    find something in the white pages\n");
                   1128: 
                   1129:         return OK;
                   1130:     }
                   1131:     
                   1132:     if (*(dp = cp) == '!')
                   1133:        dp++;
                   1134:     for (; *dp; dp++)
                   1135:        if (!isdigit (*dp))
                   1136:            break;
                   1137:     if (!*dp || *dp == '-') {                  /* a handle, or oldstyle */
                   1138: oldstyle: ;
                   1139:        (void) strcpy (buffer, cp);
                   1140:        (void) str2vec (buffer, vec);
                   1141:        return f_whois_aux (vec);
                   1142:     }
                   1143: 
                   1144:     if (!index (dp = cp, ','))
                   1145:        while (dp = index (dp, ' '))
                   1146:            if (*++dp == '-')
                   1147:                goto oldstyle;
                   1148: 
                   1149:     (void) sprintf (buffer, "fred -ufn %s", cp);
                   1150: 
                   1151:     if (lastq != area_quantum) {
                   1152:        FILE    *fp;
                   1153: 
                   1154:        if (fp = fopen (ufn_file, "w")) {
                   1155:            register struct area_guide *ag;
                   1156: 
                   1157:            for (ag = areas; ag -> ag_record; ag++)
                   1158:                if (ag -> ag_record == W_ORGANIZATION)
                   1159:                    break;
                   1160: 
                   1161:            fprintf (fp, "1:\t%s\n", myarea + 1);
                   1162:            if (ag -> ag_record)
                   1163:                fprintf (fp, "\t%s\n", ag -> ag_area + 1);
                   1164:            fprintf (fp, "\t-\n");
                   1165: 
                   1166:            fprintf (fp, "2:");
                   1167:            if (ag -> ag_record)
                   1168:                fprintf (fp, "\t%s\n", ag -> ag_area + 1);
                   1169:            fprintf (fp, "\t%s\n", myarea + 1);
                   1170:            fprintf (fp, "\t-\n");
                   1171: 
                   1172:            fprintf (fp, "3,+:\t-\n");
                   1173:            if (ag -> ag_record)
                   1174:                fprintf (fp, "\t%s\n", ag -> ag_area + 1);
                   1175:            fprintf (fp, "\t%s\n", myarea + 1);
                   1176: 
                   1177:            (void) fclose (fp);
                   1178: 
                   1179:            lastq = area_quantum;
                   1180:        }
                   1181:     }
                   1182: 
                   1183:     return dish (buffer, 0);
                   1184: }

unix.superglobalmegacorp.com

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