fred.c

来自「ftam等标准协议服务器和客户端的源代码。」· C语言 代码 · 共 983 行 · 第 1/2 页

C
983
字号
		        watch++;			break;		    default:			adios (NULLCP, "unknown switch -%c", *ap);		}	    continue;	}	if (op == NULL) {	    op = vec;	    oneshot = 1;	    break;	}    }    if (debug)	ll_dbinit (fred_log, myname);    if (logging)	log_utmp ();}/*    INTERACTIVE */int	getline (prompt, buffer)char   *prompt,       *buffer;{    register int    i;    register char  *cp,                   *ep;    static int  sticky = 0;    if (interrupted) {	interrupted = 0;	return NOTOK;    }    if (sticky) {	sticky = 0;	return NOTOK;    }    switch (setjmp (intrenv)) {	case OK:	    armed++;	    break;	case NOTOK:	    if (ontty)		(void) printf ("\n");	/* and fall */	default:	    armed = 0;	    return NOTOK;    }	    if (ontty) {	(void) printf (prompt, myname);	(void) fflush (stdout);    }    for (ep = (cp = buffer) + BUFSIZ - 1; (i = getchar ()) != '\n';) {	if (i == EOF) {	    if (ontty)		(void) printf ("\n");	    clearerr (stdin);	    if (cp == buffer)		longjmp (intrenv, DONE);	    sticky++;	    break;	}	if (cp < ep)	    *cp++ = i;    }    *cp = NULL;    armed = 0;        return OK;}/*  */#ifndef	IAC#define	IAC	255#endifstatic int  fetchline (s, n, iop)register char  *s;register int	n;register FILE  *iop;{    register int    c;    register char  *p;    p = s;    while (--n > 0 && (c = getc (iop)) != EOF) {	while (c == IAC) {	    (void) getc (iop);	    c = getc (iop);	}	if ((*p++ = c) == '\n')	    break;    }    if (ferror (iop))	return NOTOK;    if (c == EOF && p == s)	return DONE;    *p++ = NULL;    return OK;}/*  *//* ARGSUSED */static	SFD alrmser (sig)int	sig;{#ifndef	BSDSIGS    (void) signal (SIGALRM, alrmser);#endif    longjmp (alrmenv, NOTOK);}/*  *//* ARGSUSED */static	SFD intrser (sig)int	sig;{#ifndef	BSDSIGS    (void) signal (SIGINT, intrser);#endif    if (armed)	longjmp (intrenv, NOTOK);    interrupted++;}/*  */#ifndef	lintint	ask (va_alist)va_dcl{    int     x,            y,            result;    char    buffer[BUFSIZ];    va_list ap;    if (interrupted) {	interrupted = 0;	return DONE;    }    if (!ontty)	return OK;    switch (setjmp (intrenv)) {	case OK: 	    armed++;	    break;	case NOTOK: 	default: 	    (void) printf ("\n");	    armed = 0;	    return DONE;    }    va_start (ap);    _asprintf (buffer, NULLCP, ap);    va_end (ap);    again: ;    (void) printf ("%s", buffer);    x = y = getchar ();    while (y != '\n' && y != EOF)	y = getchar ();    switch (x) {	case 'y': 	case '\n':	    result = OK;	    break;	case 'n': 	    result = NOTOK;	    break;	case EOF: 	    clearerr (stdin);	    result = DONE;	    break;	default: 	    goto again;    }    armed = 0;    return result;}#else/* VARARGS */int	ask (fmt)char   *fmt;{    return ask (fmt);}#endif/*  */int	str2vecY (buffer, vec)char   *buffer,      **vec;{    int	    i;    register char *cp,		  *dp;    if (nametype <= 1) {normal: ;        return str2vec (buffer, vec);    }    for (cp = buffer; isspace (*cp); cp++)	continue;    for (dp = cp++; !isspace (*cp); cp++)	if (!*cp)	    goto normal;    *cp = NULL;    if ((i = strlen (dp)) > 5 || strncmp ("whois", dp, i)) {	*cp = ' ';	goto normal;    }    vec[0] = dp;    vec[1] = ++cp;    vec[2] = NULL;    return 2;}/*    MAPPING *//* reads fred's IP-address to DN mapping file.   for environments like Rutgers where IP-addresses can be more or less   trusted, this allows an easy mechanism for mapping local Rutgers users into   some DN other than the NULL user   Syntax:   	<addrmask>	<netaddr>	<dn>	<password>	Each token is separated by LWSP, though double-quotes may be used to	prevent separation. */static	rcmap (isock)struct sockaddr_in *isock;{    u_long	hostaddr,		netmask,		netaddr;    register char *cp;    char    buffer[BUFSIZ + 1],	   *vec[NVEC + 1];    FILE   *fp;    if ((fp = fopen (isodefile ("fredmap", 0), "r")) == NULL)	goto done;    hostaddr = isock -> sin_addr.s_addr;    while (fgets (buffer, sizeof buffer, fp)) {	if (*buffer == '#')	    continue;	if (cp = index (buffer, '\n'))	    *cp = NULL;	bzero ((char *) vec, sizeof vec);	if (str2vec (buffer, vec) != 4)	    continue;	netmask = inet_addr (vec[0]);	if ((netaddr = inet_network (vec[1])) == NOTOK)	    continue;	netaddr = ntohl (netaddr);	if (!(netaddr & 0xff000000))	    netaddr <<=   (netaddr & 0x00ff0000) ? 8		        : (netaddr & 0x0000ff00) ? 16		        :			   24;	netaddr = htonl (netaddr);	if ((hostaddr & netmask) != netaddr)	    continue;	vec[1] = "thisis";	runcom = 1, rcmode = 0400;	if (f_thisis (vec + 1) == NOTOK)	    adios (NULLCP, "unable to bind as %s for %s",		   vec[2], inet_ntoa (isock -> sin_addr));	runcom = 0;	break;    }    (void) fclose (fp);done: ;    (void) setgid (getgid ());    (void) setuid (getuid ());}/*    ERRORS */#ifndef	lintvoid	_advise ();void	adios (va_alist)va_dcl{    va_list ap;    static int	latch = 0;    if (latch)	_exit (1);    latch = 1;    va_start (ap);    if (network)	(void) _ll_log (fred_log, LLOG_FATAL, ap);    _advise (ap);    va_end (ap);    (void) f_quit (NULLVP);    _exit (1);}#else/* VARARGS */void	adios (what, fmt)char   *what,       *fmt;{    adios (what, fmt);}#endif#ifndef	lintvoid	advise (va_alist)va_dcl{    va_list ap;    va_start (ap);    _advise (ap);    va_end (ap);}static void  _advise (ap)va_list	ap;{    char    buffer[BUFSIZ];    FILE   *fp = network ? stdfp : stderr;    asprintf (buffer, ap);    (void) fflush (stdfp);    (void) fprintf (fp, "%s: ", myname);    (void) fputs (buffer, fp);    (void) fputs (EOLN, fp);    (void) fflush (fp);}#else/* VARARGS */void	advise (what, fmt)char   *what,       *fmt;{    advise (what, fmt);}#endif/*  */#include <utmp.h>#ifdef	sun#define	BSD42#undef	SYS5#endif#ifdef	bsd43_ut_host#undef	BSD42#define	SYS5#endif#ifdef	BSD42#define	HMAX	(sizeof (ut -> ut_host))#endif#define	LMAX	(sizeof (ut -> ut_line))#define	NMAX	(sizeof (ut -> ut_name))#define SCPYN(a, b)	strncpy(a, b, sizeof (a))#define SCMPN(a, b)	strncmp(a, b, sizeof (a))#ifdef	SYS5struct utmp *getutent ();#endifchar *ttyname ();static	log_utmp () {#ifndef	SYS5    int	    ud;#endif    char   *line;    struct utmp uts;    register struct utmp *ut = &uts;    if ((line = ttyname (fileno (stdin))) == NULL)	return;    if (strncmp (line, "/dev/", sizeof "/dev/" - 1) == 0)	line += sizeof "/dev/" - 1;#ifndef	SYS5    if ((ud = open ("/etc/utmp", 0)) == NOTOK)	return;    while (read (ud, (char *) ut, sizeof *ut) == sizeof *ut) {	if (ut -> ut_name[0] == NULL || SCMPN (ut -> ut_line, line))	    continue;#ifndef	BSD42	(void) ll_log (fred_log, LLOG_NOTICE, NULLCP, "%.*s on %.*s",		       NMAX, ut -> ut_name, LMAX, ut -> ut_line);#else	(void) ll_log (fred_log, LLOG_NOTICE, NULLCP,		       "%.*s on %.*s (%.*s)",		       NMAX, ut -> ut_name, LMAX, ut -> ut_line,		       HMAX, ut -> ut_host);#endif	break;    }    (void) close (ud);#else    setutent ();    while (ut = getutent ()) {	if (ut -> ut_type != USER_PROCESS || SCMPN (ut -> ut_line, line))	    continue;		(void) ll_log (fred_log, LLOG_NOTICE, NULLCP, "%.*s on %.*s",		       NMAX, ut -> ut_name, LMAX, ut -> ut_line);	break;    }    endutent ();#endif}#ifdef	bsd43_ut_host#define	BSD42#undef	SYS5#endif

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?