📄 envelope.c
字号:
/* hop count */ (void) sprintf(cbuf, "%d", e->e_hopcount); define('c', newstr(cbuf), e); /* time as integer, unix time, arpa time */ settime(e);#ifdef TTYNAME /* tty name */ if (macvalue('y', e) == NULL) { p = ttyname(2); if (p != NULL) { if (strrchr(p, '/') != NULL) p = strrchr(p, '/') + 1; (void) strcpy(ybuf, p); define('y', ybuf, e); } }#endif /* TTYNAME */}/*** SETTIME -- set the current time.**** Parameters:** none.**** Returns:** none.**** Side Effects:** Sets the various time macros -- $a, $b, $d, $t.*/voidsettime(e) register ENVELOPE *e;{ register char *p; auto time_t now; char tbuf[20]; /* holds "current" time */ char dbuf[30]; /* holds ctime(tbuf) */ register struct tm *tm; extern char *arpadate(); extern struct tm *gmtime(); now = curtime(); tm = gmtime(&now); (void) sprintf(tbuf, "%04d%02d%02d%02d%02d", tm->tm_year + 1900, tm->tm_mon+1, tm->tm_mday, tm->tm_hour, tm->tm_min); define('t', newstr(tbuf), e); (void) strcpy(dbuf, ctime(&now)); p = strchr(dbuf, '\n'); if (p != NULL) *p = '\0'; define('d', newstr(dbuf), e); p = arpadate(dbuf); p = newstr(p); if (macvalue('a', e) == NULL) define('a', p, e); define('b', p, e);}/*** OPENXSCRIPT -- Open transcript file**** Creates a transcript file for possible eventual mailing or** sending back.**** Parameters:** e -- the envelope to create the transcript in/for.**** Returns:** none**** Side Effects:** Creates the transcript file.*/#ifndef O_APPEND#define O_APPEND 0#endifvoidopenxscript(e) register ENVELOPE *e;{ register char *p; int fd; if (e->e_xfp != NULL) return; p = queuename(e, 'x'); fd = open(p, O_WRONLY|O_CREAT|O_APPEND, 0644); if (fd < 0) { syserr("Can't create transcript file %s", p); fd = open("/dev/null", O_WRONLY, 0644); if (fd < 0) syserr("!Can't open /dev/null"); } e->e_xfp = fdopen(fd, "w"); if (e->e_xfp == NULL) { syserr("!Can't create transcript stream %s", p); } if (tTd(46, 9)) { printf("openxscript(%s):\n ", p); dumpfd(fileno(e->e_xfp), TRUE, FALSE); }}/*** CLOSEXSCRIPT -- close the transcript file.**** Parameters:** e -- the envelope containing the transcript to close.**** Returns:** none.**** Side Effects:** none.*/voidclosexscript(e) register ENVELOPE *e;{ if (e->e_xfp == NULL) return; (void) xfclose(e->e_xfp, "closexscript", e->e_id); e->e_xfp = NULL;}/*** SETSENDER -- set the person who this message is from**** Under certain circumstances allow the user to say who** s/he is (using -f or -r). These are:** 1. The user's uid is zero (root).** 2. The user's login name is in an approved list (typically** from a network server).** 3. The address the user is trying to claim has a** "!" character in it (since #2 doesn't do it for** us if we are dialing out for UUCP).** A better check to replace #3 would be if the** effective uid is "UUCP" -- this would require me** to rewrite getpwent to "grab" uucp as it went by,** make getname more nasty, do another passwd file** scan, or compile the UID of "UUCP" into the code,** all of which are reprehensible.**** Assuming all of these fail, we figure out something** ourselves.**** Parameters:** from -- the person we would like to believe this message** is from, as specified on the command line.** e -- the envelope in which we would like the sender set.** delimptr -- if non-NULL, set to the location of the** trailing delimiter.** internal -- set if this address is coming from an internal** source such as an owner alias.**** Returns:** none.**** Side Effects:** sets sendmail's notion of who the from person is.*/voidsetsender(from, e, delimptr, internal) char *from; register ENVELOPE *e; char **delimptr; bool internal;{ register char **pvp; char *realname = NULL; register struct passwd *pw; char delimchar; char *bp; char buf[MAXNAME + 2]; char pvpbuf[PSBUFSIZE]; extern struct passwd *getpwnam(); extern char *FullName; if (tTd(45, 1)) printf("setsender(%s)\n", from == NULL ? "" : from); /* ** Figure out the real user executing us. ** Username can return errno != 0 on non-errors. */ if (bitset(EF_QUEUERUN, e->e_flags) || OpMode == MD_SMTP || OpMode == MD_ARPAFTP || OpMode == MD_DAEMON) realname = from; if (realname == NULL || realname[0] == '\0') realname = username(); if (ConfigLevel < 2) SuprErrs = TRUE; delimchar = internal ? '\0' : ' '; e->e_from.q_flags = QBADADDR; if (from == NULL || parseaddr(from, &e->e_from, RF_COPYALL|RF_SENDERADDR, delimchar, delimptr, e) == NULL || bitset(QBADADDR, e->e_from.q_flags) || e->e_from.q_mailer == ProgMailer || e->e_from.q_mailer == FileMailer || e->e_from.q_mailer == InclMailer) { /* log garbage addresses for traceback */# ifdef LOG if (from != NULL && LogLevel > 2) { char *p; char ebuf[MAXNAME * 2 + 2]; p = macvalue('_', e); if (p == NULL) { char *host = RealHostName; if (host == NULL) host = MyHostName; (void) sprintf(ebuf, "%s@%s", realname, host); p = ebuf; } syslog(LOG_NOTICE, "setsender: %s: invalid or unparseable, received from %s", shortenstring(from, 83), p); }# endif /* LOG */ if (from != NULL) { if (!bitset(QBADADDR, e->e_from.q_flags)) { /* it was a bogus mailer in the from addr */ usrerr("553 Invalid sender address"); } SuprErrs = TRUE; } if (from == realname || parseaddr(from = newstr(realname), &e->e_from, RF_COPYALL|RF_SENDERADDR, ' ', NULL, e) == NULL) { char nbuf[100]; SuprErrs = TRUE; expand("\201n", nbuf, &nbuf[sizeof nbuf], e); if (parseaddr(from = newstr(nbuf), &e->e_from, RF_COPYALL, ' ', NULL, e) == NULL && parseaddr(from = "postmaster", &e->e_from, RF_COPYALL, ' ', NULL, e) == NULL) syserr("553 setsender: can't even parse postmaster!"); } } else FromFlag = TRUE; e->e_from.q_flags |= QDONTSEND; if (tTd(45, 5)) { printf("setsender: QDONTSEND "); printaddr(&e->e_from, FALSE); } SuprErrs = FALSE; pvp = NULL; if (e->e_from.q_mailer == LocalMailer) {# ifdef USERDB register char *p; extern char *udbsender();# endif if (!internal) { /* if the user has given fullname already, don't redefine */ if (FullName == NULL) FullName = macvalue('x', e); if (FullName != NULL && FullName[0] == '\0') FullName = NULL;# ifdef USERDB p = udbsender(e->e_from.q_user); if (p != NULL) { /* ** We have an alternate address for the sender */ pvp = prescan(p, '\0', pvpbuf, sizeof pvpbuf, NULL); }# endif /* USERDB */ } if ((pw = getpwnam(e->e_from.q_user)) != NULL) { /* ** Process passwd file entry. */ /* extract home directory */ if (strcmp(pw->pw_dir, "/") == 0) e->e_from.q_home = newstr(""); else e->e_from.q_home = newstr(pw->pw_dir); define('z', e->e_from.q_home, e); /* extract user and group id */ e->e_from.q_uid = pw->pw_uid; e->e_from.q_gid = pw->pw_gid; e->e_from.q_flags |= QGOODUID; /* extract full name from passwd file */ if (FullName == NULL && pw->pw_gecos != NULL && strcmp(pw->pw_name, e->e_from.q_user) == 0 && !internal) { buildfname(pw->pw_gecos, e->e_from.q_user, buf); if (buf[0] != '\0') FullName = newstr(buf); } } if (FullName != NULL && !internal) define('x', FullName, e); } else if (!internal && OpMode != MD_DAEMON) { if (e->e_from.q_home == NULL) { e->e_from.q_home = getenv("HOME"); if (e->e_from.q_home != NULL && strcmp(e->e_from.q_home, "/") == 0) e->e_from.q_home++; } e->e_from.q_uid = RealUid; e->e_from.q_gid = RealGid; e->e_from.q_flags |= QGOODUID; } /* ** Rewrite the from person to dispose of possible implicit ** links in the net. */ if (pvp == NULL) pvp = prescan(from, delimchar, pvpbuf, sizeof pvpbuf, NULL); if (pvp == NULL) { /* don't need to give error -- prescan did that already */# ifdef LOG if (LogLevel > 2) syslog(LOG_NOTICE, "cannot prescan from (%s)", from);# endif finis(); } (void) rewrite(pvp, 3, 0, e); (void) rewrite(pvp, 1, 0, e); (void) rewrite(pvp, 4, 0, e); bp = buf + 1; cataddr(pvp, NULL, bp, sizeof buf - 2, '\0'); if (*bp == '@') { /* heuristic: route-addr: add angle brackets */ strcat(bp, ">"); *--bp = '<'; } e->e_sender = newstr(bp); define('f', e->e_sender, e); /* save the domain spec if this mailer wants it */ if (e->e_from.q_mailer != NULL && bitnset(M_CANONICAL, e->e_from.q_mailer->m_flags)) { extern char **copyplist(); while (*pvp != NULL && strcmp(*pvp, "@") != 0) pvp++; if (*pvp != NULL) e->e_fromdomain = copyplist(pvp, TRUE); }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -