home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume3 / gatech1 < prev    next >
Internet Message Format  |  1986-11-30  |  43KB

  1. From: Gene Spafford <genrad!linus!gatech!spaf>
  2. Subject: Updates to GaTech Sendmail files
  3. Keywords: release 3
  4. Newsgroups: mod.sources
  5. Approved: jpn@panda.UUCP
  6.  
  7. Mod.sources:  Volume 3, Issue 28
  8. Submitted by: Gene Spafford <gatech!spaf>
  9.  
  10.  
  11. Nothing like a formal release to expose bugs....
  12.  
  13. This package contains some enhancements, corrections, and more
  14. explanation of the things the GT sendmail configuration does.
  15. A few of the changed files are included in their entirety, but 
  16. most of the files here are simply "diff" files which can be applied
  17. to the Release 2 files by "patch" or by hand.
  18.  
  19. If you missed the posting of Release 2 to mod.sources, you can contact
  20. me directly for copies of Release 3, which is Release 2 with these
  21. changes in place.
  22.  
  23. [
  24.   or you can contact me, moderator for mod.sources and I will send you
  25.   the original distribution. - send all requests to sources-request@panda
  26.  
  27.   - John P. Nelson (decvax!genrad!panda!jpn  seismo!harvard!talcott!panda!jpn)
  28. ]
  29.  
  30. As usual, please direct bug fixes and comments to me.
  31. ----
  32. Gene Spafford
  33. The Clouds Project, School of ICS, Georgia Tech, Atlanta GA 30332
  34. CSNet:    Spaf @ GATech        ARPA:    Spaf%GATech.CSNet @ CSNet-Relay.ARPA
  35. uucp:    ...!{akgua,decvax,hplabs,ihnp4,linus,seismo,ulysses}!gatech!spaf
  36.  
  37.  
  38.  
  39. : to unbundle, "sh" this file -- DO NOT use csh
  40. :  SHAR archive format.  Archive created Sun Oct 27 18:12:58 EST 1985
  41. echo x - Changes
  42. sed 's/^X//' > Changes <<'+FUNKY+STUFF+'
  43. XThese are the changes between release 2 and release 3:
  44. X
  45. XMakefile -- minor changes to reflect addition of new patch files
  46. XPATCHES -- added some comments, changed TCP references to SMTP,
  47. X    removed "-p" flag additions (see comments in the file).
  48. X    *Whole* file included.
  49. XPATCHES2 -- new patches for sendmail -- see comments in file.
  50. X    *Whole* file included.
  51. XPATCH3 -- new patches for sendmail to implement -oM option.  See
  52. X    comments in the file itself.  *Whole* file included.
  53. XREADME -- brought comments and references up-to-date.  Corrected
  54. X    a number of errors.  *Whole* file included.
  55. Xbase.m4 -- expanded the headers somewhat to take advantage of -oM flags.
  56. X    Fixed a couple of small bugs.  Added handling of special
  57. X    a.DOMAIN!person type addresses (read new section in
  58. X    overview.ms about this).
  59. Xcirrus.mc, gitpyr.mc, nimbus.mc, stratus.mc -- Added some aliases.
  60. Xgatech.mc -- a few bug fixes for UUCP mail.  Added recognition of
  61. X    a.DOMAIN!person style addresses (see overview.ms). Changed
  62. X    named of DEC gateway to decwrl.dec.com.
  63. Xgtbase.m4 -- Added UK as a top-level domain, bug fixes.
  64. Xoverview.ms -- Corrections and added info on new addressing features.
  65. X    *Whole* file included.
  66. Xuumail.m4 -- corrected a faulty comment field
  67. Xversion.m4 -- updated to identify this version.
  68. +FUNKY+STUFF+
  69. echo '-rw-r-----  1 spaf         1269 Oct 27 18:09 Changes    (as sent)'
  70. chmod u=rw,g=r,o= Changes
  71. ls -l Changes
  72. echo x - README
  73. sed 's/^X//' > README <<'+FUNKY+STUFF+'
  74. XThe files in this package build the sendmail.cf files for machines at
  75. XGeorgia Tech.  They are derived from the standard BSD 4.2 sendmail
  76. Xfiles, and form a set of sendmail files we received along with PMDF
  77. Xfrom the folks at CSNet.  The CSNet set of files were put together by
  78. XRay Essick (essick@a.cs.uiuc.edu) and were a great help in putting this
  79. Xpackage together.  Many of the individual rules were derived from
  80. Xvarious sources posted to the Usenet net.mail and net.sources
  81. Xnewsgroups.  Credit is also due Rick Adams at seismo.css.gov for his
  82. Xcontinued comments and help in debugging some of headers, and to
  83. XStuart Stirling at emory.CSNET for help with some of the initial
  84. Xdebugging.
  85. X
  86. XContained in this package are the following:
  87. X1) MANIFEST which lists each file in the package, along with a
  88. X   one line description of what it does;
  89. X2) KEY which describes macros used in the sendmail files;
  90. X3) source and Makefiles for building our various sendmail.cf files;
  91. X4) overview.ms, a paper describing how mail gets routed when
  92. X   mailed to or through gatech (nroff -ms overview.ms | more);
  93. X5) uumail.c, the source to our rerouting mailer ("pathalias", which
  94. X   is used to build the mailer database, has been posted multiple times
  95. X   to the net and is not included).  See the comments at the beginning
  96. X   of the program before your try to install it;
  97. X6) PATCHES, PATCHES2 & PATCH3, which are a set of changes to the
  98. X   sendmail code, needed to be implemented to make some of these
  99. X   sendmail rules work optimally.  Make sure to read about the corresponding
  100. X   change to "rmail" described in the comments.
  101. X7) Files, which is a brief list of the data files which are present to
  102. X   drive the sendmail on "gatech".
  103. X
  104. XThe remainder of this file is an overview of the environment in which
  105. Xthese files were developed and are used.
  106. X
  107. XThe machines using "sendmail" at Georgia Tech fall into 3 basic
  108. Xcategories: gateway ("gatech"), department machines on a common
  109. Xethernet ("stratus", "nimbus", et.al.), and campus machines not on the
  110. Xsame Ethernet as "gatech" (only "gt-cmmsr" so far).  We have at least
  111. Xone Ethernet loop on campus which is separate from the ICS loop
  112. X("gtss", "gtqo", et. al.).
  113. X
  114. X"gatech" is intended to be the campus gateway machine.  It is on the
  115. XICS common ethernet, has over 50 major uucp contacts known to the
  116. Xoutside world, has a CSNet connection, a number of direct asynchronous
  117. Xlinks, and a set of rotored phone lines.  Sometime in the
  118. Xnot-too-distant future, it is possible that "gatech" will also be on
  119. Xthe Arpanet and/or Bitnet. It is also the "traditional" mail address
  120. Xknown to most outsiders.  Thus, the machine is on 3 distinct networks,
  121. Xand has to be configured with the possibility of connecting to at least
  122. X1 other major international network in the near future.
  123. X
  124. XThe department machines currently are comprised of the Clouds research
  125. Xmachines "gt-stratus", "gt-cirrus", and "gt-nimbus", and the ICS/OCS
  126. XPyramid "gitpyr".  They are connected via a common ethernet link, and
  127. Xthey all can speak TCP at each other.  Other machines are expected to
  128. Xbe added to this group before long.  Almost all of these machines have
  129. Xa single phone line and/or direct links for uucp to machines that can't
  130. Xspeak TCP.  (We are trying to keep a consistant naming scheme in use,
  131. Xand thus all campus machines will henceforth be named with the prefix
  132. X"gt-" in the name.  There are a few machines around which had
  133. Xestablished UUCP networks connections with different names before the
  134. Xdecision to use this standard came into being, and their names will
  135. Xprobably not change (e.g., "gitpyr") but we have "gt-" aliases for those
  136. Xmachines (e.g., "gt-pyr").)
  137. X
  138. X
  139. XThe third class of machine on campus runs sendmail but has no TCP
  140. Xconnection to the others because our Net/One bridge won't pass TCP
  141. Xpackets across the backbone.  These sites use a phone line or Net/One
  142. Xvirtual circuit to connect to "gatech" and some of the other systems.
  143. XSome of these machines may talk to each other via Ethernet, but
  144. Xthere is no common connection amongst all of them.
  145. X
  146. XThe basic idea in our configuration is for users to be able to use
  147. Xaddresses of the forms:
  148. X        site!user, site!site2!user, user@site.UUCP
  149. X        user@site.CSNET, user@site.ARPA, user@site.MAILNET,
  150. X        user@site.BITNET, user@site.DEC, site.DOMAIN!user
  151. Xand the local case:     user@site.GTNET, site:user, user%site
  152. XWe'd also like to be able to use just "user@site" and let the mailer
  153. Xfigure it out.  Here's how my sendmail files accomplish that:
  154. X
  155. XAll of the internal machines are simple: they merely canonicalize the
  156. Xaddress according to standard rule, look to see if it is a GTNET host
  157. Xthat they know and send the letter straight to that host. Local letters
  158. Xare handled appropriately. Any other address which looks like a network
  159. Xaddress is sent to the relay site, "gatech", except that each machine
  160. Xcan have a small number of direct UUCP connections to outside
  161. Xmachines.  Ruleset zero for these systems check for these UUCP
  162. Xconnections.  Note that we use a file (/usr/lib/mail/uucp.local) to
  163. Xhold the UUCP connection list so that we don't have to play around with
  164. Xthe actual sendmail configuration if we change contacts.  The only
  165. Xthing one has to do to update the list of UUCP connections available on
  166. Xthat host is update the file. If you run with a frozen sendmail.cf, you
  167. Xalso have to type "/usr/lib/sendmail -bz".
  168. X
  169. XThe "gatech" machine is the complex one.  Any address that the internal
  170. Xmachines are unable to handle gets bounced to this machine. The
  171. X"gatech" machine speaks to a plethora of people. "gatech" should be
  172. Xable to recognize and route any (valid) address.  The "gatech" machine
  173. Xcompares UUCP addresses against a file similar to the way the other
  174. Xmachines handle them.  Mail to the CSNET domain is sent to the PMDF
  175. Xmailer, which queues the letter for phone transmission to the
  176. XCSnet-relay host.  Mail to the ARPA domain, since we have no direct
  177. XARPA connection (yet), is handed to the PMDF mailer for transmission to the
  178. XCSnet-relay, which is an ARPA host.  Mail to the BITNET (IBM
  179. Xderivative) and MAILNET (through MIT-multics) machines are routed to
  180. Xthe host defined by the $B and $M macros.  Mail to the DEC E-net is
  181. Xrouted to the site listed in the $E macro, currently "decwrl.dec.com".
  182. XMail to the OZ network (Australia) is routed to munnari.uucp ($Z).
  183. XSince we do not have connections to any of those networks, we instead
  184. Xappend the address of a known gateway to the address forming something
  185. Xlike: user@host.mailnet@mit-multics.arpa and then re-iterate through
  186. Xruleset 0 to get from our machine to the gateway.
  187. X
  188. XAny address without a domain gets converted into an address of the form
  189. X"user@site", and it makes an attempt to intuit the domain. This is done
  190. Xby checking (in order) the list of local sites, local uucp contacts (1
  191. Xhop), CSNET, ARPA, BITNET, UUCP, and DEC E-net sites. In the event of a
  192. Xmatch, the proper domain name is appended to the address and we
  193. Xre-iterate through ruleset zero.  This catches a fair number of missing
  194. Xdomain problems and hasn't caused too much confusion about names in use
  195. Xin several domains.
  196. X
  197. XFinally, the "gatech" machine takes any left-over non-local names and
  198. Xreturns them to the sender with a message about the fact that there is
  199. Xan unknown host/domain name in his letter.
  200. X
  201. XThe UUCP mailer on "gatech" is a re-routing mailer.  Any path or
  202. Xaddress handed to "uumail" gets an "optimal" path supplied to it.  That
  203. Xis, the program steps through the address from ultimate destination to
  204. Xbeginning, and if it knows a path to that site it will substitute that
  205. Xpath for the remainder of the user-supplied path.  For example, if the
  206. Xaddress "a!b!c!d!e!f" is provided to the mailer, and it knows how to
  207. Xget to site "d" via "z!y" (but no idea how to get to "e"), it will
  208. Xrewrite the path to be "z!y!d!e!f".  The path database is built using
  209. X"pathalias" on the uucp map data obtained from the Usenix machine
  210. X("gatech" is a regional repository of UUCP map information and gets
  211. Xnear-synchronous copies of map updates).
  212. X
  213. XThe ruleset along with "uumail" rewrites the "To:" field to look like
  214. X"f@e.UUCP" since the user-supplied address-path is probably not the
  215. Xpath that the mailer is going to use. Note that this means that
  216. X"uumail.m4" and "uucpm.m4" are NOT identical in function -- beware if
  217. Xyou decide to use one of them as a base in building your own files.
  218. X"uucpm.m4" does not muck about with the "To:" field, nor does it
  219. Xreroute mail.
  220. X
  221. XThis uucp mechanism allows any of our users to simply address mail to
  222. X"foo@site.UUCP" and not worry about a path.  It also optimizes message
  223. Xpaths provided when answering news articles, and it allows our
  224. Xneighbors without mail routing software to address mail to
  225. X"gatech!somesite!person" and expect the mail to get through, if
  226. Xpossible.  So far, no one has complained about not being able to force
  227. Xa particular path through our mailer.  In the 8+ months this mechanism
  228. Xhas been working, I've only discovered about 10 sites not registered
  229. Xwith the map project and thus ccausing mail to them to fail.
  230. X
  231. XThat's about it.  If you find these useful in some way, great.  If you
  232. Xshould find bugs or possible enhancements to these files, I would
  233. Xgreatly appreciate hearing about it.
  234. X----
  235. XGene Spafford
  236. XThe Clouds Project, School of ICS, Georgia Tech, Atlanta GA 30332
  237. XCSNet:    Spaf @ GATech        ARPA:    Spaf%GATech.CSNet @ CSNet-Relay.ARPA
  238. Xuucp:    ...!{akgua,allegra,hplabs,ihnp4,linus,seismo,ulysses}!gatech!spaf
  239. +FUNKY+STUFF+
  240. echo '-rw-r-----  1 spaf         9410 Oct 27 17:28 README    (as sent)'
  241. chmod u=rw,g=r,o= README
  242. ls -l README
  243. echo x - PATCHES
  244. sed 's/^X//' > PATCHES <<'+FUNKY+STUFF+'
  245. XFrom: topaz!hedrick  17 Sept 1985
  246. X
  247. X[Note: These changes and comments are not the same as the ones posted
  248. Xto the net by topaz!hedrick.  I have changed them so that mail received
  249. Xvia SMTP is labelled as such, rather than the orignal label of being
  250. Xreceived via SMTP (thanks to rick@seismo.css.gov for pointing this
  251. Xout).
  252. X
  253. XI also have removed the changes to add the "-p" flag and the comments
  254. Xassociated with it.  The changes in file PATCH3 provided by oddjob!matt
  255. Xto use the -oMr flag instead seems to me to be more general and a
  256. Xbetter solution.  In addition, it allows one to munge rmail to include
  257. Xthe sending (last relay) system via -oMs.    EHS]
  258. X
  259. XHere are some patches to SENDMAIL.
  260. X  1) They allow us to handle an Arpanet host table containing names
  261. X    like topaz.rutgers.edu.  The original version of sendmail,
  262. X    as well as sendmail.cf, assumed that all host names end in
  263. X    .arpa.  Changes may also be needed in UUCP and net news
  264. X    if your site name does not end in .ARPA.
  265. X  2) They allow you to translate all host names to their 
  266. X    canonical forms, i.e. replace nicknames with the primary
  267. X    name.  This is now considered the correct thing to do on
  268. X    the Arpanet.  This adds an operator, $%, for doing the
  269. X    mapping. WARNING: $% uses a single fixed location for
  270. X    the translated address.  Thus only one translated address
  271. X    may be active at a time.  This is fine for foo@bar,
  272. X    but you could not normalize all of the host names in an
  273. X    address like @foo,@bar:bar@gorp.  In practice I don't
  274. X    believe this is a problem.
  275. X  3) They allow you to make processing depend upon whether mail
  276. X    arrived via UUCP or SMTP.  In addition to the patches here,
  277. X    you will need to modify rmail, or whatever program calls
  278. X    sendmail to delivery UUCP mail.  It should call sendmail
  279. X    with an extra argument, -oMrUUCP.  This adds an operator,
  280. X    $&, for evaluating macros at runtime instead of when
  281. X    sendmail.cf is loaded.  $r is the name of the protocol via which
  282. X    mail arrived.  $r is set from the -oMr option, or by the
  283. X    SMTP daemon code, which automatically sets it to the
  284. X    value SMTP.  The code for reading and writing queue files
  285. X    saves the protocol in a line beginning with O.  In case
  286. X    a message gets queued, this allows us to remember which
  287. X    way it arrived.
  288. X
  289. XOriginally, SENDMAIL would tack .ARPA onto your host name.  This is
  290. Xa bad idea, since not all host names end in .ARPA.  The assumption
  291. Xwas that your rc file said
  292. X   hostname foo
  293. Xand this would turn it into foo.arpa.  We now do
  294. X   hostname foo.rutgers.edu
  295. Xand do not want .ARPA tacked on the end.
  296. X
  297. X*** daemon.c.ORIG    Fri Feb 10 06:59:21 1984
  298. X--- daemon.c    Sat Aug  3 07:49:46 1985
  299. X***************
  300. X*** 183,189
  301. X              /* determine host name */
  302. X              hp = gethostbyaddr(&otherend.sin_addr, sizeof otherend.sin_addr, AF_INET);
  303. X              if (hp != NULL)
  304. X!                 (void) sprintf(buf, "%s.ARPA", hp->h_name);
  305. X              else
  306. X                  /* this should produce a dotted quad */
  307. X                  (void) sprintf(buf, "%lx", otherend.sin_addr.s_addr);
  308. X
  309. X--- 185,191 -----
  310. X              /* determine host name */
  311. X              hp = gethostbyaddr(&otherend.sin_addr, sizeof otherend.sin_addr, AF_INET);
  312. X              if (hp != NULL)
  313. X!                 (void) sprintf(buf, "%s", hp->h_name);
  314. X              else
  315. X                  /* this should produce a dotted quad */
  316. X                  (void) sprintf(buf, "%lx", otherend.sin_addr.s_addr);
  317. X***************
  318. X
  319. XThe following patches add two operators: $% and $&.  $% is used to
  320. Xmap host names into their canonical forms.  Suppose a user sends mail
  321. Xto RED.  This should be turned into the official name, RED.RUTGERS.EDU,
  322. Xin the headers.  The fact that Unix does not do that causes problems
  323. Xto a number of mailers.  It is a violation of the standards.  $%n
  324. Xbehaves like $n, i.e. it is replaced with the nth thing on the left
  325. Xhand side.  However before doing the replacement, the thing is looked
  326. Xup in /etc/hosts.  If it is a host name or nickname, the official
  327. Xform of the host name is used instead.
  328. X
  329. X$& is part of a change to allow us to differentiate between UUCP and
  330. XSMTP mail.  What does foo!bar@baz mean?  If the mail arrived via UUCP,
  331. Xit is probably foo!<bar@baz>.  If it arrived via SMTP, it is by
  332. Xdefinition <foo!bar>@baz.  As we are a UUCP/SMTP gateway, it is
  333. Ximportant for us to get these things right.  In order to do so, we
  334. Xhave done two things:
  335. X  - implemented $r.  This is documented as being the name of the
  336. X    protocol via which the message arrived.  However this was
  337. X    not implemented.  I implement it as follows:
  338. X      - rmail calls sendmail with an option -oMrUUCP
  339. X      - the sendmail daemon code sets SMTP automatically
  340. X      - everything else should be local mail, and does
  341. X        not set any value in this macro.
  342. X      - when a queue entry is written, the protocol name
  343. X        must be written out
  344. X  - implemented a new operator $& to allow us to use the
  345. X    value of $r in productions.  You can't just use $r
  346. X    on the right side of a production.  It will be
  347. X    evaluated when the freeze file is made.  So $&r
  348. X    is equivalent to $r, but is evaluated when the
  349. X    rule is executed.  This allows us to write rules
  350. X    that differentiate.  Here is the part of sendmail.cf
  351. X    that uses it.  It checks for foo!bar, but only if
  352. X    the message arrived via UUCP.  Note the use of $&r
  353. X    to put the protocol name into the address, so we can
  354. X    match on it.
  355. X
  356. XR$-!$*            $:<$&r>$1!$2            check arriving protocol
  357. XR$-^$*            $:<$&r>$1^$2            both syntaxes
  358. XR<UUCP>$-!$*        $@$>7$2<@$1.UUCP>        if via UUCP, resolve
  359. XR<UUCP>$-^$*        $@$>7$2<@$1.UUCP>        if via UUCP, resolve
  360. XR<$*>$*            $2                undo kludge
  361. X
  362. X*** main.c.ORIG    Fri Feb 10 11:17:52 1984
  363. X--- main.c    Mon Aug 26 04:10:51 1985
  364. X***************
  365. X*** 538,543
  366. X          /* at this point we are in a child: reset state */
  367. X          OpMode = MD_SMTP;
  368. X          (void) newenvelope(CurEnv);
  369. X          openxscript(CurEnv);
  370. X  #endif DAEMON
  371. X      }
  372. X
  373. X--- 541,547 -----
  374. X          /* at this point we are in a child: reset state */
  375. X          OpMode = MD_SMTP;
  376. X          (void) newenvelope(CurEnv);
  377. X+         define('r',"SMTP",CurEnv);
  378. X          openxscript(CurEnv);
  379. X  #endif DAEMON
  380. X      }
  381. X***************
  382. X*** 701,706
  383. X  
  384. X      /* and finally the conditional operations */
  385. X      '?', CONDIF,    '|', CONDELSE,    '.', CONDFI,
  386. X  
  387. X      '\0'
  388. X  };
  389. X
  390. X--- 705,716 -----
  391. X  
  392. X      /* and finally the conditional operations */
  393. X      '?', CONDIF,    '|', CONDELSE,    '.', CONDFI,
  394. X+ 
  395. X+     /* now the normalization operator */
  396. X+     '%', NORMREPL,
  397. X+ 
  398. X+     /* and run-time macro expansion */
  399. X+     '&', MACVALUE,
  400. X  
  401. X      '\0'
  402. X  };
  403. X*** parseaddr.c.ORIG    Fri Feb 10 06:59:12 1984
  404. X--- parseaddr.c    Mon Aug 26 04:44:15 1985
  405. X***************
  406. X*** 394,400
  407. X          expand("$o", buf, &buf[sizeof buf - 1], CurEnv);
  408. X          (void) strcat(buf, DELIMCHARS);
  409. X      }
  410. X!     if (c == MATCHCLASS || c == MATCHREPL || c == MATCHNCLASS)
  411. X          return (ONE);
  412. X      if (c == '"')
  413. X          return (QST);
  414. X
  415. X--- 394,401 -----
  416. X          expand("$o", buf, &buf[sizeof buf - 1], CurEnv);
  417. X          (void) strcat(buf, DELIMCHARS);
  418. X      }
  419. X!     if (c == MATCHCLASS || c == MATCHREPL || c == MATCHNCLASS ||
  420. X!         c == MACVALUE || c == NORMREPL )
  421. X          return (ONE);
  422. X      if (c == '"')
  423. X          return (QST);
  424. X***************
  425. X*** 446,451
  426. X  
  427. X  # define MAXMATCH    9    /* max params per rewrite */
  428. X  
  429. X  
  430. X  rewrite(pvp, ruleset)
  431. X      char **pvp;
  432. X
  433. X--- 447,453 -----
  434. X  
  435. X  # define MAXMATCH    9    /* max params per rewrite */
  436. X  
  437. X+ char hostbuf[512];
  438. X  
  439. X  
  440. X  rewrite(pvp, ruleset)
  441. X***************
  442. X*** 447,452
  443. X  # define MAXMATCH    9    /* max params per rewrite */
  444. X  
  445. X  
  446. X  rewrite(pvp, ruleset)
  447. X      char **pvp;
  448. X      int ruleset;
  449. X
  450. X--- 449,455 -----
  451. X  
  452. X  char hostbuf[512];
  453. X  
  454. X+ 
  455. X  rewrite(pvp, ruleset)
  456. X      char **pvp;
  457. X      int ruleset;
  458. X***************
  459. X*** 626,631
  460. X          /* substitute */
  461. X          for (avp = npvp; *rvp != NULL; rvp++)
  462. X          {
  463. X              register struct match *m;
  464. X              register char **pp;
  465. X  
  466. X
  467. X--- 629,635 -----
  468. X          /* substitute */
  469. X          for (avp = npvp; *rvp != NULL; rvp++)
  470. X          {
  471. X+ #include <netdb.h>
  472. X              register struct match *m;
  473. X              register char **pp;
  474. X              char **oldavp,**tavp;
  475. X***************
  476. X*** 628,633
  477. X          {
  478. X              register struct match *m;
  479. X              register char **pp;
  480. X  
  481. X              rp = *rvp;
  482. X              if (*rp != MATCHREPL)
  483. X
  484. X--- 632,640 -----
  485. X  #include <netdb.h>
  486. X              register struct match *m;
  487. X              register char **pp;
  488. X+             char **oldavp,**tavp;
  489. X+             struct hostent *hostpt;
  490. X+             extern char *macvalue();
  491. X  
  492. X              rp = *rvp;
  493. X              if ((*rp != MATCHREPL) && (*rp != NORMREPL))
  494. X***************
  495. X*** 630,636
  496. X              register char **pp;
  497. X  
  498. X              rp = *rvp;
  499. X!             if (*rp != MATCHREPL)
  500. X              {
  501. X                  if (avp >= &npvp[MAXATOM])
  502. X                  {
  503. X
  504. X--- 637,643 -----
  505. X              extern char *macvalue();
  506. X  
  507. X              rp = *rvp;
  508. X!             if ((*rp != MATCHREPL) && (*rp != NORMREPL))
  509. X              {
  510. X                  if (avp >= &npvp[MAXATOM])
  511. X                  {
  512. X***************
  513. X*** 637,643
  514. X                      syserr("rewrite: expansion too long");
  515. X                      return;
  516. X                  }
  517. X!                 *avp++ = rp;
  518. X                  continue;
  519. X              }
  520. X  
  521. X
  522. X--- 644,655 -----
  523. X                      syserr("rewrite: expansion too long");
  524. X                      return;
  525. X                  }
  526. X!                 if (*rp == MACVALUE) {
  527. X!                   if (macvalue(rp[1],CurEnv))
  528. X!                     *avp++ = macvalue(rp[1],CurEnv);
  529. X! }
  530. X!                 else
  531. X!                   *avp++ = rp;
  532. X                  continue;
  533. X              }
  534. X  
  535. X***************
  536. X*** 642,647
  537. X              }
  538. X  
  539. X              /* substitute from LHS */
  540. X              m = &mlist[rp[1] - '1'];
  541. X  # ifdef DEBUG
  542. X              if (tTd(21, 15))
  543. X
  544. X--- 654,660 -----
  545. X              }
  546. X  
  547. X              /* substitute from LHS */
  548. X+ 
  549. X              m = &mlist[rp[1] - '1'];
  550. X  # ifdef DEBUG
  551. X              if (tTd(21, 15))
  552. X***************
  553. X*** 658,663
  554. X              }
  555. X  # endif DEBUG
  556. X              pp = m->first;
  557. X              while (pp <= m->last)
  558. X              {
  559. X                  if (avp >= &npvp[MAXATOM])
  560. X
  561. X--- 671,677 -----
  562. X              }
  563. X  # endif DEBUG
  564. X              pp = m->first;
  565. X+             oldavp = avp;
  566. X              while (pp <= m->last)
  567. X              {
  568. X                  if (avp >= &npvp[MAXATOM])
  569. X***************
  570. X*** 666,671
  571. X                      return;
  572. X                  }
  573. X                  *avp++ = *pp++;
  574. X              }
  575. X          }
  576. X          *avp++ = NULL;
  577. X
  578. X--- 680,695 -----
  579. X                      return;
  580. X                  }
  581. X                  *avp++ = *pp++;
  582. X+             }
  583. X+             if (*rp == NORMREPL) {
  584. X+               hostbuf[0] = '\0';
  585. X+               for (tavp = oldavp; tavp < avp; tavp++)
  586. X+                 strcat(hostbuf,*tavp);
  587. X+               hostpt = gethostbyname(hostbuf);
  588. X+               if (hostpt) {
  589. X+                 *oldavp = hostpt -> h_name;
  590. X+                 avp = oldavp + 1;
  591. X+               }
  592. X              }
  593. X          }
  594. X          *avp++ = NULL;
  595. X*** queue.c.ORIG    Fri Feb 10 06:59:20 1984
  596. X--- queue.c    Mon Aug 26 04:45:19 1985
  597. X***************
  598. X*** 105,110
  599. X      /* output creation time */
  600. X      fprintf(tfp, "T%ld\n", e->e_ctime);
  601. X  
  602. X      /* output name of data file */
  603. X      fprintf(tfp, "D%s\n", e->e_df);
  604. X  
  605. X
  606. X--- 105,115 -----
  607. X      /* output creation time */
  608. X      fprintf(tfp, "T%ld\n", e->e_ctime);
  609. X  
  610. X+     /* output protocol */
  611. X+     if (macvalue('r',e)) {
  612. X+       fprintf(tfp, "O%s\n", macvalue('r',e));
  613. X+ }
  614. X+ 
  615. X      /* output name of data file */
  616. X      fprintf(tfp, "D%s\n", e->e_df);
  617. X  
  618. X***************
  619. X*** 565,571
  620. X      /*
  621. X      **  Open the file created by queueup.
  622. X      */
  623. X! 
  624. X      p = queuename(e, 'q');
  625. X      f = fopen(p, "r");
  626. X      if (f == NULL)
  627. X
  628. X--- 570,576 -----
  629. X      /*
  630. X      **  Open the file created by queueup.
  631. X      */
  632. X!        
  633. X      p = queuename(e, 'q');
  634. X      f = fopen(p, "r");
  635. X      if (f == NULL)
  636. X***************
  637. X*** 575,580
  638. X      }
  639. X      FileName = p;
  640. X      LineNumber = 0;
  641. X  
  642. X      /*
  643. X      **  Read and process the file.
  644. X
  645. X--- 580,586 -----
  646. X      }
  647. X      FileName = p;
  648. X      LineNumber = 0;
  649. X+     define('r',NULL,e);
  650. X  
  651. X      /*
  652. X      **  Read and process the file.
  653. X***************
  654. X*** 595,600
  655. X                  (void) chompheader(&buf[1], FALSE);
  656. X              break;
  657. X  
  658. X            case 'M':        /* message */
  659. X              e->e_message = newstr(&buf[1]);
  660. X              break;
  661. X
  662. X--- 601,610 -----
  663. X                  (void) chompheader(&buf[1], FALSE);
  664. X              break;
  665. X  
  666. X+           case 'O':
  667. X+             define('r',newstr(&buf[1]),e);
  668. X+             break;
  669. X+ 
  670. X            case 'M':        /* message */
  671. X              e->e_message = newstr(&buf[1]);
  672. X              break;
  673. X***************
  674. X*** 628,634
  675. X              break;
  676. X          }
  677. X      }
  678. X- 
  679. X      FileName = NULL;
  680. X  }
  681. X   /*
  682. X
  683. X--- 638,643 -----
  684. X              break;
  685. X          }
  686. X      }
  687. X      FileName = NULL;
  688. X  }
  689. X   /*
  690. X*** sendmail.h.ORIG    Fri Feb 10 06:59:10 1984
  691. X--- sendmail.h    Sat Aug  3 05:06:53 1985
  692. X***************
  693. X*** 290,295
  694. X  # define CONDIF        '\031'    /* conditional if-then */
  695. X  # define CONDELSE    '\032'    /* conditional else */
  696. X  # define CONDFI        '\033'    /* conditional fi */
  697. X   /*
  698. X  **  Symbol table definitions
  699. X  */
  700. X
  701. X--- 290,300 -----
  702. X  # define CONDIF        '\031'    /* conditional if-then */
  703. X  # define CONDELSE    '\032'    /* conditional else */
  704. X  # define CONDFI        '\033'    /* conditional fi */
  705. X+ 
  706. X+ /* normalize Internet address operator */
  707. X+ # define NORMREPL       '\034'  /* normalized host replacement */
  708. X+ # define MACVALUE    '\035'    /* run-time macro value */
  709. X+ 
  710. X   /*
  711. X  **  Symbol table definitions
  712. X  */
  713. X
  714. X
  715. +FUNKY+STUFF+
  716. echo '-rw-r-----  1 spaf        12105 Oct 27 17:28 PATCHES    (as sent)'
  717. chmod u=rw,g=r,o= PATCHES
  718. ls -l PATCHES
  719. echo x - PATCHES2
  720. sed 's/^X//' > PATCHES2 <<'+FUNKY+STUFF+'
  721. XFrom: gatech!spaf
  722. X
  723. XThis keeps sendmail from tacking a spurious ".ARPA" onto the end of
  724. Xthe hostname when mail is received via SMTP.
  725. X
  726. X
  727. X*** daemon.c    Mon Oct 14 15:10:49 1985
  728. X--- daemon.c.orig    Mon Oct 14 15:10:22 1985
  729. X***************
  730. X*** 183,189
  731. X              /* determine host name */
  732. X              hp = gethostbyaddr(&otherend.sin_addr, sizeof otherend.sin_addr, AF_INET);
  733. X              if (hp != NULL)
  734. X!                 (void) sprintf(buf, "%s", hp->h_name);
  735. X              else
  736. X                  /* this should produce a dotted quad */
  737. X                  (void) sprintf(buf, "%lx", otherend.sin_addr.s_addr);
  738. X
  739. X--- 183,189 -----
  740. X              /* determine host name */
  741. X              hp = gethostbyaddr(&otherend.sin_addr, sizeof otherend.sin_addr, AF_INET);
  742. X              if (hp != NULL)
  743. X!                 (void) sprintf(buf, "%s.ARPA", hp->h_name);
  744. X              else
  745. X                  /* this should produce a dotted quad */
  746. X                  (void) sprintf(buf, "%lx", otherend.sin_addr.s_addr);
  747. +FUNKY+STUFF+
  748. echo '-rw-r-----  1 spaf          853 Oct 27 17:52 PATCHES2    (as sent)'
  749. chmod u=rw,g=r,o= PATCHES2
  750. ls -l PATCHES2
  751. echo x - PATCH3
  752. sed 's/^X//' > PATCH3 <<'+FUNKY+STUFF+'
  753. XFrom akgua!packard!ihnp4!oddjob!matt Wed Oct 16 01:59:25 1985
  754. X
  755. XOne thing strikes me immediately:  I have rmail pass the flag
  756. X"-oMrUUCP" to sendmail, rather than inventing a new flag.
  757. XHowever, this required fixing a different sendmail bug so that
  758. XI could also give "-oMsneighbor".
  759. X
  760. X*** /tmp/readcf.c.old    Tue Oct 15 18:54:21 1985
  761. X--- /tmp/readcf.c    Tue Oct 15 18:54:24 1985
  762. X***************
  763. X*** 633,639
  764. X      else if (tTd(37, 1))
  765. X          printf("\n");
  766. X  #endif DEBUG
  767. X!     if (sticky)
  768. X          setbitn(opt, StickyOpt);
  769. X  
  770. X      if (getruid() == 0)
  771. X
  772. X--- 637,643 -----
  773. X      else if (tTd(37, 1))
  774. X          printf("\n");
  775. X  #endif DEBUG
  776. X!     if (sticky && opt != 'M')    /* 'M' should never be sticky ! */
  777. X          setbitn(opt, StickyOpt);
  778. X  
  779. X      if (getruid() == 0)
  780. X
  781. +FUNKY+STUFF+
  782. echo '-rw-r-----  1 spaf          722 Oct 27 17:52 PATCH3    (as sent)'
  783. chmod u=rw,g=r,o= PATCH3
  784. ls -l PATCH3
  785. echo x - Makefile.diff
  786. sed 's/^X//' > Makefile.diff <<'+FUNKY+STUFF+'
  787. X5c5
  788. X< #        $Header: Makefile,v 5.6 85/10/26 18:59:46 spaf Release $
  789. X---
  790. X> #        $Header: Makefile,v 5.5 85/10/13 21:17:06 spaf Release $
  791. X31c31
  792. X<     PATCHES2 PATCH3 uumail.c overview.ms Files
  793. X---
  794. X>     uumail.c overview.ms Files
  795. +FUNKY+STUFF+
  796. echo '-rw-r-----  1 spaf          218 Oct 27 17:38 Makefile.diff    (as sent)'
  797. chmod u=rw,g=r,o= Makefile.diff
  798. ls -l Makefile.diff
  799. echo x - overview.ms
  800. sed 's/^X//' > overview.ms <<'+FUNKY+STUFF+'
  801. X.TL
  802. XMail Handling at Gatech
  803. X.br
  804. XRevision III
  805. X.AU
  806. XGene Spafford
  807. X.AI
  808. XSchool of Information and Computer Science
  809. XGeorgia Institute of Technology
  810. X27 October 1985
  811. X.PP
  812. XSite "gatech" is running a "smart" version of sendmail.  I have 
  813. Xhacked at the sendmail configuration files extensively, and although
  814. Xthey are not yet doing 100% of what I want, they seem to work pretty well
  815. Xand handle our many (sometimes unusual) mail needs.
  816. XWhat follows are brief descriptions of what happens to various bits of
  817. Xmail passing through our site. 
  818. X.PP
  819. XThere have been some changes since the last time I circulated this
  820. Xdocument.  Most of the changes have been inspired (?) by the changes
  821. Xto sendmail done at Rutgers which allow "sendmail" to distinguish
  822. Xthe source of incoming mail with mixed syntax addresses (e.g., a!b@c),
  823. Xand which rewrite the names of Internet hosts into the preferred form
  824. X(as given in the /etc/hosts table, derived from NIC data).
  825. X.NH 1
  826. XWhy
  827. X.PP
  828. XSite "gatech" is directly on the uucp network
  829. X(with over 75 contacts and acting as a de facto name server for a
  830. X"southeast US domain"), the CSNet, and we serve as gateway for
  831. Xour local networks.  We also have network traffic with some other
  832. Xmajor networks, and we might possibly get BITNET and ARPA access in
  833. Xthe not-too-distant future, from "gatech" or some other campus machines.
  834. XWe'd like to have as complete and robust
  835. Xa mailing environment as possible.  At the same time, we'd like
  836. Xto minimize our current phone bills as they are related to UUCP mail 
  837. Xtraffic.
  838. X.NH 1
  839. XRouting
  840. X.NH 2
  841. XKnown Domains
  842. X.PP
  843. XCurrently, there is considerable effort going on to identify and
  844. Xestablish domains for mailing.  Some of these domains are already
  845. Xestablished, if only in a de facto manner.  Our sendmail
  846. Xcurrently recognizes the following well-known domains: ARPA, CSNET,
  847. XGOV, EDU, COM, MIL, ORG, NET, UK,
  848. XUUCP, BITNET, DEC, and MAILNET.  The following 
  849. Xare also recognized when used as top-level domains:
  850. XGTNET (local to Georgia Tech), OZ (the Australian network),
  851. XTEK (recognized internal to Tektronix), and SDC (with sdcrdcf as the gateway).
  852. X.PP
  853. XThere are a number of other "domains" that are recognized when used
  854. Xin a second-level position within a uucp address.  That is, we
  855. Xrecognize person@site.ATT.UUCP as something that should be
  856. Xdirected to cbosgd via uucp for further resolution.  This recognition
  857. Xis done by building psuedo-sites into the uucp routing database
  858. Xbased upon the data distributed by the uucp map project.  
  859. XAmong domains recognized like this are NCAL, SCAL, ATL, ATT, and
  860. Xso on; the list may change based on updates to the map.
  861. X(As an aside, at the time of this writing, "gatech" is one of
  862. Xthe regional repositories of the current map, and we get automatic
  863. Xupdates whenever the "real" map gets changed.)
  864. X.PP
  865. XIn the following descriptions, any of the above can be used in
  866. Xplace of a "DOMAIN" specifier.
  867. X.NH 2
  868. Xuser@host[.DOMAIN] -and- user%host[.DOMAIN]
  869. X.PP
  870. XIf mail comes in addressed specifically to one of the known domains,
  871. Xit is routed as described in the next section without any further
  872. Xchanges.  If the domain is not given, an attempt is made to derive
  873. Xthe domain based on available lists of host names and aliases,
  874. Xand then routed as described in the next section.  If no host/domain
  875. Xmatch can be found, the mail is returned with an error stating this.
  876. X.NH 3
  877. XDomain Derivation
  878. X.PP
  879. XHost derivation is attempted in the following order:  First, the
  880. Xhost is checked to see if it is in the GTNET domain.  Next, the
  881. Xhost is checked to see if it is a host one hop away via UUCP.  Next,
  882. Xthe host is checked against all CSNET sites.  Then it is checked
  883. Xagainst all Arpa Internet sites. Next, it is checked against the list of
  884. Xknown MAILNET hosts. Then it is checked against the list of all (other) known
  885. XUUCP sites. Then it is checked against the list of
  886. Xknown BITNET hosts.  Finally, it is checked against the list
  887. Xof known DEC E-net sites.  
  888. X.PP
  889. XThis kind of checking is not 100% accurate because our lists are not
  890. Xalways up-to-date.  In particular, the Arpa list is updated infrequently
  891. Xdue to the fact that we aren't actually on the Arpanet, and there is no
  892. Xlist of DEC net sites available outside of DEC (we make due with
  893. Xgleaning names from posted news articles and exchanges with other sites
  894. Xinterested in compiling such a list).
  895. X.NH 3
  896. XCollisions
  897. X.PP
  898. XIf the same hostname exists in more than one domain, the first match
  899. Xfound will be the one used.  Qualification of the address with an
  900. Xexplicit domain specifier will ensure that the mail goes to the
  901. Xcorrect host (when routed through gatech).  That is, the domain
  902. Xis considered to be the specifer for routing and if one is not
  903. Xexplicitly provided (or implicitly, as in the case of "!" notation),
  904. Xthen an attempt to made to guess a domain.
  905. X.NH 2
  906. Xhost1!host2!host3...!hostn!user
  907. X.PP
  908. XStarting with "hostn" and working backwards to "host1" our mailer
  909. Xwill attempt to find a host listed in our master UUCP path database.
  910. XThis database is generated using pathalias at least weekly based on the latest
  911. Xversion of the uucp maps.  If a match is found at "hostk", then the 
  912. Xaddress is rewritten to be "<path to hostk>!hostk!...hostn!user"
  913. Xand then mailed via UUCP.  Such addresses are 
  914. X.B never
  915. Xrouted over
  916. Xany other network, unless "hostn" is recognized to be a GTNET
  917. Xhost, in which case our internal transport mechanism is invoked, or
  918. Xunless a domain specifier is present in "host1" (see next section).
  919. X.PP
  920. XThere is 
  921. X.B no
  922. Xway at present to force a path on UUCP mail through "gatech".
  923. XThis is perhaps a "not very good thing" but I can't come up with a good
  924. Xway to work in explicit paths.  The map data is generally very good
  925. Xand I have observed very, very few failures since we first started
  926. Xdoing this rewriting about 6 months ago.  If this presents a
  927. Xmajor problem for someone, let me know and I'll see what I can work out.
  928. X.NH 2
  929. Xhost.DOMAIN!person
  930. X.PP
  931. XThis is a special case and mail to an address such as this is handled
  932. Xin a reasonably sane manner.  That is, the mail is sent to user@host.DOMAIN
  933. Xby the proper transmission medium (probably 
  934. X.B not
  935. XUUCP).  This is the same syntax that gateways like 
  936. X.I seismo 
  937. Xand 
  938. X.I ucbvax
  939. Xuse to leave the UUCP mail "domain."  Thus, mail
  940. Xto ...gatech!seismo.css.gov!rick will, in fact, get to Rick Adams at
  941. Xseismo via UUCP to gatech, PMDF to CSNet-Relay, and Arpa to seismo.
  942. X.PP
  943. XFor this notational form to work, the 
  944. X.B first
  945. Xcomponent of the address seen at gatech must be qualified with one of the recognized
  946. Xtop-level domains (EDU, ARPA, CSNET, BITNET, etc.).  
  947. X.B No
  948. Xattempt is made to validate the hostname or the remainder of the
  949. Xaddress (the part after the first "!") since we don't know about 
  950. Xsecond level domains or syntaxes in most cases (nor should be expected
  951. Xto be so aware -- that's the whole idea behind domain addressing).
  952. X.NH 2
  953. Xhost1!host2!host3...!hostn!user@site[.DOMAIN]
  954. X.br
  955. Xhost1!host2!host3...!hostn!user%site[.DOMAIN]
  956. X.PP
  957. XThis one diverges somewhat from the standard (RFC822 et.al.).  
  958. XThe way these addresses get treated is based on the way the mail
  959. Xgets into our "sendmail."  If the message originates on any of the
  960. Xlocal (GTNET) machines, or if it comes in via PMDF from CSNet, then
  961. Xthe mail is routed to "site" for eventual delivery to host1!...hostn!user.
  962. XMail coming in via a UUCP link with a mixed-mode address like this will
  963. Xhave the mail routed via uucp to hostn for eventual delivery to
  964. Xuser@site.  Thus, if one of our neighbors, such as someone at akgua,
  965. Xwere to send mail to us addressed as seismo!person@ucbvax.ARPA, we would
  966. Xsend the mail to seismo via uucp and present it to their "rmail"
  967. Xprogram as "rmail person@ucbvax.ARPA".
  968. X.PP
  969. XOn the other hand, should someone on gitpyr send mail addressed
  970. Xas seismo!person@ucbvax.ARPA, it would arrive at Gatech via SMTP and
  971. Xthen be sent to CSNet-relay via PMDF for delivery to site "ucbvax" with
  972. Xa request to be delivered to "seismo!person" relative to that site.
  973. XIn most cases, depending on the sites involved,
  974. Xthis kind of treatment would result in the mail failing.  The sendmail
  975. Xconfigurations I have created for all the local GTNET sites are such
  976. Xthat it should not be required to specify such an address.  Simply
  977. Xmailing to person@site should see the correct address and network
  978. Xtransport mechanism chosen.  The Usenet "news" programs on most of these
  979. Xsites have been built to use the Internet-style of address when
  980. Xmailing replies, so there should be few cases of users even seeing mixed
  981. Xmode addresses presented to them (mail passing through any of the mailers
  982. Xgets rewritten to show a consistent format).
  983. X.NH 2
  984. Xuser%site1%site2%site3
  985. X.PP
  986. XAddresses of this format get turned into user%site1%site2@site3,
  987. Xand an appropriate routing is provided to "site3," if known.
  988. X.NH 2
  989. XOther network characters
  990. X.PP
  991. XThe ":" delimiter gets turned into "!" symbols in any address
  992. Xpresented to our sendmail.
  993. XThe "^" delimiter gets turned into "!" also.  Addresses of the
  994. Xform "site=user" get turned into "user@site.BITNET" by convention.
  995. X.NH 1
  996. XErrors
  997. X.PP
  998. XI have tried to trap all possible errors and generate return mail
  999. Xwith meaningful messages.  
  1000. XIf you get errors you don't know how to interpret, please contact me.
  1001. X.NH 1
  1002. XSource
  1003. X.PP
  1004. XI posted an ancestor of my current sendmail files to "mod.sources" a
  1005. Xfew months ago.  If these latest versions appear stable, I will post
  1006. Xthem to the same place.  If you'd like a copy right away, let me know.
  1007. XThis includes the sendmail files for all the local GTNET machines, and
  1008. Xthe source for my "uumail" program which sits between sendmail and
  1009. Xuux.
  1010. +FUNKY+STUFF+
  1011. echo '-rw-r-----  1 spaf         9504 Oct 27 17:28 overview.ms    (as sent)'
  1012. chmod u=rw,g=r,o= overview.ms
  1013. ls -l overview.ms
  1014. echo x - base.m4.diff
  1015. sed 's/^X//' > base.m4.diff <<'+FUNKY+STUFF+'
  1016. X12c12
  1017. X< #  $Header: base.m4,v 5.6 85/10/26 19:54:34 spaf Release $
  1018. X---
  1019. X> #  $Header: base.m4,v 5.1 85/10/13 20:45:34 spaf Release $
  1020. X39,41d38
  1021. X< # wait for aliases to be up-to-date, and create them if need be
  1022. X< Oa
  1023. X< OD
  1024. X90d86
  1025. X< Tspaf
  1026. X99c95
  1027. X< HReceived: $?sfrom $s $.by $j $?rwith $r $.($v/$V)
  1028. X---
  1029. X> HReceived: $?sfrom $s $.by $j ($v/$V)
  1030. X108c104
  1031. X< H?l?Received-Date: $b
  1032. X---
  1033. X> # H?l?Received-Date: $b
  1034. X173,176c169,171
  1035. X< R$+!$*            $:<$&r>$1!$2            check arriving protocol
  1036. X< R$+^$*            $:<$&r>$1!$2            both syntaxes
  1037. X< R<UUCP>$*@$-.UUCP    $@$>6$1<@$2.UUCP>        ...if the second time
  1038. X< R<UUCP>$+!$*        $@$>6$2<@$1.UUCP>        if via UUCP, resolve
  1039. X---
  1040. X> R$-!$*            $:<$&r>$1!$2            check arriving protocol
  1041. X> R$-^$*            $:<$&r>$1!$2            both syntaxes
  1042. X> R<UUCP>$-!$*        $@$>6$2<@$1.UUCP>        if via UUCP, resolve
  1043. +FUNKY+STUFF+
  1044. echo '-rw-r-----  1 spaf          769 Oct 27 17:38 base.m4.diff    (as sent)'
  1045. chmod u=rw,g=r,o= base.m4.diff
  1046. ls -l base.m4.diff
  1047. echo x - cirrus.mc.diff
  1048. sed 's/^X//' > cirrus.mc.diff <<'+FUNKY+STUFF+'
  1049. X6c6
  1050. X< #####    $Header: cirrus.mc,v 5.2 85/10/26 18:46:40 spaf Release $
  1051. X---
  1052. X> #####    $Header: cirrus.mc,v 5.1 85/10/13 20:38:11 spaf Release $
  1053. X18c18
  1054. X< Cwgt-cirrus cirrus 
  1055. X---
  1056. X> Cwgt-cirrus cirrus Cirrus CIRRUS GT-Cirrus GT-CIRRUS GT-cirrus
  1057. +FUNKY+STUFF+
  1058. echo '-rw-r-----  1 spaf          237 Oct 27 17:38 cirrus.mc.diff    (as sent)'
  1059. chmod u=rw,g=r,o= cirrus.mc.diff
  1060. ls -l cirrus.mc.diff
  1061. echo x - gatech.mc.diff
  1062. sed 's/^X//' > gatech.mc.diff <<'+FUNKY+STUFF+'
  1063. X9c9
  1064. X< #####    $Header: gatech.mc,v 5.3 85/10/27 16:07:45 spaf Release $
  1065. X---
  1066. X> #####    $Header: gatech.mc,v 5.1 85/10/13 20:38:16 spaf Release $
  1067. X21c21
  1068. X< Cwgatech ga-tech georgia-tech gt-tech gt-gatech
  1069. X---
  1070. X> Cwgatech ga-tech georgia-tech
  1071. X28c28
  1072. X< CUgatech gt-tech gt-gatech georgia-tech
  1073. X---
  1074. X> CUgatech GATech GaTech
  1075. X47c47
  1076. X< DEdecwrl.dec.com
  1077. X---
  1078. X> DEdecwrl.arpa
  1079. X77d76
  1080. X< R$+<@$+.$=T.UUCP>    $1<@$2.$3>            a.arpa.uucp -> a.arpa
  1081. +FUNKY+STUFF+
  1082. echo '-rw-r-----  1 spaf          415 Oct 27 17:53 gatech.mc.diff    (as sent)'
  1083. chmod u=rw,g=r,o= gatech.mc.diff
  1084. ls -l gatech.mc.diff
  1085. echo x - gitpyr.mc.diff
  1086. sed 's/^X//' > gitpyr.mc.diff <<'+FUNKY+STUFF+'
  1087. X6c6
  1088. X< #####    $Header: gitpyr.mc,v 5.2 85/10/26 18:52:54 spaf Release $
  1089. X---
  1090. X> #####    $Header: gitpyr.mc,v 5.1 85/10/13 20:38:21 spaf Release $
  1091. X18c18
  1092. X< Cwgitpyr gt-gitpyr gt-pyr gt-pyramid
  1093. X---
  1094. X> Cwgitpyr Gitpyr GITPYR
  1095. X22c22
  1096. X< CUgitpyr gt-gitpyr gt-pyr gt-pyramid
  1097. X---
  1098. X> CUgitpyr
  1099. +FUNKY+STUFF+
  1100. echo '-rw-r-----  1 spaf          274 Oct 27 17:38 gitpyr.mc.diff    (as sent)'
  1101. chmod u=rw,g=r,o= gitpyr.mc.diff
  1102. ls -l gitpyr.mc.diff
  1103. echo x - gtbase.m4.diff
  1104. sed 's/^X//' > gtbase.m4.diff <<'+FUNKY+STUFF+'
  1105. X6c6
  1106. X< #  $Header: gtbase.m4,v 5.2 85/10/26 18:53:29 spaf Release $
  1107. X---
  1108. X> #  $Header: gtbase.m4,v 5.1 85/10/13 20:45:55 spaf Release $
  1109. X17c17
  1110. X< CDgtnet gatech git gt
  1111. X---
  1112. X> CDgtnet GTNET GTNet GtNet GTnet
  1113. X33c33
  1114. X< CTARPA UUCP BITNET CSNET MAILNET DEC EDU GOV MIL COM ORG NET OZ UK
  1115. X---
  1116. X> CTARPA UUCP BITNET CSNET MAILNET DEC EDU GOV MIL COM ORG NET OZ
  1117. X36c36
  1118. X< CKARPA EDU GOV MIL COM ORG NET UK
  1119. X---
  1120. X> CKARPA EDU GOV MIL COM ORG NET
  1121. X58c58
  1122. X< R$*<@$*$=D.$=T>$*    $1<@$2LOCAL>$5            catch "gtnet.csnet"
  1123. X---
  1124. X> R$*<@$*$=D.$=T>$*    $1<@$2LOCAL>$4            catch "gtnet.csnet"
  1125. +FUNKY+STUFF+
  1126. echo '-rw-r-----  1 spaf          550 Oct 27 17:38 gtbase.m4.diff    (as sent)'
  1127. chmod u=rw,g=r,o= gtbase.m4.diff
  1128. ls -l gtbase.m4.diff
  1129. echo x - nimbus.mc.diff
  1130. sed 's/^X//' > nimbus.mc.diff <<'+FUNKY+STUFF+'
  1131. X6c6
  1132. X< #####    $Header: nimbus.mc,v 5.2 85/10/26 18:46:12 spaf Release $
  1133. X---
  1134. X> #####    $Header: nimbus.mc,v 5.1 85/10/13 20:38:35 spaf Release $
  1135. X18c18
  1136. X< Cwgt-nimbus nimbus 
  1137. X---
  1138. X> Cwgt-nimbus nimbus NIMBUS Nimbus GT-Nimbus GT-nimbus GT-NIMBUS
  1139. +FUNKY+STUFF+
  1140. echo '-rw-r-----  1 spaf          237 Oct 27 17:38 nimbus.mc.diff    (as sent)'
  1141. chmod u=rw,g=r,o= nimbus.mc.diff
  1142. ls -l nimbus.mc.diff
  1143. echo x - stratus.mc.diff
  1144. sed 's/^X//' > stratus.mc.diff <<'+FUNKY+STUFF+'
  1145. X6c6
  1146. X< #####    $Header: stratus.mc,v 5.2 85/10/26 18:45:39 spaf Release $
  1147. X---
  1148. X> #####    $Header: stratus.mc,v 5.1 85/10/13 20:38:39 spaf Release $
  1149. X18c18
  1150. X< Cwgt-stratus stratus 
  1151. X---
  1152. X> Cwgt-stratus stratus STRATUS GT-Stratus GT-STRATUS
  1153. +FUNKY+STUFF+
  1154. echo '-rw-r-----  1 spaf          229 Oct 27 17:39 stratus.mc.diff    (as sent)'
  1155. chmod u=rw,g=r,o= stratus.mc.diff
  1156. ls -l stratus.mc.diff
  1157. echo x - uumail.m4.diff
  1158. sed 's/^X//' > uumail.m4.diff <<'+FUNKY+STUFF+'
  1159. X7c7
  1160. X< #####      $Header: uumail.m4,v 5.2 85/10/26 18:40:33 spaf Release $
  1161. X---
  1162. X> #####      $Header: uumail.m4,v 5.1 85/10/13 20:46:17 spaf Release $
  1163. X34c34
  1164. X< R$+<@$-.LOCAL>        $2!$1                u@h.LOCAL => h!u
  1165. X---
  1166. X> R$+<@$-.LOCAL>        $2!$1                u@h.LOCAL => u%h
  1167. +FUNKY+STUFF+
  1168. echo '-rw-r-----  1 spaf          242 Oct 27 17:39 uumail.m4.diff    (as sent)'
  1169. chmod u=rw,g=r,o= uumail.m4.diff
  1170. ls -l uumail.m4.diff
  1171. echo x - version.m4.diff
  1172. sed 's/^X//' > version.m4.diff <<'+FUNKY+STUFF+'
  1173. X1c1
  1174. X< #    $Header: version.m4,v 5.3 85/10/26 18:39:43 spaf Release $
  1175. X---
  1176. X> #    $Header: version.m4,v 5.1 85/10/13 20:46:20 spaf Release $
  1177. X3c3
  1178. X< DV6.0.GT
  1179. X---
  1180. X> DV5.8.GaTech
  1181. +FUNKY+STUFF+
  1182. echo '-rw-r-----  1 spaf          168 Oct 27 17:39 version.m4.diff    (as sent)'
  1183. chmod u=rw,g=r,o= version.m4.diff
  1184. ls -l version.m4.diff
  1185. exit 0
  1186.  
  1187.