📄 slocal.c
字号:
p -> p_value = getcpy (addr); for (i = 0, state = FLD;;) { switch (state = m_getfld (state, name, field, sizeof field, in)) { case FLD: case FLDEOF: case FLDPLUS: lp = add (field, NULLCP); while (state == FLDPLUS) { state = m_getfld (state, name, field, sizeof field, in); lp = add (field, lp); } for (p = hdrs; p -> p_name; p++) if (uleq (p -> p_name, name)) { if (!(p -> p_flags & P_HID)) { if (cp = p -> p_value) if (p -> p_flags & P_ADR) { dp = cp + strlen (cp) - 1; if (*dp == '\n') *dp = NULL; cp = add (",\n\t", cp); } else cp = add ("\t", cp); p -> p_value = add (lp, cp); } free (lp); break; } if (p -> p_name == NULL && i < NVEC) { p -> p_name = getcpy (name); p -> p_value = lp; p -> p_flags = P_NIL; p++, i++; p -> p_name = NULL; } if (state != FLDEOF) continue; break; case BODY: case BODYEOF: case FILEEOF: break; case LENERR: case FMTERR: advise (NULLCP, "format error in message"); break; default: advise (NULLCP, "internal error"); (void) fclose (in); return NOTOK; } break; } (void) fclose (in); if (p = lookup (vars, "reply-to")) { if ((q = lookup (hdrs, "reply-to")) == NULL || q -> p_value == NULL) q = lookup (hdrs, "from"); p -> p_value = getcpy (q ? q -> p_value : ""); p -> p_flags &= ~P_CHK; if (debug) fprintf (stderr, "vars[%d]: name=\"%s\" value=\"%s\"\n", p - vars, p -> p_name, p -> p_value); } if (debug) for (p = hdrs; p -> p_name; p++) fprintf (stderr, "hdrs[%d]: name=\"%s\" value=\"%s\"\n", p - hdrs, p -> p_name, p -> p_value); return OK;}/* */#define LPAREN '('#define RPAREN ')'static expand (s1, s2, fd)register char *s1, *s2;int fd;{ register char c, *cp; register struct pair *p; if (!globbed) glob (fd); while (c = *s2++) if (c != '$' || *s2 != LPAREN) *s1++ = c; else { for (cp = ++s2; *s2 && *s2 != RPAREN; s2++) continue; if (*s2 != RPAREN) { s2 = --cp; continue; } *s2++ = NULL; if (p = lookup (vars, cp)) { if (!parsed && (p -> p_flags & P_CHK)) (void) parse (fd); (void) strcpy (s1, p -> p_value); s1 += strlen (s1); } } *s1 = NULL;}/* */static glob (fd)register int fd;{ char buffer[BUFSIZ]; struct stat st; register struct pair *p; if (globbed++) return; if (p = lookup (vars, "sender")) p -> p_value = getcpy (sender); if (p = lookup (vars, "address")) p -> p_value = getcpy (addr); if (p = lookup (vars, "size")) { (void) sprintf (buffer, "%d", fstat (fd, &st) != NOTOK ? (int) st.st_size : 0); p -> p_value = getcpy (buffer); } if (p = lookup (vars, "info")) p -> p_value = getcpy (info); if (debug) for (p = vars; p -> p_name; p++) fprintf (stderr, "vars[%d]: name=\"%s\" value=\"%s\"\n", p - vars, p -> p_name, p -> p_value);}/* */static struct pair *lookup (pairs, key)register struct pair *pairs;register char *key;{ register char *cp; for (; cp = pairs -> p_name; pairs++) if (uleq (cp, key)) return pairs; return NULL;}/* */static int logged_in () { struct utmp ut; register FILE *uf; if (utmped) return utmped; if ((uf = fopen ("/etc/utmp", "r")) == NULL) return NOTOK; while (fread ((char *) &ut, sizeof ut, 1, uf) == 1) if (ut.ut_name[0] != NULL && strncmp (user, ut.ut_name, sizeof ut.ut_name) == 0) { if (debug) continue; (void) fclose (uf); return (utmped = DONE); } (void) fclose (uf); return (utmped = NOTOK);}static int timely (t1, t2)char *t1, *t2;{#define check(t,a,b) if (t < a || t > b) return NOTOK#define cmpar(h1,m1,h2,m2) if (h1 < h2 || (h1 == h2 && m1 < m2)) return OK int t1hours, t1mins, t2hours, t2mins; if (sscanf (t1, "%d:%d", &t1hours, &t1mins) != 2) return NOTOK; check (t1hours, 0, 23); check (t1mins, 0, 59); if (sscanf (t2, "%d:%d", &t2hours, &t2mins) != 2) return NOTOK; check (t2hours, 0, 23); check (t2mins, 0, 59); cmpar (now -> tw_hour, now -> tw_min, t1hours, t1mins); cmpar (t2hours, t2mins, now -> tw_hour, now -> tw_min); return NOTOK;}/* */static int usr_file (fd, mailbox, from)int fd;char *mailbox, *from;{ int md, mapping; register char *bp; char buffer[BUFSIZ]; if (verbose) printf ("\tdelivering to file \"%s\"", mailbox); if (from && *from) { (void) mbx_uucp (); if (verbose) printf (" (uucp style)"); (void) sprintf (buffer, "%s%s", from, ddate); bp = buffer; mapping = 0; } else { bp = ddate; mapping = 1; } if (verbose) (void) fflush (stdout); if ((md = mbx_open (mailbox, pw -> pw_uid, pw -> pw_gid, m_gmprot ())) == NOTOK) { adorn ("", "unable to open:"); return NOTOK; } (void) lseek (fd, 0L, 0); if (mbx_copy (mailbox, md, fd, mapping, bp, verbose) == NOTOK) { adorn ("", "error writing to:"); return NOTOK; } (void) mbx_close (mailbox, md); if (verbose) { printf (", done.\n"); (void) fflush (stdout); } return OK;}/* */#ifdef notdefstatic int usr_hook (fd, mailbox)int fd;char *mailbox;{ int i, vecp; char receive[BUFSIZ], tmpfil[BUFSIZ], *vec[NVEC]; if ((fd = copyfile (fd, tmpfil, 0)) == NOTOK) { if (verbose) adorn ("unable to copy message; skipping hook\n"); return NOTOK; } (void) chown (tmpfil, pw -> pw_uid, pw -> pw_gid); vecp = 1; (void) sprintf (receive, "%s/.mh_receive", pw -> pw_dir); switch (access (receive, 01)) { case NOTOK: (void) sprintf (receive, "%s/bin/rcvmail", pw -> pw_dir); if (access (receive, 01) == NOTOK) { (void) unlink (tmpfil); if (verbose) { printf ("\tnot present\n"); (void) fflush (stdout); } return NOTOK; } vec[vecp++] = addr; vec[vecp++] = tmpfil; vec[vecp++] = sender; break; default: vec[vecp++] = tmpfil; vec[vecp++] = mailbox; vec[vecp++] = home; vec[vecp++] = addr; vec[vecp++] = sender; break; } vec[0] = r1bindex (receive, '/'); vec[vecp] = NULL; i = usr_pipe (fd, "rcvmail", receive, vec); (void) unlink (tmpfil); return i;}#endif notdef/* */static int usr_pipe (fd, cmd, pgm, vec)int fd;char *cmd, *pgm, **vec;{ int bytes, i, child_id, status; struct stat st; if (verbose) { printf ("\tdelivering to pipe \"%s\"", cmd); (void) fflush (stdout); } (void) lseek (fd, 0L, 0); for (i = 0; (child_id = fork ()) == NOTOK && i < 5; i++) sleep (5); switch (child_id) { case NOTOK: adorn ("fork", "unable to"); return NOTOK; case OK: if (fd != 0) (void) dup2 (fd, 0); (void) freopen ("/dev/null", "w", stdout); (void) freopen ("/dev/null", "w", stderr); if (fd != 3) (void) dup2 (fd, 3); closefds (4);#ifdef TIOCNOTTY if ((fd = open ("/dev/tty", 2)) != NOTOK) { (void) ioctl (fd, TIOCNOTTY, NULLCP); (void) close (fd); }#endif TIOCNOTTY#ifdef BSD42 (void) setpgrp (0, getpid ());#endif BSD42 *environ = NULL; (void) putenv ("USER", pw -> pw_name); (void) putenv ("HOME", pw -> pw_dir); (void) putenv ("SHELL", pw -> pw_shell); execvp (pgm, vec); _exit (-1); default: switch (setjmp (myctx)) { case OK: (void) signal (SIGALRM, alrmser); bytes = fstat (fd, &st) != NOTOK ? (int) st.st_size : 100; if (bytes <= 0) bytes = 100; (void) alarm ((unsigned) (bytes * 60 + 300)); status = pidwait (child_id, OK); (void) alarm (0);#ifdef MMDFI if (status == RP_MOK || status == RP_OK) status = 0;#endif MMDFI if (verbose) { if (status == 0) printf (", wins.\n"); else if ((status & 0xff00) == 0xff00) printf (", system error\n"); else (void) pidstatus (status, stdout, ", loses"); (void) fflush (stdout); } return (status == 0 ? OK : NOTOK); default: #ifndef BSD42 (void) kill (child_id, SIGKILL);#else BSD42 (void) killpg (child_id, SIGKILL);#endif BSD42 if (verbose) { printf (", timed-out; terminated\n"); (void) fflush (stdout); } return NOTOK; } }}/* *//* ARGSUSED */static int alrmser (i)int i;{ longjmp (myctx, DONE);}/* */static copyinfo (fp, from)register FILE *fp;char *from;{ int i; register char *cp; static char buffer[BUFSIZ]; if (unixfrom) /* interface from copyfile */ strcpy (from, unixfrom); else if (fgets (from, BUFSIZ, fp) == NULL) adios (NULLCP, "no message"); if (strncmp (from, "From ", i = strlen ("From "))) { rewind (fp); *from = NULL; return; } (void) strcpy (buffer, from + i); if (cp = index (buffer, '\n')) { *cp = NULL; cp -= 24; if (cp < buffer) cp = buffer; } else cp = buffer; *cp = NULL; for (cp = buffer + strlen (buffer) - 1; cp >= buffer; cp--) if (isspace (*cp)) *cp = NULL; else break; sender = buffer; rewind (fp);}/* */static int copyfile (qd, tmpfil, fold)int qd, fold;register char *tmpfil;{ register int i, first = 0, fd1, fd2; char buffer[BUFSIZ]; register FILE *qfp, *ffp; (void) strcpy (tmpfil, m_tmpfil (invo_name)); if ((fd1 = creat (tmpfil, 0600)) == NOTOK) return NOTOK; (void) close (fd1); if ((fd1 = open (tmpfil, 2)) == NOTOK) return NOTOK; if (!fold) { while ((i = read (qd, buffer, sizeof buffer)) > 0) if (write (fd1, buffer, i) != i) {you_lose: ; (void) close (fd1); (void) unlink (tmpfil); return NOTOK; } if (i == NOTOK) goto you_lose; (void) lseek (fd1, 0L, 0); return fd1; } if ((fd2 = dup (qd)) == NOTOK) { (void) close (fd1); return NOTOK; } if ((qfp = fdopen (fd2, "r")) == NULL) { (void) close (fd1); (void) close (fd2); return NOTOK; } if ((fd2 = dup (fd1)) == NOTOK) { (void) close (fd1); (void) fclose (qfp); return NOTOK; } if ((ffp = fdopen (fd2, "r+")) == NULL) { (void) close (fd1); (void) close (fd2); (void) fclose (qfp); return NOTOK; } i = strlen ("From "); while (fgets (buffer, sizeof buffer, qfp)) { if (!strncmp (buffer, "From ", i)) if (first == 0) {#ifdef RPATHS register char *fp, *cp, *hp, *ep;#endif unixfrom = getcpy (buffer); /* save for later */#ifndef RPATHS continue; /* but don't put in file */#else hp = cp = index (fp = unixfrom + i, ' '); while (hp = index (++hp, 'r')) if (uprf (hp, "remote from")) { hp = rindex (hp, ' '); break; } if (hp) { ep = rindex (++hp, '\n'); sprintf (buffer, "Return-Path: %.*s!%.*s\n", ep - hp, hp, cp - fp, fp); } else sprintf (buffer, "Return-Path: %.*s\n", cp - fp, fp);#endif } else putc ('>', ffp); first++; fputs (buffer, ffp); if (ferror (ffp)) { (void) close (fd1); (void) fclose (ffp); (void) fclose (qfp); return NOTOK; } } (void) fclose (ffp); if (ferror (qfp)) { (void) close (fd1); (void) fclose (qfp); return NOTOK; } (void) fclose (qfp); (void) lseek (fd1, 0L, 0); return fd1;}/* *//* VARARGS2 */static void adorn (what, fmt, a, b, c, d, e, f)char *what, *fmt, *a, *b, *c, *d, *e, *f;{ char *cp = invo_name; if (!verbose) return; printf (", "); invo_name = NULL; advise (what, fmt, a, b, c, d, e, f); invo_name = cp;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -