home *** CD-ROM | disk | FTP | other *** search
- From: Gene Spafford <genrad!linus!gatech!spaf>
- Subject: Updates to GaTech Sendmail files
- Keywords: release 3
- Newsgroups: mod.sources
- Approved: jpn@panda.UUCP
-
- Mod.sources: Volume 3, Issue 28
- Submitted by: Gene Spafford <gatech!spaf>
-
-
- Nothing like a formal release to expose bugs....
-
- This package contains some enhancements, corrections, and more
- explanation of the things the GT sendmail configuration does.
- A few of the changed files are included in their entirety, but
- most of the files here are simply "diff" files which can be applied
- to the Release 2 files by "patch" or by hand.
-
- If you missed the posting of Release 2 to mod.sources, you can contact
- me directly for copies of Release 3, which is Release 2 with these
- changes in place.
-
- [
- or you can contact me, moderator for mod.sources and I will send you
- the original distribution. - send all requests to sources-request@panda
-
- - John P. Nelson (decvax!genrad!panda!jpn seismo!harvard!talcott!panda!jpn)
- ]
-
- As usual, please direct bug fixes and comments to me.
- ----
- Gene Spafford
- The Clouds Project, School of ICS, Georgia Tech, Atlanta GA 30332
- CSNet: Spaf @ GATech ARPA: Spaf%GATech.CSNet @ CSNet-Relay.ARPA
- uucp: ...!{akgua,decvax,hplabs,ihnp4,linus,seismo,ulysses}!gatech!spaf
-
-
-
- : to unbundle, "sh" this file -- DO NOT use csh
- : SHAR archive format. Archive created Sun Oct 27 18:12:58 EST 1985
- echo x - Changes
- sed 's/^X//' > Changes <<'+FUNKY+STUFF+'
- XThese are the changes between release 2 and release 3:
- X
- XMakefile -- minor changes to reflect addition of new patch files
- XPATCHES -- added some comments, changed TCP references to SMTP,
- X removed "-p" flag additions (see comments in the file).
- X *Whole* file included.
- XPATCHES2 -- new patches for sendmail -- see comments in file.
- X *Whole* file included.
- XPATCH3 -- new patches for sendmail to implement -oM option. See
- X comments in the file itself. *Whole* file included.
- XREADME -- brought comments and references up-to-date. Corrected
- X a number of errors. *Whole* file included.
- Xbase.m4 -- expanded the headers somewhat to take advantage of -oM flags.
- X Fixed a couple of small bugs. Added handling of special
- X a.DOMAIN!person type addresses (read new section in
- X overview.ms about this).
- Xcirrus.mc, gitpyr.mc, nimbus.mc, stratus.mc -- Added some aliases.
- Xgatech.mc -- a few bug fixes for UUCP mail. Added recognition of
- X a.DOMAIN!person style addresses (see overview.ms). Changed
- X named of DEC gateway to decwrl.dec.com.
- Xgtbase.m4 -- Added UK as a top-level domain, bug fixes.
- Xoverview.ms -- Corrections and added info on new addressing features.
- X *Whole* file included.
- Xuumail.m4 -- corrected a faulty comment field
- Xversion.m4 -- updated to identify this version.
- +FUNKY+STUFF+
- echo '-rw-r----- 1 spaf 1269 Oct 27 18:09 Changes (as sent)'
- chmod u=rw,g=r,o= Changes
- ls -l Changes
- echo x - README
- sed 's/^X//' > README <<'+FUNKY+STUFF+'
- XThe files in this package build the sendmail.cf files for machines at
- XGeorgia Tech. They are derived from the standard BSD 4.2 sendmail
- Xfiles, and form a set of sendmail files we received along with PMDF
- Xfrom the folks at CSNet. The CSNet set of files were put together by
- XRay Essick (essick@a.cs.uiuc.edu) and were a great help in putting this
- Xpackage together. Many of the individual rules were derived from
- Xvarious sources posted to the Usenet net.mail and net.sources
- Xnewsgroups. Credit is also due Rick Adams at seismo.css.gov for his
- Xcontinued comments and help in debugging some of headers, and to
- XStuart Stirling at emory.CSNET for help with some of the initial
- Xdebugging.
- X
- XContained in this package are the following:
- X1) MANIFEST which lists each file in the package, along with a
- X one line description of what it does;
- X2) KEY which describes macros used in the sendmail files;
- X3) source and Makefiles for building our various sendmail.cf files;
- X4) overview.ms, a paper describing how mail gets routed when
- X mailed to or through gatech (nroff -ms overview.ms | more);
- X5) uumail.c, the source to our rerouting mailer ("pathalias", which
- X is used to build the mailer database, has been posted multiple times
- X to the net and is not included). See the comments at the beginning
- X of the program before your try to install it;
- X6) PATCHES, PATCHES2 & PATCH3, which are a set of changes to the
- X sendmail code, needed to be implemented to make some of these
- X sendmail rules work optimally. Make sure to read about the corresponding
- X change to "rmail" described in the comments.
- X7) Files, which is a brief list of the data files which are present to
- X drive the sendmail on "gatech".
- X
- XThe remainder of this file is an overview of the environment in which
- Xthese files were developed and are used.
- X
- XThe machines using "sendmail" at Georgia Tech fall into 3 basic
- Xcategories: gateway ("gatech"), department machines on a common
- Xethernet ("stratus", "nimbus", et.al.), and campus machines not on the
- Xsame Ethernet as "gatech" (only "gt-cmmsr" so far). We have at least
- Xone Ethernet loop on campus which is separate from the ICS loop
- X("gtss", "gtqo", et. al.).
- X
- X"gatech" is intended to be the campus gateway machine. It is on the
- XICS common ethernet, has over 50 major uucp contacts known to the
- Xoutside world, has a CSNet connection, a number of direct asynchronous
- Xlinks, and a set of rotored phone lines. Sometime in the
- Xnot-too-distant future, it is possible that "gatech" will also be on
- Xthe Arpanet and/or Bitnet. It is also the "traditional" mail address
- Xknown to most outsiders. Thus, the machine is on 3 distinct networks,
- Xand has to be configured with the possibility of connecting to at least
- X1 other major international network in the near future.
- X
- XThe department machines currently are comprised of the Clouds research
- Xmachines "gt-stratus", "gt-cirrus", and "gt-nimbus", and the ICS/OCS
- XPyramid "gitpyr". They are connected via a common ethernet link, and
- Xthey all can speak TCP at each other. Other machines are expected to
- Xbe added to this group before long. Almost all of these machines have
- Xa single phone line and/or direct links for uucp to machines that can't
- Xspeak TCP. (We are trying to keep a consistant naming scheme in use,
- Xand thus all campus machines will henceforth be named with the prefix
- X"gt-" in the name. There are a few machines around which had
- Xestablished UUCP networks connections with different names before the
- Xdecision to use this standard came into being, and their names will
- Xprobably not change (e.g., "gitpyr") but we have "gt-" aliases for those
- Xmachines (e.g., "gt-pyr").)
- X
- X
- XThe third class of machine on campus runs sendmail but has no TCP
- Xconnection to the others because our Net/One bridge won't pass TCP
- Xpackets across the backbone. These sites use a phone line or Net/One
- Xvirtual circuit to connect to "gatech" and some of the other systems.
- XSome of these machines may talk to each other via Ethernet, but
- Xthere is no common connection amongst all of them.
- X
- XThe basic idea in our configuration is for users to be able to use
- Xaddresses of the forms:
- X site!user, site!site2!user, user@site.UUCP
- X user@site.CSNET, user@site.ARPA, user@site.MAILNET,
- X user@site.BITNET, user@site.DEC, site.DOMAIN!user
- Xand the local case: user@site.GTNET, site:user, user%site
- XWe'd also like to be able to use just "user@site" and let the mailer
- Xfigure it out. Here's how my sendmail files accomplish that:
- X
- XAll of the internal machines are simple: they merely canonicalize the
- Xaddress according to standard rule, look to see if it is a GTNET host
- Xthat they know and send the letter straight to that host. Local letters
- Xare handled appropriately. Any other address which looks like a network
- Xaddress is sent to the relay site, "gatech", except that each machine
- Xcan have a small number of direct UUCP connections to outside
- Xmachines. Ruleset zero for these systems check for these UUCP
- Xconnections. Note that we use a file (/usr/lib/mail/uucp.local) to
- Xhold the UUCP connection list so that we don't have to play around with
- Xthe actual sendmail configuration if we change contacts. The only
- Xthing one has to do to update the list of UUCP connections available on
- Xthat host is update the file. If you run with a frozen sendmail.cf, you
- Xalso have to type "/usr/lib/sendmail -bz".
- X
- XThe "gatech" machine is the complex one. Any address that the internal
- Xmachines are unable to handle gets bounced to this machine. The
- X"gatech" machine speaks to a plethora of people. "gatech" should be
- Xable to recognize and route any (valid) address. The "gatech" machine
- Xcompares UUCP addresses against a file similar to the way the other
- Xmachines handle them. Mail to the CSNET domain is sent to the PMDF
- Xmailer, which queues the letter for phone transmission to the
- XCSnet-relay host. Mail to the ARPA domain, since we have no direct
- XARPA connection (yet), is handed to the PMDF mailer for transmission to the
- XCSnet-relay, which is an ARPA host. Mail to the BITNET (IBM
- Xderivative) and MAILNET (through MIT-multics) machines are routed to
- Xthe host defined by the $B and $M macros. Mail to the DEC E-net is
- Xrouted to the site listed in the $E macro, currently "decwrl.dec.com".
- XMail to the OZ network (Australia) is routed to munnari.uucp ($Z).
- XSince we do not have connections to any of those networks, we instead
- Xappend the address of a known gateway to the address forming something
- Xlike: user@host.mailnet@mit-multics.arpa and then re-iterate through
- Xruleset 0 to get from our machine to the gateway.
- X
- XAny address without a domain gets converted into an address of the form
- X"user@site", and it makes an attempt to intuit the domain. This is done
- Xby checking (in order) the list of local sites, local uucp contacts (1
- Xhop), CSNET, ARPA, BITNET, UUCP, and DEC E-net sites. In the event of a
- Xmatch, the proper domain name is appended to the address and we
- Xre-iterate through ruleset zero. This catches a fair number of missing
- Xdomain problems and hasn't caused too much confusion about names in use
- Xin several domains.
- X
- XFinally, the "gatech" machine takes any left-over non-local names and
- Xreturns them to the sender with a message about the fact that there is
- Xan unknown host/domain name in his letter.
- X
- XThe UUCP mailer on "gatech" is a re-routing mailer. Any path or
- Xaddress handed to "uumail" gets an "optimal" path supplied to it. That
- Xis, the program steps through the address from ultimate destination to
- Xbeginning, and if it knows a path to that site it will substitute that
- Xpath for the remainder of the user-supplied path. For example, if the
- Xaddress "a!b!c!d!e!f" is provided to the mailer, and it knows how to
- Xget to site "d" via "z!y" (but no idea how to get to "e"), it will
- Xrewrite the path to be "z!y!d!e!f". The path database is built using
- X"pathalias" on the uucp map data obtained from the Usenix machine
- X("gatech" is a regional repository of UUCP map information and gets
- Xnear-synchronous copies of map updates).
- X
- XThe ruleset along with "uumail" rewrites the "To:" field to look like
- X"f@e.UUCP" since the user-supplied address-path is probably not the
- Xpath that the mailer is going to use. Note that this means that
- X"uumail.m4" and "uucpm.m4" are NOT identical in function -- beware if
- Xyou decide to use one of them as a base in building your own files.
- X"uucpm.m4" does not muck about with the "To:" field, nor does it
- Xreroute mail.
- X
- XThis uucp mechanism allows any of our users to simply address mail to
- X"foo@site.UUCP" and not worry about a path. It also optimizes message
- Xpaths provided when answering news articles, and it allows our
- Xneighbors without mail routing software to address mail to
- X"gatech!somesite!person" and expect the mail to get through, if
- Xpossible. So far, no one has complained about not being able to force
- Xa particular path through our mailer. In the 8+ months this mechanism
- Xhas been working, I've only discovered about 10 sites not registered
- Xwith the map project and thus ccausing mail to them to fail.
- X
- XThat's about it. If you find these useful in some way, great. If you
- Xshould find bugs or possible enhancements to these files, I would
- Xgreatly appreciate hearing about it.
- X----
- XGene Spafford
- XThe Clouds Project, School of ICS, Georgia Tech, Atlanta GA 30332
- XCSNet: Spaf @ GATech ARPA: Spaf%GATech.CSNet @ CSNet-Relay.ARPA
- Xuucp: ...!{akgua,allegra,hplabs,ihnp4,linus,seismo,ulysses}!gatech!spaf
- +FUNKY+STUFF+
- echo '-rw-r----- 1 spaf 9410 Oct 27 17:28 README (as sent)'
- chmod u=rw,g=r,o= README
- ls -l README
- echo x - PATCHES
- sed 's/^X//' > PATCHES <<'+FUNKY+STUFF+'
- XFrom: topaz!hedrick 17 Sept 1985
- X
- X[Note: These changes and comments are not the same as the ones posted
- Xto the net by topaz!hedrick. I have changed them so that mail received
- Xvia SMTP is labelled as such, rather than the orignal label of being
- Xreceived via SMTP (thanks to rick@seismo.css.gov for pointing this
- Xout).
- X
- XI also have removed the changes to add the "-p" flag and the comments
- Xassociated with it. The changes in file PATCH3 provided by oddjob!matt
- Xto use the -oMr flag instead seems to me to be more general and a
- Xbetter solution. In addition, it allows one to munge rmail to include
- Xthe sending (last relay) system via -oMs. EHS]
- X
- XHere are some patches to SENDMAIL.
- X 1) They allow us to handle an Arpanet host table containing names
- X like topaz.rutgers.edu. The original version of sendmail,
- X as well as sendmail.cf, assumed that all host names end in
- X .arpa. Changes may also be needed in UUCP and net news
- X if your site name does not end in .ARPA.
- X 2) They allow you to translate all host names to their
- X canonical forms, i.e. replace nicknames with the primary
- X name. This is now considered the correct thing to do on
- X the Arpanet. This adds an operator, $%, for doing the
- X mapping. WARNING: $% uses a single fixed location for
- X the translated address. Thus only one translated address
- X may be active at a time. This is fine for foo@bar,
- X but you could not normalize all of the host names in an
- X address like @foo,@bar:bar@gorp. In practice I don't
- X believe this is a problem.
- X 3) They allow you to make processing depend upon whether mail
- X arrived via UUCP or SMTP. In addition to the patches here,
- X you will need to modify rmail, or whatever program calls
- X sendmail to delivery UUCP mail. It should call sendmail
- X with an extra argument, -oMrUUCP. This adds an operator,
- X $&, for evaluating macros at runtime instead of when
- X sendmail.cf is loaded. $r is the name of the protocol via which
- X mail arrived. $r is set from the -oMr option, or by the
- X SMTP daemon code, which automatically sets it to the
- X value SMTP. The code for reading and writing queue files
- X saves the protocol in a line beginning with O. In case
- X a message gets queued, this allows us to remember which
- X way it arrived.
- X
- XOriginally, SENDMAIL would tack .ARPA onto your host name. This is
- Xa bad idea, since not all host names end in .ARPA. The assumption
- Xwas that your rc file said
- X hostname foo
- Xand this would turn it into foo.arpa. We now do
- X hostname foo.rutgers.edu
- Xand do not want .ARPA tacked on the end.
- X
- X*** daemon.c.ORIG Fri Feb 10 06:59:21 1984
- X--- daemon.c Sat Aug 3 07:49:46 1985
- X***************
- X*** 183,189
- X /* determine host name */
- X hp = gethostbyaddr(&otherend.sin_addr, sizeof otherend.sin_addr, AF_INET);
- X if (hp != NULL)
- X! (void) sprintf(buf, "%s.ARPA", hp->h_name);
- X else
- X /* this should produce a dotted quad */
- X (void) sprintf(buf, "%lx", otherend.sin_addr.s_addr);
- X
- X--- 185,191 -----
- X /* determine host name */
- X hp = gethostbyaddr(&otherend.sin_addr, sizeof otherend.sin_addr, AF_INET);
- X if (hp != NULL)
- X! (void) sprintf(buf, "%s", hp->h_name);
- X else
- X /* this should produce a dotted quad */
- X (void) sprintf(buf, "%lx", otherend.sin_addr.s_addr);
- X***************
- X
- XThe following patches add two operators: $% and $&. $% is used to
- Xmap host names into their canonical forms. Suppose a user sends mail
- Xto RED. This should be turned into the official name, RED.RUTGERS.EDU,
- Xin the headers. The fact that Unix does not do that causes problems
- Xto a number of mailers. It is a violation of the standards. $%n
- Xbehaves like $n, i.e. it is replaced with the nth thing on the left
- Xhand side. However before doing the replacement, the thing is looked
- Xup in /etc/hosts. If it is a host name or nickname, the official
- Xform of the host name is used instead.
- X
- X$& is part of a change to allow us to differentiate between UUCP and
- XSMTP mail. What does foo!bar@baz mean? If the mail arrived via UUCP,
- Xit is probably foo!<bar@baz>. If it arrived via SMTP, it is by
- Xdefinition <foo!bar>@baz. As we are a UUCP/SMTP gateway, it is
- Ximportant for us to get these things right. In order to do so, we
- Xhave done two things:
- X - implemented $r. This is documented as being the name of the
- X protocol via which the message arrived. However this was
- X not implemented. I implement it as follows:
- X - rmail calls sendmail with an option -oMrUUCP
- X - the sendmail daemon code sets SMTP automatically
- X - everything else should be local mail, and does
- X not set any value in this macro.
- X - when a queue entry is written, the protocol name
- X must be written out
- X - implemented a new operator $& to allow us to use the
- X value of $r in productions. You can't just use $r
- X on the right side of a production. It will be
- X evaluated when the freeze file is made. So $&r
- X is equivalent to $r, but is evaluated when the
- X rule is executed. This allows us to write rules
- X that differentiate. Here is the part of sendmail.cf
- X that uses it. It checks for foo!bar, but only if
- X the message arrived via UUCP. Note the use of $&r
- X to put the protocol name into the address, so we can
- X match on it.
- X
- XR$-!$* $:<$&r>$1!$2 check arriving protocol
- XR$-^$* $:<$&r>$1^$2 both syntaxes
- XR<UUCP>$-!$* $@$>7$2<@$1.UUCP> if via UUCP, resolve
- XR<UUCP>$-^$* $@$>7$2<@$1.UUCP> if via UUCP, resolve
- XR<$*>$* $2 undo kludge
- X
- X*** main.c.ORIG Fri Feb 10 11:17:52 1984
- X--- main.c Mon Aug 26 04:10:51 1985
- X***************
- X*** 538,543
- X /* at this point we are in a child: reset state */
- X OpMode = MD_SMTP;
- X (void) newenvelope(CurEnv);
- X openxscript(CurEnv);
- X #endif DAEMON
- X }
- X
- X--- 541,547 -----
- X /* at this point we are in a child: reset state */
- X OpMode = MD_SMTP;
- X (void) newenvelope(CurEnv);
- X+ define('r',"SMTP",CurEnv);
- X openxscript(CurEnv);
- X #endif DAEMON
- X }
- X***************
- X*** 701,706
- X
- X /* and finally the conditional operations */
- X '?', CONDIF, '|', CONDELSE, '.', CONDFI,
- X
- X '\0'
- X };
- X
- X--- 705,716 -----
- X
- X /* and finally the conditional operations */
- X '?', CONDIF, '|', CONDELSE, '.', CONDFI,
- X+
- X+ /* now the normalization operator */
- X+ '%', NORMREPL,
- X+
- X+ /* and run-time macro expansion */
- X+ '&', MACVALUE,
- X
- X '\0'
- X };
- X*** parseaddr.c.ORIG Fri Feb 10 06:59:12 1984
- X--- parseaddr.c Mon Aug 26 04:44:15 1985
- X***************
- X*** 394,400
- X expand("$o", buf, &buf[sizeof buf - 1], CurEnv);
- X (void) strcat(buf, DELIMCHARS);
- X }
- X! if (c == MATCHCLASS || c == MATCHREPL || c == MATCHNCLASS)
- X return (ONE);
- X if (c == '"')
- X return (QST);
- X
- X--- 394,401 -----
- X expand("$o", buf, &buf[sizeof buf - 1], CurEnv);
- X (void) strcat(buf, DELIMCHARS);
- X }
- X! if (c == MATCHCLASS || c == MATCHREPL || c == MATCHNCLASS ||
- X! c == MACVALUE || c == NORMREPL )
- X return (ONE);
- X if (c == '"')
- X return (QST);
- X***************
- X*** 446,451
- X
- X # define MAXMATCH 9 /* max params per rewrite */
- X
- X
- X rewrite(pvp, ruleset)
- X char **pvp;
- X
- X--- 447,453 -----
- X
- X # define MAXMATCH 9 /* max params per rewrite */
- X
- X+ char hostbuf[512];
- X
- X
- X rewrite(pvp, ruleset)
- X***************
- X*** 447,452
- X # define MAXMATCH 9 /* max params per rewrite */
- X
- X
- X rewrite(pvp, ruleset)
- X char **pvp;
- X int ruleset;
- X
- X--- 449,455 -----
- X
- X char hostbuf[512];
- X
- X+
- X rewrite(pvp, ruleset)
- X char **pvp;
- X int ruleset;
- X***************
- X*** 626,631
- X /* substitute */
- X for (avp = npvp; *rvp != NULL; rvp++)
- X {
- X register struct match *m;
- X register char **pp;
- X
- X
- X--- 629,635 -----
- X /* substitute */
- X for (avp = npvp; *rvp != NULL; rvp++)
- X {
- X+ #include <netdb.h>
- X register struct match *m;
- X register char **pp;
- X char **oldavp,**tavp;
- X***************
- X*** 628,633
- X {
- X register struct match *m;
- X register char **pp;
- X
- X rp = *rvp;
- X if (*rp != MATCHREPL)
- X
- X--- 632,640 -----
- X #include <netdb.h>
- X register struct match *m;
- X register char **pp;
- X+ char **oldavp,**tavp;
- X+ struct hostent *hostpt;
- X+ extern char *macvalue();
- X
- X rp = *rvp;
- X if ((*rp != MATCHREPL) && (*rp != NORMREPL))
- X***************
- X*** 630,636
- X register char **pp;
- X
- X rp = *rvp;
- X! if (*rp != MATCHREPL)
- X {
- X if (avp >= &npvp[MAXATOM])
- X {
- X
- X--- 637,643 -----
- X extern char *macvalue();
- X
- X rp = *rvp;
- X! if ((*rp != MATCHREPL) && (*rp != NORMREPL))
- X {
- X if (avp >= &npvp[MAXATOM])
- X {
- X***************
- X*** 637,643
- X syserr("rewrite: expansion too long");
- X return;
- X }
- X! *avp++ = rp;
- X continue;
- X }
- X
- X
- X--- 644,655 -----
- X syserr("rewrite: expansion too long");
- X return;
- X }
- X! if (*rp == MACVALUE) {
- X! if (macvalue(rp[1],CurEnv))
- X! *avp++ = macvalue(rp[1],CurEnv);
- X! }
- X! else
- X! *avp++ = rp;
- X continue;
- X }
- X
- X***************
- X*** 642,647
- X }
- X
- X /* substitute from LHS */
- X m = &mlist[rp[1] - '1'];
- X # ifdef DEBUG
- X if (tTd(21, 15))
- X
- X--- 654,660 -----
- X }
- X
- X /* substitute from LHS */
- X+
- X m = &mlist[rp[1] - '1'];
- X # ifdef DEBUG
- X if (tTd(21, 15))
- X***************
- X*** 658,663
- X }
- X # endif DEBUG
- X pp = m->first;
- X while (pp <= m->last)
- X {
- X if (avp >= &npvp[MAXATOM])
- X
- X--- 671,677 -----
- X }
- X # endif DEBUG
- X pp = m->first;
- X+ oldavp = avp;
- X while (pp <= m->last)
- X {
- X if (avp >= &npvp[MAXATOM])
- X***************
- X*** 666,671
- X return;
- X }
- X *avp++ = *pp++;
- X }
- X }
- X *avp++ = NULL;
- X
- X--- 680,695 -----
- X return;
- X }
- X *avp++ = *pp++;
- X+ }
- X+ if (*rp == NORMREPL) {
- X+ hostbuf[0] = '\0';
- X+ for (tavp = oldavp; tavp < avp; tavp++)
- X+ strcat(hostbuf,*tavp);
- X+ hostpt = gethostbyname(hostbuf);
- X+ if (hostpt) {
- X+ *oldavp = hostpt -> h_name;
- X+ avp = oldavp + 1;
- X+ }
- X }
- X }
- X *avp++ = NULL;
- X*** queue.c.ORIG Fri Feb 10 06:59:20 1984
- X--- queue.c Mon Aug 26 04:45:19 1985
- X***************
- X*** 105,110
- X /* output creation time */
- X fprintf(tfp, "T%ld\n", e->e_ctime);
- X
- X /* output name of data file */
- X fprintf(tfp, "D%s\n", e->e_df);
- X
- X
- X--- 105,115 -----
- X /* output creation time */
- X fprintf(tfp, "T%ld\n", e->e_ctime);
- X
- X+ /* output protocol */
- X+ if (macvalue('r',e)) {
- X+ fprintf(tfp, "O%s\n", macvalue('r',e));
- X+ }
- X+
- X /* output name of data file */
- X fprintf(tfp, "D%s\n", e->e_df);
- X
- X***************
- X*** 565,571
- X /*
- X ** Open the file created by queueup.
- X */
- X!
- X p = queuename(e, 'q');
- X f = fopen(p, "r");
- X if (f == NULL)
- X
- X--- 570,576 -----
- X /*
- X ** Open the file created by queueup.
- X */
- X!
- X p = queuename(e, 'q');
- X f = fopen(p, "r");
- X if (f == NULL)
- X***************
- X*** 575,580
- X }
- X FileName = p;
- X LineNumber = 0;
- X
- X /*
- X ** Read and process the file.
- X
- X--- 580,586 -----
- X }
- X FileName = p;
- X LineNumber = 0;
- X+ define('r',NULL,e);
- X
- X /*
- X ** Read and process the file.
- X***************
- X*** 595,600
- X (void) chompheader(&buf[1], FALSE);
- X break;
- X
- X case 'M': /* message */
- X e->e_message = newstr(&buf[1]);
- X break;
- X
- X--- 601,610 -----
- X (void) chompheader(&buf[1], FALSE);
- X break;
- X
- X+ case 'O':
- X+ define('r',newstr(&buf[1]),e);
- X+ break;
- X+
- X case 'M': /* message */
- X e->e_message = newstr(&buf[1]);
- X break;
- X***************
- X*** 628,634
- X break;
- X }
- X }
- X-
- X FileName = NULL;
- X }
- X /*
- X
- X--- 638,643 -----
- X break;
- X }
- X }
- X FileName = NULL;
- X }
- X /*
- X*** sendmail.h.ORIG Fri Feb 10 06:59:10 1984
- X--- sendmail.h Sat Aug 3 05:06:53 1985
- X***************
- X*** 290,295
- X # define CONDIF '\031' /* conditional if-then */
- X # define CONDELSE '\032' /* conditional else */
- X # define CONDFI '\033' /* conditional fi */
- X /*
- X ** Symbol table definitions
- X */
- X
- X--- 290,300 -----
- X # define CONDIF '\031' /* conditional if-then */
- X # define CONDELSE '\032' /* conditional else */
- X # define CONDFI '\033' /* conditional fi */
- X+
- X+ /* normalize Internet address operator */
- X+ # define NORMREPL '\034' /* normalized host replacement */
- X+ # define MACVALUE '\035' /* run-time macro value */
- X+
- X /*
- X ** Symbol table definitions
- X */
- X
- X
- +FUNKY+STUFF+
- echo '-rw-r----- 1 spaf 12105 Oct 27 17:28 PATCHES (as sent)'
- chmod u=rw,g=r,o= PATCHES
- ls -l PATCHES
- echo x - PATCHES2
- sed 's/^X//' > PATCHES2 <<'+FUNKY+STUFF+'
- XFrom: gatech!spaf
- X
- XThis keeps sendmail from tacking a spurious ".ARPA" onto the end of
- Xthe hostname when mail is received via SMTP.
- X
- X
- X*** daemon.c Mon Oct 14 15:10:49 1985
- X--- daemon.c.orig Mon Oct 14 15:10:22 1985
- X***************
- X*** 183,189
- X /* determine host name */
- X hp = gethostbyaddr(&otherend.sin_addr, sizeof otherend.sin_addr, AF_INET);
- X if (hp != NULL)
- X! (void) sprintf(buf, "%s", hp->h_name);
- X else
- X /* this should produce a dotted quad */
- X (void) sprintf(buf, "%lx", otherend.sin_addr.s_addr);
- X
- X--- 183,189 -----
- X /* determine host name */
- X hp = gethostbyaddr(&otherend.sin_addr, sizeof otherend.sin_addr, AF_INET);
- X if (hp != NULL)
- X! (void) sprintf(buf, "%s.ARPA", hp->h_name);
- X else
- X /* this should produce a dotted quad */
- X (void) sprintf(buf, "%lx", otherend.sin_addr.s_addr);
- +FUNKY+STUFF+
- echo '-rw-r----- 1 spaf 853 Oct 27 17:52 PATCHES2 (as sent)'
- chmod u=rw,g=r,o= PATCHES2
- ls -l PATCHES2
- echo x - PATCH3
- sed 's/^X//' > PATCH3 <<'+FUNKY+STUFF+'
- XFrom akgua!packard!ihnp4!oddjob!matt Wed Oct 16 01:59:25 1985
- X
- XOne thing strikes me immediately: I have rmail pass the flag
- X"-oMrUUCP" to sendmail, rather than inventing a new flag.
- XHowever, this required fixing a different sendmail bug so that
- XI could also give "-oMsneighbor".
- X
- X*** /tmp/readcf.c.old Tue Oct 15 18:54:21 1985
- X--- /tmp/readcf.c Tue Oct 15 18:54:24 1985
- X***************
- X*** 633,639
- X else if (tTd(37, 1))
- X printf("\n");
- X #endif DEBUG
- X! if (sticky)
- X setbitn(opt, StickyOpt);
- X
- X if (getruid() == 0)
- X
- X--- 637,643 -----
- X else if (tTd(37, 1))
- X printf("\n");
- X #endif DEBUG
- X! if (sticky && opt != 'M') /* 'M' should never be sticky ! */
- X setbitn(opt, StickyOpt);
- X
- X if (getruid() == 0)
- X
- +FUNKY+STUFF+
- echo '-rw-r----- 1 spaf 722 Oct 27 17:52 PATCH3 (as sent)'
- chmod u=rw,g=r,o= PATCH3
- ls -l PATCH3
- echo x - Makefile.diff
- sed 's/^X//' > Makefile.diff <<'+FUNKY+STUFF+'
- X5c5
- X< # $Header: Makefile,v 5.6 85/10/26 18:59:46 spaf Release $
- X---
- X> # $Header: Makefile,v 5.5 85/10/13 21:17:06 spaf Release $
- X31c31
- X< PATCHES2 PATCH3 uumail.c overview.ms Files
- X---
- X> uumail.c overview.ms Files
- +FUNKY+STUFF+
- echo '-rw-r----- 1 spaf 218 Oct 27 17:38 Makefile.diff (as sent)'
- chmod u=rw,g=r,o= Makefile.diff
- ls -l Makefile.diff
- echo x - overview.ms
- sed 's/^X//' > overview.ms <<'+FUNKY+STUFF+'
- X.TL
- XMail Handling at Gatech
- X.br
- XRevision III
- X.AU
- XGene Spafford
- X.AI
- XSchool of Information and Computer Science
- XGeorgia Institute of Technology
- X27 October 1985
- X.PP
- XSite "gatech" is running a "smart" version of sendmail. I have
- Xhacked at the sendmail configuration files extensively, and although
- Xthey are not yet doing 100% of what I want, they seem to work pretty well
- Xand handle our many (sometimes unusual) mail needs.
- XWhat follows are brief descriptions of what happens to various bits of
- Xmail passing through our site.
- X.PP
- XThere have been some changes since the last time I circulated this
- Xdocument. Most of the changes have been inspired (?) by the changes
- Xto sendmail done at Rutgers which allow "sendmail" to distinguish
- Xthe source of incoming mail with mixed syntax addresses (e.g., a!b@c),
- Xand which rewrite the names of Internet hosts into the preferred form
- X(as given in the /etc/hosts table, derived from NIC data).
- X.NH 1
- XWhy
- X.PP
- XSite "gatech" is directly on the uucp network
- X(with over 75 contacts and acting as a de facto name server for a
- X"southeast US domain"), the CSNet, and we serve as gateway for
- Xour local networks. We also have network traffic with some other
- Xmajor networks, and we might possibly get BITNET and ARPA access in
- Xthe not-too-distant future, from "gatech" or some other campus machines.
- XWe'd like to have as complete and robust
- Xa mailing environment as possible. At the same time, we'd like
- Xto minimize our current phone bills as they are related to UUCP mail
- Xtraffic.
- X.NH 1
- XRouting
- X.NH 2
- XKnown Domains
- X.PP
- XCurrently, there is considerable effort going on to identify and
- Xestablish domains for mailing. Some of these domains are already
- Xestablished, if only in a de facto manner. Our sendmail
- Xcurrently recognizes the following well-known domains: ARPA, CSNET,
- XGOV, EDU, COM, MIL, ORG, NET, UK,
- XUUCP, BITNET, DEC, and MAILNET. The following
- Xare also recognized when used as top-level domains:
- XGTNET (local to Georgia Tech), OZ (the Australian network),
- XTEK (recognized internal to Tektronix), and SDC (with sdcrdcf as the gateway).
- X.PP
- XThere are a number of other "domains" that are recognized when used
- Xin a second-level position within a uucp address. That is, we
- Xrecognize person@site.ATT.UUCP as something that should be
- Xdirected to cbosgd via uucp for further resolution. This recognition
- Xis done by building psuedo-sites into the uucp routing database
- Xbased upon the data distributed by the uucp map project.
- XAmong domains recognized like this are NCAL, SCAL, ATL, ATT, and
- Xso on; the list may change based on updates to the map.
- X(As an aside, at the time of this writing, "gatech" is one of
- Xthe regional repositories of the current map, and we get automatic
- Xupdates whenever the "real" map gets changed.)
- X.PP
- XIn the following descriptions, any of the above can be used in
- Xplace of a "DOMAIN" specifier.
- X.NH 2
- Xuser@host[.DOMAIN] -and- user%host[.DOMAIN]
- X.PP
- XIf mail comes in addressed specifically to one of the known domains,
- Xit is routed as described in the next section without any further
- Xchanges. If the domain is not given, an attempt is made to derive
- Xthe domain based on available lists of host names and aliases,
- Xand then routed as described in the next section. If no host/domain
- Xmatch can be found, the mail is returned with an error stating this.
- X.NH 3
- XDomain Derivation
- X.PP
- XHost derivation is attempted in the following order: First, the
- Xhost is checked to see if it is in the GTNET domain. Next, the
- Xhost is checked to see if it is a host one hop away via UUCP. Next,
- Xthe host is checked against all CSNET sites. Then it is checked
- Xagainst all Arpa Internet sites. Next, it is checked against the list of
- Xknown MAILNET hosts. Then it is checked against the list of all (other) known
- XUUCP sites. Then it is checked against the list of
- Xknown BITNET hosts. Finally, it is checked against the list
- Xof known DEC E-net sites.
- X.PP
- XThis kind of checking is not 100% accurate because our lists are not
- Xalways up-to-date. In particular, the Arpa list is updated infrequently
- Xdue to the fact that we aren't actually on the Arpanet, and there is no
- Xlist of DEC net sites available outside of DEC (we make due with
- Xgleaning names from posted news articles and exchanges with other sites
- Xinterested in compiling such a list).
- X.NH 3
- XCollisions
- X.PP
- XIf the same hostname exists in more than one domain, the first match
- Xfound will be the one used. Qualification of the address with an
- Xexplicit domain specifier will ensure that the mail goes to the
- Xcorrect host (when routed through gatech). That is, the domain
- Xis considered to be the specifer for routing and if one is not
- Xexplicitly provided (or implicitly, as in the case of "!" notation),
- Xthen an attempt to made to guess a domain.
- X.NH 2
- Xhost1!host2!host3...!hostn!user
- X.PP
- XStarting with "hostn" and working backwards to "host1" our mailer
- Xwill attempt to find a host listed in our master UUCP path database.
- XThis database is generated using pathalias at least weekly based on the latest
- Xversion of the uucp maps. If a match is found at "hostk", then the
- Xaddress is rewritten to be "<path to hostk>!hostk!...hostn!user"
- Xand then mailed via UUCP. Such addresses are
- X.B never
- Xrouted over
- Xany other network, unless "hostn" is recognized to be a GTNET
- Xhost, in which case our internal transport mechanism is invoked, or
- Xunless a domain specifier is present in "host1" (see next section).
- X.PP
- XThere is
- X.B no
- Xway at present to force a path on UUCP mail through "gatech".
- XThis is perhaps a "not very good thing" but I can't come up with a good
- Xway to work in explicit paths. The map data is generally very good
- Xand I have observed very, very few failures since we first started
- Xdoing this rewriting about 6 months ago. If this presents a
- Xmajor problem for someone, let me know and I'll see what I can work out.
- X.NH 2
- Xhost.DOMAIN!person
- X.PP
- XThis is a special case and mail to an address such as this is handled
- Xin a reasonably sane manner. That is, the mail is sent to user@host.DOMAIN
- Xby the proper transmission medium (probably
- X.B not
- XUUCP). This is the same syntax that gateways like
- X.I seismo
- Xand
- X.I ucbvax
- Xuse to leave the UUCP mail "domain." Thus, mail
- Xto ...gatech!seismo.css.gov!rick will, in fact, get to Rick Adams at
- Xseismo via UUCP to gatech, PMDF to CSNet-Relay, and Arpa to seismo.
- X.PP
- XFor this notational form to work, the
- X.B first
- Xcomponent of the address seen at gatech must be qualified with one of the recognized
- Xtop-level domains (EDU, ARPA, CSNET, BITNET, etc.).
- X.B No
- Xattempt is made to validate the hostname or the remainder of the
- Xaddress (the part after the first "!") since we don't know about
- Xsecond level domains or syntaxes in most cases (nor should be expected
- Xto be so aware -- that's the whole idea behind domain addressing).
- X.NH 2
- Xhost1!host2!host3...!hostn!user@site[.DOMAIN]
- X.br
- Xhost1!host2!host3...!hostn!user%site[.DOMAIN]
- X.PP
- XThis one diverges somewhat from the standard (RFC822 et.al.).
- XThe way these addresses get treated is based on the way the mail
- Xgets into our "sendmail." If the message originates on any of the
- Xlocal (GTNET) machines, or if it comes in via PMDF from CSNet, then
- Xthe mail is routed to "site" for eventual delivery to host1!...hostn!user.
- XMail coming in via a UUCP link with a mixed-mode address like this will
- Xhave the mail routed via uucp to hostn for eventual delivery to
- Xuser@site. Thus, if one of our neighbors, such as someone at akgua,
- Xwere to send mail to us addressed as seismo!person@ucbvax.ARPA, we would
- Xsend the mail to seismo via uucp and present it to their "rmail"
- Xprogram as "rmail person@ucbvax.ARPA".
- X.PP
- XOn the other hand, should someone on gitpyr send mail addressed
- Xas seismo!person@ucbvax.ARPA, it would arrive at Gatech via SMTP and
- Xthen be sent to CSNet-relay via PMDF for delivery to site "ucbvax" with
- Xa request to be delivered to "seismo!person" relative to that site.
- XIn most cases, depending on the sites involved,
- Xthis kind of treatment would result in the mail failing. The sendmail
- Xconfigurations I have created for all the local GTNET sites are such
- Xthat it should not be required to specify such an address. Simply
- Xmailing to person@site should see the correct address and network
- Xtransport mechanism chosen. The Usenet "news" programs on most of these
- Xsites have been built to use the Internet-style of address when
- Xmailing replies, so there should be few cases of users even seeing mixed
- Xmode addresses presented to them (mail passing through any of the mailers
- Xgets rewritten to show a consistent format).
- X.NH 2
- Xuser%site1%site2%site3
- X.PP
- XAddresses of this format get turned into user%site1%site2@site3,
- Xand an appropriate routing is provided to "site3," if known.
- X.NH 2
- XOther network characters
- X.PP
- XThe ":" delimiter gets turned into "!" symbols in any address
- Xpresented to our sendmail.
- XThe "^" delimiter gets turned into "!" also. Addresses of the
- Xform "site=user" get turned into "user@site.BITNET" by convention.
- X.NH 1
- XErrors
- X.PP
- XI have tried to trap all possible errors and generate return mail
- Xwith meaningful messages.
- XIf you get errors you don't know how to interpret, please contact me.
- X.NH 1
- XSource
- X.PP
- XI posted an ancestor of my current sendmail files to "mod.sources" a
- Xfew months ago. If these latest versions appear stable, I will post
- Xthem to the same place. If you'd like a copy right away, let me know.
- XThis includes the sendmail files for all the local GTNET machines, and
- Xthe source for my "uumail" program which sits between sendmail and
- Xuux.
- +FUNKY+STUFF+
- echo '-rw-r----- 1 spaf 9504 Oct 27 17:28 overview.ms (as sent)'
- chmod u=rw,g=r,o= overview.ms
- ls -l overview.ms
- echo x - base.m4.diff
- sed 's/^X//' > base.m4.diff <<'+FUNKY+STUFF+'
- X12c12
- X< # $Header: base.m4,v 5.6 85/10/26 19:54:34 spaf Release $
- X---
- X> # $Header: base.m4,v 5.1 85/10/13 20:45:34 spaf Release $
- X39,41d38
- X< # wait for aliases to be up-to-date, and create them if need be
- X< Oa
- X< OD
- X90d86
- X< Tspaf
- X99c95
- X< HReceived: $?sfrom $s $.by $j $?rwith $r $.($v/$V)
- X---
- X> HReceived: $?sfrom $s $.by $j ($v/$V)
- X108c104
- X< H?l?Received-Date: $b
- X---
- X> # H?l?Received-Date: $b
- X173,176c169,171
- X< R$+!$* $:<$&r>$1!$2 check arriving protocol
- X< R$+^$* $:<$&r>$1!$2 both syntaxes
- X< R<UUCP>$*@$-.UUCP $@$>6$1<@$2.UUCP> ...if the second time
- X< R<UUCP>$+!$* $@$>6$2<@$1.UUCP> if via UUCP, resolve
- X---
- X> R$-!$* $:<$&r>$1!$2 check arriving protocol
- X> R$-^$* $:<$&r>$1!$2 both syntaxes
- X> R<UUCP>$-!$* $@$>6$2<@$1.UUCP> if via UUCP, resolve
- +FUNKY+STUFF+
- echo '-rw-r----- 1 spaf 769 Oct 27 17:38 base.m4.diff (as sent)'
- chmod u=rw,g=r,o= base.m4.diff
- ls -l base.m4.diff
- echo x - cirrus.mc.diff
- sed 's/^X//' > cirrus.mc.diff <<'+FUNKY+STUFF+'
- X6c6
- X< ##### $Header: cirrus.mc,v 5.2 85/10/26 18:46:40 spaf Release $
- X---
- X> ##### $Header: cirrus.mc,v 5.1 85/10/13 20:38:11 spaf Release $
- X18c18
- X< Cwgt-cirrus cirrus
- X---
- X> Cwgt-cirrus cirrus Cirrus CIRRUS GT-Cirrus GT-CIRRUS GT-cirrus
- +FUNKY+STUFF+
- echo '-rw-r----- 1 spaf 237 Oct 27 17:38 cirrus.mc.diff (as sent)'
- chmod u=rw,g=r,o= cirrus.mc.diff
- ls -l cirrus.mc.diff
- echo x - gatech.mc.diff
- sed 's/^X//' > gatech.mc.diff <<'+FUNKY+STUFF+'
- X9c9
- X< ##### $Header: gatech.mc,v 5.3 85/10/27 16:07:45 spaf Release $
- X---
- X> ##### $Header: gatech.mc,v 5.1 85/10/13 20:38:16 spaf Release $
- X21c21
- X< Cwgatech ga-tech georgia-tech gt-tech gt-gatech
- X---
- X> Cwgatech ga-tech georgia-tech
- X28c28
- X< CUgatech gt-tech gt-gatech georgia-tech
- X---
- X> CUgatech GATech GaTech
- X47c47
- X< DEdecwrl.dec.com
- X---
- X> DEdecwrl.arpa
- X77d76
- X< R$+<@$+.$=T.UUCP> $1<@$2.$3> a.arpa.uucp -> a.arpa
- +FUNKY+STUFF+
- echo '-rw-r----- 1 spaf 415 Oct 27 17:53 gatech.mc.diff (as sent)'
- chmod u=rw,g=r,o= gatech.mc.diff
- ls -l gatech.mc.diff
- echo x - gitpyr.mc.diff
- sed 's/^X//' > gitpyr.mc.diff <<'+FUNKY+STUFF+'
- X6c6
- X< ##### $Header: gitpyr.mc,v 5.2 85/10/26 18:52:54 spaf Release $
- X---
- X> ##### $Header: gitpyr.mc,v 5.1 85/10/13 20:38:21 spaf Release $
- X18c18
- X< Cwgitpyr gt-gitpyr gt-pyr gt-pyramid
- X---
- X> Cwgitpyr Gitpyr GITPYR
- X22c22
- X< CUgitpyr gt-gitpyr gt-pyr gt-pyramid
- X---
- X> CUgitpyr
- +FUNKY+STUFF+
- echo '-rw-r----- 1 spaf 274 Oct 27 17:38 gitpyr.mc.diff (as sent)'
- chmod u=rw,g=r,o= gitpyr.mc.diff
- ls -l gitpyr.mc.diff
- echo x - gtbase.m4.diff
- sed 's/^X//' > gtbase.m4.diff <<'+FUNKY+STUFF+'
- X6c6
- X< # $Header: gtbase.m4,v 5.2 85/10/26 18:53:29 spaf Release $
- X---
- X> # $Header: gtbase.m4,v 5.1 85/10/13 20:45:55 spaf Release $
- X17c17
- X< CDgtnet gatech git gt
- X---
- X> CDgtnet GTNET GTNet GtNet GTnet
- X33c33
- X< CTARPA UUCP BITNET CSNET MAILNET DEC EDU GOV MIL COM ORG NET OZ UK
- X---
- X> CTARPA UUCP BITNET CSNET MAILNET DEC EDU GOV MIL COM ORG NET OZ
- X36c36
- X< CKARPA EDU GOV MIL COM ORG NET UK
- X---
- X> CKARPA EDU GOV MIL COM ORG NET
- X58c58
- X< R$*<@$*$=D.$=T>$* $1<@$2LOCAL>$5 catch "gtnet.csnet"
- X---
- X> R$*<@$*$=D.$=T>$* $1<@$2LOCAL>$4 catch "gtnet.csnet"
- +FUNKY+STUFF+
- echo '-rw-r----- 1 spaf 550 Oct 27 17:38 gtbase.m4.diff (as sent)'
- chmod u=rw,g=r,o= gtbase.m4.diff
- ls -l gtbase.m4.diff
- echo x - nimbus.mc.diff
- sed 's/^X//' > nimbus.mc.diff <<'+FUNKY+STUFF+'
- X6c6
- X< ##### $Header: nimbus.mc,v 5.2 85/10/26 18:46:12 spaf Release $
- X---
- X> ##### $Header: nimbus.mc,v 5.1 85/10/13 20:38:35 spaf Release $
- X18c18
- X< Cwgt-nimbus nimbus
- X---
- X> Cwgt-nimbus nimbus NIMBUS Nimbus GT-Nimbus GT-nimbus GT-NIMBUS
- +FUNKY+STUFF+
- echo '-rw-r----- 1 spaf 237 Oct 27 17:38 nimbus.mc.diff (as sent)'
- chmod u=rw,g=r,o= nimbus.mc.diff
- ls -l nimbus.mc.diff
- echo x - stratus.mc.diff
- sed 's/^X//' > stratus.mc.diff <<'+FUNKY+STUFF+'
- X6c6
- X< ##### $Header: stratus.mc,v 5.2 85/10/26 18:45:39 spaf Release $
- X---
- X> ##### $Header: stratus.mc,v 5.1 85/10/13 20:38:39 spaf Release $
- X18c18
- X< Cwgt-stratus stratus
- X---
- X> Cwgt-stratus stratus STRATUS GT-Stratus GT-STRATUS
- +FUNKY+STUFF+
- echo '-rw-r----- 1 spaf 229 Oct 27 17:39 stratus.mc.diff (as sent)'
- chmod u=rw,g=r,o= stratus.mc.diff
- ls -l stratus.mc.diff
- echo x - uumail.m4.diff
- sed 's/^X//' > uumail.m4.diff <<'+FUNKY+STUFF+'
- X7c7
- X< ##### $Header: uumail.m4,v 5.2 85/10/26 18:40:33 spaf Release $
- X---
- X> ##### $Header: uumail.m4,v 5.1 85/10/13 20:46:17 spaf Release $
- X34c34
- X< R$+<@$-.LOCAL> $2!$1 u@h.LOCAL => h!u
- X---
- X> R$+<@$-.LOCAL> $2!$1 u@h.LOCAL => u%h
- +FUNKY+STUFF+
- echo '-rw-r----- 1 spaf 242 Oct 27 17:39 uumail.m4.diff (as sent)'
- chmod u=rw,g=r,o= uumail.m4.diff
- ls -l uumail.m4.diff
- echo x - version.m4.diff
- sed 's/^X//' > version.m4.diff <<'+FUNKY+STUFF+'
- X1c1
- X< # $Header: version.m4,v 5.3 85/10/26 18:39:43 spaf Release $
- X---
- X> # $Header: version.m4,v 5.1 85/10/13 20:46:20 spaf Release $
- X3c3
- X< DV6.0.GT
- X---
- X> DV5.8.GaTech
- +FUNKY+STUFF+
- echo '-rw-r----- 1 spaf 168 Oct 27 17:39 version.m4.diff (as sent)'
- chmod u=rw,g=r,o= version.m4.diff
- ls -l version.m4.diff
- exit 0
-
-