|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T f
Length: 4228 (0x1084) Types: TextFile Names: »fakename.c«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit └─⟦bfebc70e2⟧ »EurOpenD3/mail/sendmail-5.65b+IDA-1.4.3.tar.Z« └─⟦f9e35cd84⟧ └─⟦this⟧ »sendmail/support/fakename.c«
/* ** fakemail - a SysV /bin/mail preprocessor for sendmail ** ** Standard AT&T /bin/mail adds it's own From_ line specifying the ** identity of the sender (commenting out any previously existing ** From_ lines in the process). While this behavior might be ** consistent with RFC-976, it only serves to confuse mailers such ** as mailx which use the From_ line to determine reply addresses. ** ** To determine the sender identity (placed in the generated From_ ** line), /bin/mail uses $LOGNAME of the user/program invoking it. ** For local mail this is moderately acceptable (the user could fake ** the sender by changing $LOGNAME), but for use with sendmail this ** behavior is unreasonable since the invocation of /bin/mail is ** done by root. As a result, mailx reports all external mail as ** "From root", and the actual identity of the sender is obscured. ** ** `fakemail' is designed as a replacement for the sendmail local ** delivery program. It preprocesses mail messages (read from ** stdin) and changes $LOGNAME before calling the regular /bin/mail. ** The new $LOGNAME is derived from the address portion of the From_ ** line, which is found in the first line of the header. ** ** From user@site Fri Jun 15 13:18:09 1990 ** ** If no From_ line is found, $LOGNAME defaults to the user of the ** program, as with normal /bin/mail. ** ** Technically, `fakemail' could be considered a slightly better ** mechanism than direct /bin/mail since you cannot spoof the ** program by changing $LOGNAME. An argument against this, however, ** is the fact that you *can* trick `fakemail' by supplying a bogus ** From_ line as the first line of the header. ** ** To use: ** ** 1) Compile and install this program ** make fakemail ** cpset fakemail /usr/bin ** ** 2) Edit /usr/lib/sendmail.cf ** change the 'Mlocal' mailer to use /usr/bin/fakemail ** ** 3) Restart sendmail ** ps -eaf; kill -9 <sendmail_pid> ** /usr/lib/sendmail -bd -q30m ** ** NOTE: This is simply a hack for sendmail+mailx. Use of another ** MTA (ie, smail) or MUA (ie, Elm) would eliminate any need for this ** program. ** ** -- ** Bill Houle bhoule@se-sd.SanDiego.NCR.COM ** NCR SE-San Diego (619) 693-5593 */ #include <stdio.h> #include <string.h> /*#define DEBUG "/bin/cat" /* comment this out for installation */ #define BINMAIL "/bin/mail" #define TRUE 1 #define FALSE 0 char line[255], env[255]; void exit(), perror(); void syserr(str) char *str; { perror(str); exit(1); } main(argc, argv) int argc; char **argv; { int fd[2], from_found=TRUE; if (gets(line) != NULL) { /* read first line * / strcpy(env, "LOGNAME="); if (strncmp(line, "From ", 5) == 0) { /* From_ line? * / (void) strtok(line, " \t\n\r"); /* get address token * / strcat(env, strtok(NULL, " \t\n\r")); } else { from_found=FALSE; /* no From_ line * / strcat(env, cuserid(NULL)); /* default to user-id * / } (void) putenv(env); /* change $LOGNAME * / } if (pipe(fd) < 0) syserr("pipe"); /* prepare pipe * / switch (fork()) { /* fork to /bin/mail * / case -1: syserr("fork to /bin/mail"); case 0: if (close(0) < 0) /* close stdin * / syserr("close child stdin"); if (dup(fd[0]) != 0) /* stdin from pipe * / syserr("dup pipe to stdin"); if (close(fd[0]) < 0 || close(fd[1]) < 0) syserr("close child pipe"); #ifdef DEBUG (void) fprintf(stderr, "[set %s and exec %s]\n", env, BINMAIL); (void) fprintf(stderr, "Debugging through %s.\n", DEBUG); (void) execl(DEBUG, DEBUG, 0); (void) fprintf(stderr, "Cannot exec %s from %s.\n", DEBUG, argv[0]); exit(0); #else (void) execv(BINMAIL, argv); (void) fprintf(stderr, "Cannot exec %s from %s.\n", BINMAIL, argv[0]); exit(1); #endif } if (close(1) < 0) /* close stdout * / syserr("close parent stdout"); if (dup(fd[1]) != 1) /* stdout to pipe * / syserr("dup pipe to stdout"); if (close(fd[0]) < 0 || close(fd[1]) < 0) syserr("close parent pipe"); if (!from_found) (void) puts(line); /* 1st line not From_ * / while (gets(line) != NULL) /* send rest of msg * / (void) puts(line); exit(0); return(0); /* make lint happy * / }