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 + -
显示快捷键?