📄 spost.c
字号:
*argp++ = "-t"; /* read msg for recipients */ *argp++ = "-i"; /* don't stop on "." */ if (whomflg) *argp++ = "-bv"; if (watch || verbose) *argp++ = "-v"; *argp = NULL; if (pushflg && !(watch || verbose)) { /* fork to a child to run sendmail */ for (i=0; (pid = vfork()) == NOTOK && i < 5; i++) sleep(5); switch (pid) { case NOTOK: fprintf (verbose ? stdout : stderr, "%s: can't fork to %s\n", invo_name, sendmail); exit(-1); case OK: /* we're the child .. */ break; default: exit(0); } } execv ( sendmail, sargv); adios ( sendmail, "can't exec");}/* DRAFT GENERATION */static putfmt (name, str, out)char *name, *str;FILE * out;{ int count, grp, i, keep; char *cp, *pp, *qp, namep[BUFSIZ]; struct mailname *mp, *np; struct headers *hdr; while (*str == ' ' || *str == '\t') str++; if ((i = get_header (name, hdrtab)) == NOTOK) { fprintf (out, "%s: %s", name, str); return; } hdr = &hdrtab[i]; if (hdr -> flags & HIGN) return; if (hdr -> flags & HBAD) { advise (NULLCP, "illegal header line -- %s:", name); badmsg++; return; } msgflags |= hdr -> set; if (hdr -> flags & HSUB) subject = subject ? add (str, add ("\t", subject)) : getcpy (str); if (hdr -> flags & HFCC) { if (cp = rindex (str, '\n')) *cp = NULL; for (cp = pp = str; cp = index (pp, ','); pp = cp) { *cp++ = NULL; insert_fcc (hdr, pp); } insert_fcc (hdr, pp); return; }#ifdef notdef if (hdr -> flags & HBCC) { insert_bcc(str); return; }#endif notdef if (*str != '\n' && *str != '\0') if (aliasflg && hdr->flags & HTRY) { /* this header contains address(es) that we have to do * alias expansion on. Because of the saved state in * getname we have to put all the addresses into a list. * We then let putadr munch on that list, possibly * expanding aliases. */ register struct mailname *f = 0; register struct mailname *mp = 0; while (cp = getname( str ) ) { mp = getm( cp, NULLCP, 0, AD_HOST, NULLCP); if (f == 0) { f = mp; mp->m_next = mp; } else { mp->m_next = f->m_next; f->m_next = mp; f = mp; } } f = mp->m_next; mp->m_next = 0; putadr( name, f ); } else { fprintf (out, "%s: %s", name, str ); }}/* */staticstart_headers (){ char *cp; char sigbuf[BUFSIZ]; (void)strcpy( from, getusr() ); if ((cp = getfullname ()) && *cp) { (void)strcpy (sigbuf, cp); (void)sprintf (signature, "%s <%s>", sigbuf, from); } else (void)sprintf (signature, "%s", from);}/* */staticfinish_headers (out) FILE * out;{ switch (msgstate) { case normal: if (!(msgflags & MDAT)) fprintf (out, "Date: %s\n", dtimenow ()); if (msgflags & MFRM) fprintf (out, "Sender: %s\n", from); else fprintf (out, "From: %s\n", signature);#ifdef notdef if (!(msgflags & MVIS)) fprintf (out, "Bcc: Blind Distribution List: ;\n");#endif notdef break; case resent: if (!(msgflags & MRDT)) fprintf (out, "Resent-Date: %s\n", dtimenow()); if (msgflags & MRFM) fprintf (out, "Resent-Sender: %s\n", from); else fprintf (out, "Resent-From: %s\n", signature);#ifdef notdef if (!(msgflags & MVIS)) fprintf (out, "Resent-Bcc: Blind Re-Distribution List: ;\n");#endif notdef break; } if (badmsg) adios (NULLCP, "re-format message and try again");}/* */static intget_header (header, table) char *header; struct headers *table;{ struct headers *h; for (h = table; h -> value; h++) if (uleq (header, h -> value)) return (h - table); return NOTOK;}/* *//* output the address list for header "name". The address list * is a linked list of mailname structs. "nl" points to the head * of the list. Alias substitution should be done on nl. */static putadr (name, nl)char *name;struct mailname *nl;{ register struct mailname *mp, *mp2; register int linepos; register char *cp; int namelen; fprintf (out, "%s: ", name); namelen = strlen(name) + 2; linepos = namelen; for (mp = nl; mp; ) { if (linepos > MAX_SM_FIELD) { fprintf (out, "\n%s: ", name); linepos = namelen; } if (mp->m_nohost) { /* a local name - see if it's an alias */ cp = akvalue(mp->m_mbox); if (cp == mp->m_mbox) /* wasn't an alias - use what the user typed */ linepos = putone( mp->m_text, linepos, namelen ); else /* an alias - expand it */ while (cp = getname(cp) ) { if (linepos > MAX_SM_FIELD) { fprintf (out, "\n%s: ", name); linepos = namelen; } mp2 = getm( cp, NULLCP, 0, AD_HOST, NULLCP); if (akvisible()) { mp2->m_pers = getcpy(mp->m_mbox); linepos = putone( adrformat(mp2), linepos, namelen ); } else { linepos = putone( mp2->m_text, linepos, namelen ); } mnfree( mp2 ); } } else { /* not a local name - use what the user typed */ linepos = putone( mp->m_text, linepos, namelen ); } mp2 = mp; mp = mp->m_next; mnfree( mp2 ); } putc( '\n', out );}static int putone ( adr, pos, indent )register char *adr;register int pos;int indent;{ register int len; static int linepos; len = strlen( adr ); if (pos == indent) linepos = pos; else if ( linepos+len > outputlinelen ) { fprintf ( out, ",\n%*s", indent, ""); linepos = indent; pos += indent + 2; } else { fputs( ", ", out ); linepos += 2; pos += 2; } fputs( adr, out ); linepos += len; return (pos+len);}/* */static insert_fcc (hdr, pp)struct headers *hdr;char *pp;{ char *cp; for (cp = pp; isspace (*cp); cp++) continue; for (pp += strlen (pp) - 1; pp > cp && isspace (*pp); pp--) continue; if (pp >= cp) *++pp = NULL; if (*cp == NULL) return; if (fccind >= FCCS) adios (NULLCP, "too many %ss", hdr -> value); fccfold[fccind++] = getcpy (cp);}#ifdef notdef/* BCC GENERATION */static make_bcc_file () { int fd, i, child_id, status; char *vec[6]; FILE * in, *out; (void)mktemp (bccfil); if ((out = fopen (bccfil, "w")) == NULL) adios (bccfil, "unable to create"); (void)chmod (bccfil, 0600); fprintf (out, "Date: %s\n", dtimenow ()); fprintf (out, "From: %s\n", signature); if (subject) fprintf (out, "Subject: %s", subject); fprintf (out, "BCC:\n\n------- Blind-Carbon-Copy\n\n"); (void)fflush (out); if (filter == NULL) { if ((fd = open (tmpfil, 0)) == NOTOK) adios (NULLCP, "unable to re-open"); cpydgst (fd, fileno (out), tmpfil, bccfil); close (fd); } else { vec[0] = r1bindex (mhlproc, '/'); for (i = 0; (child_id = vfork ()) == NOTOK && i < 5; i++) sleep (5); switch (child_id) { case NOTOK: adios ("vfork", "unable to"); case OK: dup2 (fileno (out), 1); i = 1; vec[i++] = "-forward"; vec[i++] = "-form"; vec[i++] = filter; vec[i++] = tmpfil; vec[i] = NULL; execvp (mhlproc, vec); adios (mhlproc, "unable to exec"); default: if (status = pidwait (child_id, OK)) admonish (NULL, "%s lost (status=0%o)", vec[0], status); break; } } fseek (out, 0L, 2); fprintf (out, "\n------- End of Blind-Carbon-Copy\n"); (void)fclose (out);}#endif notdef/* FCC INTERACTION */static file (path)char *path;{ int i; if (fccind == 0) return; for (i = 0; i < fccind; i++) if (whomflg) printf ("Fcc: %s\n", fccfold[i]); else fcc (path, fccfold[i]);}static fcc (file, folder)char *file, *folder;{ int i, child_id, status; char fold[BUFSIZ]; if (verbose) printf ("%sFcc: %s\n", msgstate == resent ? "Resent-" : "", folder); (void)fflush (stdout); for (i = 0; (child_id = vfork ()) == NOTOK && i < 5; i++) sleep (5); switch (child_id) { case NOTOK: if (!verbose) fprintf (stderr, " %sFcc %s: ", msgstate == resent ? "Resent-" : "", folder); fprintf (verbose ? stdout : stderr, "no forks, so not ok\n"); break; case OK: (void)sprintf (fold, "%s%s", *folder == '+' || *folder == '@' ? "" : "+", folder); execlp (fileproc, r1bindex (fileproc, '/'), "-link", "-file", file, fold, NULL); _exit (-1); default: if (status = pidwait (child_id, OK)) { if (!verbose) fprintf (stderr, " %sFcc %s: ", msgstate == resent ? "Resent-" : "", folder); fprintf (verbose ? stdout : stderr, " errored (0%o)\n", status); } } (void)fflush (stdout);}/* TERMINATION *//* VARARGS2 */static die (what, fmt, a, b, c, d)char *what, *fmt, *a, *b, *c, *d;{ adios (what, fmt, a, b, c, d);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -