fred.c
来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 983 行 · 第 1/2 页
C
983 行
/* fred.c - FRont-End to Dish */#ifndef lintstatic char *rcsid = "$Header: /xtel/isode/isode/others/quipu/uips/fred/RCS/fred.c,v 9.0 1992/06/16 12:44:30 isode Rel $";#endif/* * $Header: /xtel/isode/isode/others/quipu/uips/fred/RCS/fred.c,v 9.0 1992/06/16 12:44:30 isode Rel $ * * * $Log: fred.c,v $ * Revision 9.0 1992/06/16 12:44:30 isode * Release 8.0 * *//* * NOTICE * * Acquisition, use, and distribution of this module and related * materials are subject to the restrictions of a license agreement. * Consult the Preface in the User's Manual for the full terms of * this agreement. * */#include <ctype.h>#include <setjmp.h>#include <signal.h>#include <varargs.h>#include "fred.h"#include "internet.h"#include "sys.file.h"#ifndef R_OK#define R_OK 4#endif/* DATA */static char *myname = "fred";static char **op = NULLVP;static int alarming = 0;static int logging = 0;static int ontty;static int armed;static jmp_buf alrmenv;static jmp_buf intrenv;int interrupted;int oneshot;SFP astat;SFP istat;SFP qstat;SFD alrmser ();SFD intrser ();LLog _fred_log = { "fred.log", NULLCP, NULLCP, LLOG_FATAL | LLOG_EXCEPTIONS | LLOG_NOTICE, LLOG_NONE, -1, LLOGCLS | LLOGCRT | LLOGZER, NOTOK};LLog *fred_log = &_fred_log;static char *from = NULL;static char *reply_to = NULL;static char *sender = NULL;static char *subject = NULL;static struct pair { char *p_name; char **p_value;} pairs[] = { "From:", &from, "Reply-To:", &reply_to, "Sender:", &sender, "Subject:", &subject, NULL, NULL};static arginit ();static int fetchline ();static rcmap ();static log_utmp ();/* MAIN *//* ARGSUSED */main (argc, argv, envp)int argc;char **argv, **envp;{ int eof, status, vecp; register char *cp; char address[BUFSIZ], buffer[BUFSIZ], *vec[NVEC + 1]; struct sockaddr_in in_socket, *isock = &in_socket; arginit (argv); rcinit (); rcfile (isodefile ("fredrc", 0), 0, 1); if (init_ufnrc () == OK) area_quantum = -1; status = 0; if (mail) { register int c; register char *ep; register struct pair *p; FILE *fp; for (;;) { ep = (cp = buffer) + sizeof buffer - 1; while ((c = getc (stdin)) != EOF) if (c == '\n') { if ((c = getc (stdin)) == ' ' || c == '\t') { *cp++ = ' '; while ((c = getc (stdin)) == ' ' || c == '\t') continue; if (c != EOF) (void) ungetc (c, stdin); else { c = NULL; break; } } else { if (c == EOF) c = NULL; else (void) ungetc (c, stdin); break; } } else if (cp < ep) *cp++ = c != '\t' ? c & 0xff : ' '; if (cp == buffer) break; *cp = NULL; for (p = pairs; p -> p_name; p++) if (lexnequ (buffer, p -> p_name, c = strlen (p -> p_name)) == 0) { if (*p -> p_value == NULL) { for (cp = buffer + c; *cp == ' ' || *cp == '\t'; cp++) continue; if (*cp) { ep = cp + strlen (cp) - 1; while (*ep == ' ') ep--; *++ep = NULL; *p -> p_value = strdup (cp); } } break; } } if (!from && !reply_to && !sender) adios (NULLCP, "unable to determine return address"); (void) sprintf (buffer, "/bin/mail \"%s\"", ep = reply_to ? reply_to : from ? from : sender); if (watch) { (void) fprintf (stderr, "%s\n", buffer); (void) fflush (stderr); } (void) signal (SIGPIPE, SIG_IGN); if ((fp = popen (buffer, "w")) == NULL) adios ("failed", "popen"); stdfp = errfp = fp; (void) fprintf (stdfp, "To: %s\nSubject: Re: %s\n\n", ep, subject ? subject : "white pages query"); (void) fflush (stdfp); if (f_bind (NULLVP) == NOTOK) adios (NULLCP, "unable to open the white pages"); if (subject) { (void) strcpy (buffer, subject); (void) ll_log (fred_log, LLOG_NOTICE, NULLCP, "%s asks: %s", ep, buffer); bzero ((char *) vec, sizeof vec); if (str2vecY (buffer, vec) < 1) (void) f_help (NULLVP); else if (fredloop (vec, NOTOK) != OK) status = 1; } else { int didone = 0; while ((c = getc (stdin)) != EOF) if (c != ' ' || c != '\t' || c != '\n') break; if (c != EOF) while (fgets (buffer, sizeof buffer, stdin)) { if (cp = index (buffer, '\n')) *cp = NULL; if (buffer[0] == NULL) break; (void) ll_log (fred_log, LLOG_NOTICE, NULLCP, "%s asks: %s", ep, buffer); (void) fprintf (stdfp, "%s>>> %s\n", didone ? "\n\n" : "", buffer); bzero ((char *) vec, sizeof vec); if (str2vecY (buffer, vec) < 1) break; if (fredloop (vec, NOTOK) != OK) { status = 1; break; } didone = 1; } if (!didone) (void) f_help (NULLVP); } (void) fclose (fp); stdfp = stdout; goto were_out_of_here; } if (network) { int len; if (getpeername (fileno (stdin), (struct sockaddr *) isock, (len = sizeof *isock, &len)) != NOTOK) { (void) sprintf (address, "%s/%d", inet_ntoa (isock -> sin_addr), ntohs (isock -> sin_port)); rcmap (isock); } else { (void) ll_log (fred_log, LLOG_EXCEPTIONS, "failed", "getpeername"); (void) strcpy (address, "peer"); } } else { register struct hostent *hp; (void) strcpy (address, getlocalhost ()); if (hp = gethostbystring (address)) { bzero ((char *) isock, sizeof *isock); isock -> sin_family = hp -> h_addrtype; inaddr_copy (hp, isock); rcmap (isock); } else advise (NULLCP, "%s: unknown host", address); } if (!fflag) { (void) sprintf (buffer, "%s/.fredrc", myhome); rcfile (buffer, op ? 1 : 0, 0); } if (f_bind (NULLVP) == NOTOK) adios (NULLCP, "unable to open the white pages"); if (network) { errfp = stdout; (void) strcpy (buffer, "whois "); switch (fetchline (buffer + (sizeof "whois " - 1), sizeof buffer - (sizeof "whois " - 1), stdin)) { case NOTOK: adios (NULLCP, "error reading query from %s", address); /* NOTREACHED */ case DONE: buffer[0] = NULL; /* and fall... */ case OK: default: break; } if (cp = index (buffer, '\r')) *cp = NULL; if (cp = index (buffer, '\n')) *cp = NULL; (void) ll_log (fred_log, LLOG_NOTICE, NULLCP, "%s asks: %s", address, buffer); bzero ((char *) vec, sizeof vec); if (str2vecY (buffer, vec) < 2) (void) f_help (NULLVP); else if (fredloop (vec, NOTOK) != OK) status = 1; goto were_out_of_here; } if (op) { vecp = 0; if (nametype > 1 && (strcmp (myname, "whois") == 0 || (*op && **op == 'w'))) { register char **pp; char *bp = ""; if (strcmp (myname, "whois") && *op) op++; for (pp = op; *pp; pp++) if (!test_ufn (*pp)) { bp = "\""; break; } for (cp = buffer; *op; cp += strlen (cp)) (void) sprintf (cp, " %s%s%s", bp, *op++, bp); vec[vecp++] = "whois"; vec[vecp++] = buffer; } else { if (strcmp (myname, "whois") == 0) vec[vecp++] = myname; while (*op) vec[vecp++] = *op++; } vec[vecp] = NULL; if (fredloop (vec, NOTOK) != NOTOK) status = 1; goto were_out_of_here; } istat = signal (SIGINT, intrser); eof = 0; for (interrupted = 0;; interrupted = 0) { if (alarming) { astat = signal (SIGALRM, alrmser); switch (setjmp (alrmenv)) { case OK: (void) alarm ((unsigned) 300); break; default: adios (NULLCP, "timed out due to inactivity"); } } if (getline ("%s> ", buffer) == NOTOK) { if (eof) break; eof = 1; continue; } eof = 0; if (alarming) (void) alarm ((unsigned) 0); if (logging) (void) ll_log (fred_log, LLOG_NOTICE, NULLCP, "command: %s", buffer); bzero ((char *) vec, sizeof vec); if ((vecp = str2vecY (buffer, vec)) < 1) continue; switch (fredloop (vec, OK)) { case NOTOK: status = 1; break; case OK: default: continue; case DONE: status = 0; break; } break; } (void) signal (SIGINT, istat);were_out_of_here: ; (void) f_quit (NULLVP); exit (mail ? 0 : status); /* NOTREACHED */}/* ARGINIT */static arginit (vec)char **vec;{ register char *ap; if (myname = rindex (*vec, '/')) myname++; if (myname == NULL || *myname == NULL) myname = *vec; if (strcmp (myname, "in.whitepages") == 0) network++, fflag++; isodetailor (myname, 1); ll_hdinit (fred_log, myname); if (ontty = isatty (fileno (stdin))) verbose++; oneshot = 0; for (vec++; ap = *vec; vec++) { if (*ap == '-') { while (*++ap) switch (*ap) { case 'a': alarming++; break; case 'd': debug++; break; case 'm': mail++; /* and fall... */ case 'n': network++; /* and fall... */ case 'f': fflag++; break; case 'k': kflag++; break; case 'l': logging++; break; case 'r': readonly++; pager = "internal"; break; case 'v': verbose = 1; break; case 'w':
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?