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