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