|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.