Relay-Version: version B 2.10 5/3/83; site utzoo.UUCP
Path: utzoo!utgpu!water!watmath!clyde!cbosgd!ucbvax!ucbcad!ames!lll-lcc!lll-winken!uunet!rs
From: rs@uunet.UUCP
Newsgroups: comp.sources.unix
Subject: v10i012: The IDA Sendmail Kit, Part01/07
Message-ID: <424@uunet.UU.NET>
Date: Tue, 23-Jun-87 00:40:23 EDT
Article-I.D.: uunet.424
Posted: Tue Jun 23 00:40:23 1987
Date-Received: Wed, 24-Jun-87 06:32:50 EDT
Organization: UUNET Communications Services, Arlington, VA
Lines: 2390
Approved: rs@uunet.uu.net
Mod.sources: Volume 10, Number 12
Submitted by: Lennart Lovstrand
Archive-name: ida/Part01
[ After talking with a couple of people, I decided to mix backlogged sources
with recent submissions in order to get stuff that people are currently
interested in out in a reasonable amount of time. Also, please remember
that I am not able to provide mail-based retrieval service at this time;
this is a guest account on UUNET that I am using. --r$ ]
This is the first part of the IDA Sendmail Enhancement Kit.
The Kit includes a set of source code modifications to the BSD 4.3
sendmail program (version 5.11). The changes will enable sendmail to
have direct access to dbm(3) files, separate envelope/header rewriting
rulesets, and multi-token class matches among other things.
As a separate part of the Kit is the IDA Sendmail Master Configuration
file and a sample setup used at the CIS Dept, U of Linkoping. The
configuration file together with the supplied data files and utility
programs, implement such nice features as pathalias based systems
routing within sendmail, fully !-/@-translating rulesets, and generic
local user addresses.
Finally, there is an accompanying paper on mail addressing issues in
general and hybrid addresses in particular. Included in the paper is a
description of the changes to sendmail and the configuration setup.
Unpack the Kit by (preferably) cd'ing to the sendmail home directory and
sending the part after the "--cut--here--" line to /bin/sh or unshar.
This should create a new "ida" subdirectory with all the Kit's files.
Then see ida/README and ida/INSTALL for further instructions.
--cut--here--cut--here--cut--here--cut--here--cut--here--cut--here-->8--
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh ida/MANIFEST <<'END_OF_ida/MANIFEST'
X File Name Archive #
X----------------------------------
X ida 1
X ida/INSTALL 2
X ida/MANIFEST 1
X ida/Makefile 1
X ida/README 1
X ida/aux 1
X ida/aux/Makefile 1
X ida/aux/dbm.c 3
X ida/aux/header.c 1
X ida/aux/mkdomext.c 1
X ida/aux/rmail.c 3
X ida/aux/scanf.c 1
X ida/aux/xalparse.c 3
X ida/cf 1
X ida/cf/Makefile 1
X ida/cf/Sendmail.mc 5
X ida/cf/asterix.m4 1
X ida/cf/client.m4 1
X ida/cf/majestix.m4 1
X ida/cf/newaliases.m4 1
X ida/cf/obelix.m4 1
X ida/doc 1
X ida/doc/Makefile 1
X ida/doc/dbm.1 2
X ida/doc/mkdomext.1 1
X ida/doc/part1.ms 6
X ida/doc/part2.ms 7
X ida/doc/xalparse.8 1
X ida/lib 1
X ida/lib/Makefile 1
X ida/lib/decnet 1
X ida/lib/decnet/nodes 1
X ida/lib/decnet/xtable 1
X ida/lib/domaintable 2
X ida/lib/mailertable 1
X ida/lib/pathtable 2
X ida/lib/restart_clients 1
X ida/lib/sendmail.hf 1
X ida/lib/sendmail.st 1
X ida/lib/stop_clients 1
X ida/lib/uucp 1
X ida/lib/uucp/relays 1
X ida/lib/uucp/xtable 1
X ida/lib/xaliases 4
X ida/patches 1
X ida/patches/BSD29.diff 2
X ida/patches/BSD29.edit 1
X ida/patches/BSD42.diff 1
X ida/patches/MDBM.diff 2
X ida/patches/MDBM.edit 1
X ida/patches/Makefile 1
X ida/patches/Version.c.diff 1
X ida/patches/alias.c.diff 3
X ida/patches/conf.c.diff 1
X ida/patches/daemon.c.diff 2
X ida/patches/deliver.c.diff 2
X ida/patches/err.c.diff 1
X ida/patches/headers.c.diff 1
X ida/patches/macro.c.diff 1
X ida/patches/main.c.diff 2
X ida/patches/mdbm_compat.h 1
X ida/patches/op.me.diff 3
X ida/patches/parseaddr.c.diff 4
X ida/patches/queue.c.diff 1
X ida/patches/readcf.c.diff 1
X ida/patches/recipient.c.diff 2
X ida/patches/savemail.c.diff 1
X ida/patches/sendmail.h.diff 3
X ida/patches/srvrsmtp.c.diff 2
X ida/patches/usersmtp.c.diff 1
X ida/patches/util.c.diff 1
END_OF_ida/MANIFEST
if test 1726 -ne `wc -c ida/Makefile <<'END_OF_ida/Makefile'
X#
X# MAKEFILE -- The IDA Sendmail Enhancement Kit.
X# Copyright (c) 1987 Lennart Lovstrand
X# CIS Dept, Univ of Linkoping, Sweden
X#
X# Use it, abuse it, but don't sell it.
X#
X
X# Global definitions; will be exported to all Makefiles
XMAN8DIR= /usr/man/manl # Place for the section 8 manuals
XMAN8EXT= .l # Extension for section 8 manuals
XMAN1DIR= /usr/man/manl # Place for the section 1 manuals
XMAN1EXT= .l # Extension for section 1 manuals
XBINDIR= /usr/local/bin # Where the binary aux files sh
ould go
XLIBDIR= /usr/lib/mail # Where the data files should b
e
XSRCDIR= ../../src # The sendmail src subdirectory
XINCLUDEDIR= ../../include # The sendmail include subdirectory
XDOCDIR= ../../doc # The sendmail doc subdirctory
XMDBM= #-DMDBM -I$(SRCDIR) # Only defined if you want to use mdbm
XDBMLIB= -ldbm # Change to -lmdbm if you use m
dbm
XDBMEXT= .dir # Change to .map for mdbm
XTROFF= pstroff # The [nt]roff program of your choice
X
Xconfigure: config.ed
X @echo ">>> Propagating changes to subdirectories."
X for M in */Makefile; do \
X ed $$M $@
X echo w >>$@
X echo q >>$@
X
Xclean:
X -rm -f \#* *~ config.ed
X
Xspotless: clean
X for d in */.; do \
X (cd $$d; make clean); \
X done
END_OF_ida/Makefile
if test 1378 -ne `wc -c ida/aux/Makefile <<'END_OF_ida/aux/Makefile'
X#
X# MAKEFILE -- Auxiliary Files.
X# Copyright (c) 1987 Lennart Lovstrand
X# CIS Dept, Univ of Linkoping, Sweden
X#
X# Use it, abuse it, but don't sell it.
X#
X
XBINS= dbm mkdomext scanf xalparse
XCFLAGS= -O -DVMUNIX -I$(INCLUDEDIR)
X
X# The following definitions are inserted by ../Makefile
X# Change them there--not here!
XBINDIR= /usr/local/bin
XLIBDIR= /usr/lib/mail
XSRCDIR= ../../src
XINCLUDEDIR= ../../include
XDBMLIB= -ldbm
X
Xall: $(BINS) rmail
X
Xdbm: dbm.c
X $(CC) $(CFLAGS) $(MDBM) -o dbm dbm.c $(DBMLIB)
X
Xrmail: rmail.c
X $(CC) $(CFLAGS) $(MDBM) -o rmail rmail.c $(DBMLIB)
X
Xinstall: $(BINS)
X cp $(BINS) $(BINDIR)
X cd $(BINDIR); strip $(BINS)
X @echo '>>> Do "make install-rmail" to explitly install rmail.'
X
Xinstall-rmail: rmail
X install -m 4755 -o root -s rmail /bin
X
Xclean:
X -rm -f \#* *~ *.o $(BINS)
X
X.c.o:
X $(CC) $(CFLAGS) -c $<
X
X.c:
X $(CC) $(CFLAGS) -o $@ $<
END_OF_ida/aux/Makefile
if test 877 -ne `wc -c ida/aux/header.c <<'END_OF_ida/aux/header.c'
X/*
X** HEADER -- Header line parser.
X** Copyright (c) 1985 Lennart Lovstrand
X** CIS Dept, Univ of Linkoping, Sweden
X**
X** Use it, abuse it, but don't sell it.
X**
X** Version of 14-Apr-85.
X*/
X
X#include
X#include
X#include
X#include "useful.h"
X
X#define H_CC "cc"
X#define H_FROM "from"
X#define H_MESSAGE_ID "message_id"
X#define H_RETURN_PATH "return-path"
X#define H_TO "to"
X#define H_VIA "via"
X
X#define COMMA ','
X
X#define MAKELC(C) (isupper(C) ? tolower(C) : C)
X
X/*
X * iskey: checks if the line is prefixed by
X * the supplied keyword (immediately followed by
X * a colon)
X */
Xiskey(key, line)
Xchar *key, *line;
X{
X for (; *key != NULL && *line != NULL; key++, line++)
X if (MAKELC(*key) != MAKELC(*line))
X break;
X
X return *key == NULL && *line == ':';
X}
X
Xchar *eat(str, ch)
Xchar *str, ch;
X{
X for(; *str == ch; str++);
X return str;
X}
X
X/*
X * extract_address:
X * finds and extracts the machine address part of an address field
X */
X
Xchar *extract_address(field, address)
Xchar *field, *address;
X{
X char *address_start = address;
X
X while(*field && *field != COMMA && *field != '>')
X switch (*field) {
X case '<':
X return extract_address(field, address_start);
X case '(':
X while (*field && *field != ')');
X field++;
X break;
X case '"':
X do
X *address++ = *field++;
X while (*field && *field != '"');
X if (*field)
X *address++ = *field++;
X break;
X case ' ':
X *address++ = *field++;
X field = eat(field, ' ');
X break;
X case '\\':
X *address++ = *field++;
X /* fall through */
X default:
X *address++ = *field++;
X }
X *address = NULL;
X if (*field)
X return index(field, COMMA)+1;
X else
X return field;
X}
X
X
END_OF_ida/aux/header.c
if test 1683 -ne `wc -c ida/aux/mkdomext.c <<'END_OF_ida/aux/mkdomext.c'
X/*
X** MKDOMEXT -- Extend domain names
X** Copyright (c) 1987 Lennart Lovstrand
X** CIS Dept, Univ of Linkoping, Sweden
X**
X** Use it, abuse it, but don't sell it.
X*/
X
X#include "useful.h"
X#include
X#include
X
X#ifndef lint
Xstatic char SccsId[] = "@(#)mkdomext.c 1.5 (lel@ida.liu.se) 4/24/87";
X#endif !lint
X
Xvoid printf(), fprintf();
X
Xchar *Progname;
X
Xmain(argc, argv)
X int argc;
X char **argv;
X{
X char buf[BUFSIZ];
X char domains[BUFSIZ];
X char *tab, *p, *index();
X
X Progname = argv[0];
X
X if (argc == 1) {
X fprintf(stderr, "%s: no domains?\n", Progname);
X exit(1);
X }
X
X /* collect the argument domain names */
X domains[0] = '\0';
X for (argc--, argv++; argc > 0; argc--, argv++) {
X if (strlen(*argv) + 3 > sizeof(domains)) {
X fprintf(stderr, "%s: too many domain arguments--\n %s %s %s\n",
X Progname,
X "chain two instances of", Progname,
X "together or recompile with larger ``domains'' array");
X exit(1);
X }
X (void) strcat(domains, " .");
X (void) strcat(domains, *argv);
X }
X
X while (gets(buf) != NULL) {
X tab = index(buf, '\t');
X if (tab != NULL)
X *tab = '\0';
X
X for (p = index(buf, '.'); p != NULL; p = index(p + 1, '.')) {
X if (instring(domains, p)) {
X for (; p != NULL; p = index(p + 1, '.')) {
X *p = '\0';
X if (tab != NULL)
X printf("%s\t%s\n", buf, tab + 1);
X else
X printf("%s\n", buf);
X *p = '.';
X }
X break;
X }
X }
X if (tab != NULL)
X *tab = '\t';
X puts(buf);
X }
X}
X
X/*
X** INSTRING -- Returns TRUE if the source string ``s'' can be found
X** as a substring in target string ``t''.
X*/
X
Xinstring(t, s)
X char *t, *s;
X{
X extern char *index();
X register char *p;
X register int len = strlen(s);
X
X for (p = index(t, *s); p != NULL; p = index(p + 1, *s))
X if (ispart(p, s, len))
X return TRUE;
X return FALSE;
X}
X
X/*
X** ISPART -- Compare at most the first n chars of two strings
X** without respect to upper/lower case.
X*/
X
Xispart(s, t, n)
X register char *s, *t;
X register int n;
X{
X for (; n > 0 && *s != '\0' && *t != '\0'; s++, t++, n--)
X if ((isupper(*s) ? tolower(*s) : *s) !=
X (isupper(*t) ? tolower(*t) : *t))
X break;
X return (n == 0 || *s == *t); /* really *s == 0 && *t == 0 */
X}
END_OF_ida/aux/mkdomext.c
if test 2248 -ne `wc -c ida/aux/scanf.c <<'END_OF_ida/aux/scanf.c'
X/*
X** SCANF -- Program to scan & extract input lines.
X** Copyright (c) 1987 Lennart Lovstrand
X** CIS Dept, Univ of Linkoping, Sweden
X**
X** Use it, abuse it, but don't sell it.
X**
X** Very simple version 0.1 of Apr 19, 1987 1:18am
X*/
X
X#include "useful.h"
X#include
X#include
X
Xmain(argc, argv)
X int argc;
X char **argv;
X{
X char buf[BUFSIZ], val[BUFSIZ];
X FILE *input;
X bool ignore_case = FALSE;
X
X if (argc > 1 && strcmp(argv[1], "-i") == 0) {
X ignore_case = TRUE;
X argc--; argv++;
X }
X
X if (argc < 2 || argc > 3) {
X fprintf(stderr, "usage: %s [-i] scanf_pattern [file]");
X exit(1);
X }
X
X if (ignore_case)
X lower(argv[1]);
X
X if (argc == 2)
X input = stdin;
X else {
X input = fopen(argv[2], "r");
X if (input == NULL) {
X perror(argv[2]);
X exit(1);
X }
X }
X
X while (fgets(buf, sizeof(buf), input) != NULL) {
X if (ignore_case)
X lower(buf);
X if (sscanf(buf, argv[1], val) == 1)
X puts(val);
X }
X}
X
Xlower(p)
X register char *p;
X{
X for (; *p != '\0'; p++)
X if (isupper(*p))
X *p = tolower(*p);
X}
END_OF_ida/aux/scanf.c
if test 1068 -ne `wc -c ida/cf/Makefile <<'END_OF_ida/cf/Makefile'
X#
X# MAKEFILE -- Configuration Files.
X# Copyright (c) 1987 Lennart Lovstrand
X# CIS Dept, Univ of Linkoping, Sweden
X#
X# Use it, abuse it, but don't sell it.
X#
X
X# Linkoping specific defintions
XCONFIGS= asterix.cf client.cf majestix.cf newaliases.cf obelix.cf
X
XCLIENTS= crabbofix lillefix miraculix portofix prefix senilix \
X smidefix tragicomix
X
X# The following definitions are inserted by ../Makefile
X# Change them there--not here!
XLIBDIR= /usr/lib/mail
X
Xall: $(CONFIGS)
X
Xinstall: $(CONFIGS)
X cp majestix.cf client.cf newaliases.cf $(LIBDIR)
X rcp asterix.cf asterix:/usr/lib/sendmail.cf
X mail -s sendmail.cf real_lel@obelix .cf instead.'
X
Xstop:
X -skill sendmail
X
Xrestart: stop
X /usr/lib/sendmail -bd -q30m
X
X.SUFFIXES: .cf .m4
X
X.m4.cf:
X m4 $*.m4 >$*.cf
END_OF_ida/cf/Makefile
if test 1153 -ne `wc -c ida/cf/asterix.m4 <<'END_OF_ida/cf/asterix.m4'
X# Sendmail configuration file for asterix.liu.se
Xdefine(ALIASES, LIBDIR/aliases)
Xdefine(DECNETXTABLE, LIBDIR/decnet/xtable)
Xdefine(DECNETNODES, LIBDIR/decnet/nodes)
Xdefine(DEFAULT_DOMAIN, liu.se)
Xdefine(DOMAINTABLE, LIBDIR/domaintable)
Xdefine(GENERICFROM, LIBDIR/generics)
Xdefine(MAILERTABLE, LIBDIR/mailertable)
Xdefine(PATHTABLE, LIBDIR/pathtable)
Xdefine(UUCPNODES, /usr/lib/uucp/L.sys)
Xdefine(UUCPXTABLE, LIBDIR/uucp/xtable)
Xinclude(Sendmail.mc)
END_OF_ida/cf/asterix.m4
if test 448 -ne `wc -c ida/cf/client.m4 <<'END_OF_ida/cf/client.m4'
X# Sendmail configuration file for Sun-3 clients (*.liu.se)
Xdefine(ALIASES, LIBDIR/aliases)
Xdefine(DECNETXTABLE, LIBDIR/decnet/xtable)
Xdefine(DECNETNODES, LIBDIR/decnet/nodes)
Xdefine(DEFAULT_DOMAIN, liu.se)
Xdefine(DOMAINTABLE, LIBDIR/domaintable)
Xdefine(GENERICFROM, LIBDIR/generics)
Xdefine(PSEUDONYMS, all)
Xdefine(RELAY_HOST, majestix)
Xdefine(RELAY_MAILER, TCP)
Xdefine(RSH_SERVER, majestix)
Xinclude(Sendmail.mc)
END_OF_ida/cf/client.m4
if test 412 -ne `wc -c ida/cf/majestix.m4 <<'END_OF_ida/cf/majestix.m4'
X# Sendmail configuration file for host majestix.liu.se
Xdefine(ALIASES, LIBDIR/aliases)
Xdefine(DECNETXTABLE, LIBDIR/decnet/xtable)
Xdefine(DECNETNODES, LIBDIR/decnet/nodes)
Xdefine(DEFAULT_DOMAIN, liu.se)
Xdefine(DOMAINTABLE, LIBDIR/domaintable)
Xdefine(GENERICFROM, LIBDIR/generics)
Xdefine(MAILERTABLE, LIBDIR/mailertable)
Xdefine(PATHTABLE, LIBDIR/pathtable)
Xdefine(PSEUDONYMS, ida.liu.se liuida all)
Xdefine(UUCPNAME, liuida)
Xdefine(UUCPNODES, /usr/lib/uucp/L.sys)
Xdefine(UUCPRELAYS, LIBDIR/uucp/relays)
Xdefine(UUCPXTABLE, LIBDIR/uucp/xtable)
Xinclude(Sendmail.mc)
END_OF_ida/cf/majestix.m4
if test 560 -ne `wc -c ida/cf/newaliases.m4 <<'END_OF_ida/cf/newaliases.m4'
X# Automatically generated config file for newaliases program
Xdefine(ALIASES, LIBDIR/aliases)
Xdefine(DEFAULT_HOST, all)
Xdefine(DOMAINTABLE, LIBDIR/domaintable)
Xdefine(NEWALIASES)
Xinclude(Sendmail.mc)
END_OF_ida/cf/newaliases.m4
if test 199 -ne `wc -c ida/cf/obelix.m4 <<'END_OF_ida/cf/obelix.m4'
X# Sendmail configuration file for host obelix.UUCP
Xdefine(ALIASES, LIBDIR/aliases)
Xdefine(BSD29)
Xdefine(DEFAULT_DOMAIN, liu.se)
Xdefine(RELAY_HOST, asterix)
Xdefine(RELAY_MAILER, UUCP-B)
Xdefine(PSEUDONYMS, obelix.UUCP obelix.liu.se obelix.liu obelix.ida.liu.se)
Xdefine(UUCPNODES, /usr/lib/uucp/L.sys)
Xinclude(Sendmail.mc)
END_OF_ida/cf/obelix.m4
if test 320 -ne `wc -c ida/doc/Makefile <<'END_OF_ida/doc/Makefile'
X#
X# MAKEFILE -- The Documentation Files.
X# Copyright (c) 1987 Lennart Lovstrand
X# CIS Dept, Univ of Linkoping, Sweden
X#
X# Use it, abuse it, but don't sell it.
X#
X
XMAN1S= dbm.1 mkdomext.1
XMAN8S= xalparse.8
XMANS= $(MAN1S) $(MAN8S)
XDOC= paper.ms
XDOCS= part1.ms part2.ms
X
X# The following definitions are inserted by ../Makefile
X# Change them there--not here!
XMAN8DIR= /usr/man/manl
XMAN8EXT= .l
XMAN1DIR= /usr/man/manl
XMAN1EXT= .l
XTROFF= pstroff
X
Xdoc: $(DOC)
X refer -e -l,2 -s $(DOC) | tbl | $(TROFF) -ms
X
Xdoc.lpr: $(DOC)
X refer -e -l,2 -s $(DOC) | tbl | nroff -ms > $@
X
Xman: $(MANS)
X for m in $(MANS); do \
X $(TROFF) -man $$m; \
X done
X
Xman.lpr: $(MANS)
X for m in $(MANS); do \
X nroff -man $$m > $$m.lpr; \
X done
X
X$(DOC):
X cat $(DOCS) >$(DOC)
X -rm -f $(DOCS)
X
Xinstall: $(MANS)
X for m in $(MAN1S); do \
X cp $$m $(MAN1DIR)/`basename $$m .1`$(MAN1EXT); \
X done
X for m in $(MAN8S); do \
X cp $$m $(MAN8DIR)/`basename $$m .8`$(MAN8EXT); \
X done
X
Xclean:
X -rm -f \#* *~ *.lpr
END_OF_ida/doc/Makefile
if test 996 -ne `wc -c ida/doc/mkdomext.1 <<'END_OF_ida/doc/mkdomext.1'
X.TH MKDOMEXT 1 "24 April 1987" \" -*- nroff -*-
X.SH NAME
Xmkdomext \- make the exteneded set of domain names
X.SH SYNOPSIS
X.B mkdomext
X.IR domain " [\|.\|.\|.\|]"
X.SH DESCRIPTION
XThis program acts as a filter that, when supplied with fully qualified
Xdomain names on stdin, will generate all legal abbreviations of these on
Xstdout with respect to the parent domains given on the command line. It
Xis used to be able to recognize unqualified local subdomains and sibling
Xdomains from one or more positions in the domain hierarchy.
X.PP
XThe fully qualified domains on stdin should be given one on a line, each
Xterminated by a newline or tab. Any text after the tab will go through
Xuntouched. This makes it especially useful for filtering the output of
Xthe
X.IR dbm (1)
X.B parse
Xfunction when producing a domain name server table.
X.SH EXAMPLE
X.nf
X.ta \w'majestix.liu.se'u+5n
X% cat >foo
Xmajestix.liu.se majestix.liu.se
Xobelix.liu.se obelix.liu.se
Xobelix.\s-1UUCP\s+1 obelix.liu.se
Xaida.uu.se aida.uu.se
Xmc.lcs.mit.edu mc.lcs.mit.edu
Xmit-mc mc.lcs.mit.edu
X^D
X% mkdomext liu.se \s-1UUCP\s+1 bar
X% cat bar
Xmajestix majestix.liu.se
Xmajestix.liu majestix.liu.se
Xmajestix.liu.se majestix.liu.se
Xobelix obelix.liu.se
Xobelix.liu obelix.liu.se
Xobelix.liu.se obelix.liu.se
Xobelix obelix.liu.se
Xobelix.\s-1UUCP\s+1 obelix.liu.se
Xaida.uu aida.uu.se
Xaida.uu.se aida.uu.se
Xmc.lcs.mit.edu mc.lcs.mit.edu
Xmit-mc mc.lcs.mit.edu
X.SH AUTHOR
X.nf
XLennart Lovstrand
XCIS Dept, Univ of Linkoping, Sweden
X.fi
X.SH "SEE ALSO"
X.IR dbm (1)
X.br
XRFC822\-Standard for the Format of ARPA Internet Text Messages
X(section 6.2.2)
END_OF_ida/doc/mkdomext.1
if test 1613 -ne `wc -c ida/doc/xalparse.8 <<'END_OF_ida/doc/xalparse.8'
X.TH XALPARSE 8 "24 April 1987" \" -*- nroff -*-
X.SH NAME
Xxalparse \- parse an extended aliases file
X.SH SYNOPSIS
X.B xalparse
X.I xaliases aliases generics
X.SH DESCRIPTION
XThe
X.I xalparse
Xprogram parses an extended aliases file and produceces an ordinary
Xaliases file together with a file with generic address translations.
X.PP
XThe format of the xaliases file is a superset of
X.IR aliases (5):
X.RS
Xalias, alias, \|.\|.\|.\|: prefix address, prefix address, \|.\|.\|.\|
X.RE
XIt differes by allowing more than one LHS alias and by adding an
Xoptional
X.I prefix
Xin front of each RHS address. The
X.I prefix
Xmarks the address as either inbound or outbound according to the
Xfollowing table:
X.RS
X.nf
X.ta \w'(\fIno mark\fP)'u+5n
X(\fIno mark\fP) Inbound
X< Outbound
X> Inbound
X<> Both Inbound and Outbound
X.fi
X.RE
X.PP
XInbound aliasing is the normal function implemented by
X.IR aliases (5).
XAll inbound entries are therefore simply copied to the
X.I aliases
Xoutput file. Outbound addresses are written to the
X.I generics
Xfile in a format suitable for parsing by
X.I dbm (1).
XEach line will consist of the first LHS
X.I alias
Xof the entry followed by the outbound addresses separated with spaces.
XThe
X.I generics
Xfile is then normally loaded into a
X.IR dbm (3)
Xdatabase that is read by
X.IR sendmail (8)
Xand used to substitute header sender addresses with the aliased name.
X.SH AUTHOR
X.nf
XLennart Lovstrand
XCIS Dept, Univ of Linkoping, Sweden
X.fi
X.SH "SEE ALSO"
X.IR dbm (1),
X.IR aliases (5),
X.IR sendmail (8)
X.br
XElectronic Mail Addressing in Theory and Practice with The IDA Sendmail
XEnchancement Kit.
END_OF_ida/doc/xalparse.8
if test 1604 -ne `wc -c ida/lib/Makefile <<'END_OF_ida/lib/Makefile'
X#
X# MAKEFILE -- Library Files.
X# Copyright (c) 1987 Lennart Lovstrand
X# CIS Dept, Univ of Linkoping, Sweden
X#
X# Use it, abuse it, but don't sell it.
X#
X
XSENDMAIL= /usr/lib/sendmail
XTABLES= domaintable$(DBMEXT) generics$(DBMEXT) \
X pathtable$(DBMEXT) aliases$(DBMEXT) mailertable$(DBMEXT) \
X decnet/nodes decnet/xtable$(DBMEXT) uucp/xtable$(DBMEXT)
XPATHFLAGS= -C25 -i -l`hostname`$(DOMAIN)
XUUCPNODES= /usr/lib/uucp/L.sys
X
X# Linkoping specific definitions
XDEPENDENTS= asterix
XDOMAIN= .liu.se
XNODE_DATA= /usr/lisbet/ps/system/node-data.cmd
X
X# The following definitions are inserted by ../Makefile
X# Change them there--not here!
XLIBDIR= /usr/lib/mail
XDBMEXT= .dir
X
X
X# Update all dbm tables
Xall: $(TABLES)
X
X# Fetch vital files from file server
Xpropagate:
X @for d in $(DEPENDENTS); do \
X echo ">>> Propagating changes to $$d"; \
X rcp domaintable pathtable $${d}:$(LIBDIR); \
X rcp decnet/nodes decnet/xtable $${d}:$(LIBDIR)/decnet; \
X rcp uucp/xtable $${d}:$(LIBDIR)/uucp; \
X rsh $$d "cd $(LIBDIR); make"; \
X done
X
Xpathtable$(DBMEXT): pathtable
X pathalias $(PATHFLAGS) pathtable | dbm load pathtable
X
Xaliases generics: xaliases
X xalparse xaliases aliases generics
X
Xaliases$(DBMEXT): aliases
X $(SENDMAIL) -Cnewaliases.cf -bi
X
Xgenerics$(DBMEXT): generics
X dbm -L make generics generics
X
X# Note: Local fix here for making all DECnet nodes belong in .SUNET.SE
Xdomaintable$(DBMEXT): domaintable decnet/nodes
X (dbm parse domaintable; \
X awk '{printf "%s.sunet.se\t%s.sunet.se\n", $$1, $$1}' decnet/nodes) |\
X mkdomext liu.se ida.liu.se sunet.se UUCP | dbm -IL load domaintable
X
Xmailertable$(DBMEXT): mailertable
X dbm -L make mailertable mailertable
X
X# Note: Local fix here for making all DECnet nodes belong in .SUNET.SE
Xdecnet/xtable$(DBMEXT): decnet/xtable decnet/nodes
X (dbm parse decnet/xtable; \
X awk '{printf "%s.sunet.se\t%s\n", $$1, $$1}' decnet/nodes) | \
X dbm -IL load decnet/xtable
X
Xdecnet/nodes: $(NODE_DATA)
X cp decnet/nodes decnet/nodes.old
X scanf -i " set node %*s name %s" $(NODE_DATA) >$@
X
Xuucp/xtable$(DBMEXT): uucp/xtable $(UUCPNODES)
X (dbm parse uucp/xtable; \
X awk '{printf "%s.UUCP\t%s\n", $$1, $$1}' $(UUCPNODES)) | \
X dbm -IL load uucp/xtable
X
Xstop:
X -/usr/local/bin/skill sendmail
X
Xrestart: stop
X $(SENDMAIL) -bd -q30m
X
Xasterix:
X rsh asterix "cd /usr/lib/mail; make fetch all"
X
Xclean:
X -rm -f \#* *~ *.dir *.pag *.map *.dat */*.dir */*.pag */*.map */*.dat
END_OF_ida/lib/Makefile
if test 2394 -ne `wc -c ida/lib/decnet/nodes <<'END_OF_ida/lib/decnet/nodes'
Xliuida
Xlisbet
Xlaura
Xbill
Xbull
Xtrisse
Xfrasse
Xmurre
Xfille
Xbilbo
Xfrodo
Xelrond
Xgollum
Xolds
Xchevy
Xkafka
Xrolls
Xniva
Xvaz
Xlinnea
Xlinus
Xlina
Xelinor
Xp13l00
Xviktor
Xludvig
Xhazel
Xbigwig
Xkloker
Xtoker
Xclover
Xfiver
Xdaisy
Xaladin
Xturtle
Xminmin
Xjinjin
Xweiwei
Xfelix
Xflinta
Xflisa
Xfrida
Xfilip
Xfilipb
Xfenix
Xfrank
Xdec
Xrtr13a
Xmoll
Xdur
Xnfr
Xelin
Xelsy
Xelmer
Xromeo
Xvaxkab
Xkleo
Xklas
Xkicki
Xvera
Xkaron
Xpallas
Xfreja
Xelvira
Xsi
Xrtr08a
Xidun
Xbrage
Xbackus
Xnoatun
Xnjord
Xskade
Xgotl
Xmeta
Xpara
Xthermo
Xhelios
Xoseen
Xksab
Xkthttt
Xevild
Xelinda
Xelise
Xella
Xelton
Xelena
Xelke
Xelsa
Xeliza
Xornen
Xknoen
Xffacom
Xafivax
Xa08001
Xplasma
Xplasm1
Xvanb
Xvana
Xmcg
Xvanc
Xbasun
Xpsypdp
Xpsyvax
Xutb1
Xutb2
Xbiovax
Xostvax
Xtpsyk
Xargus
Xrtm
Xostpdp
Xlvax
Xmanwe
Xskogis
Xfjarr
Xrtr09a
Xmalin
Xtekla
Xcartus
Xpelle
Xpictor
Xtlu
Xmax
Xkvax1
Xkvax2
Xsigurd
Xescil
Xgwax1
Xgwax2
Xkemist
Xcell
Xminc
Xsilver
Xlapse
Xmaja
Xrtr18a
Ximunis
Xxray
Xgraph
Ximmuna
Xbmc1
Xfarfar
Xeva
Xnimbus
Xlaban
Xpax
Xtersx
Xapele1
Xtekn01
Xinfth1
Xtherm1
Xorgch1
Xfyvax1
Xfyvax2
Xelsys
Xcontrl
Xmeddat
Xsostel
Xfyvax3
Xcthmga
Xrtr31a
Xinfth2
Xinfth3
Xinfth4
Xkstad
Xlnkarl
Xedbild
Xsmtgbg
Xgotmed
Xvega
Xkcvax
Xsirius
Xgemini
Xadam
Xcastor
Xpollux
Xrigel
Xpandor
Xikaros
Xjanus
Xperdix
Xpan
Xshanno
Xbutter
Xerlang
Xpluto
Xagaton
Xbode
Xemma
Xshiva
Xegino
Xsamson
Xtyche
Xgarbo
Xalice
Xmira
Xp46xje
Xp46ldc
Xrtr46a
Xp46ibm
Xp46vm1
Xvaxi
Xvaxii
END_OF_ida/lib/decnet/nodes
if test 1248 -ne `wc -c ida/lib/decnet/xtable <<'END_OF_ida/lib/decnet/xtable'
X#
X# DECnet domain translation table v1.0
X# Last edited by lel@ida.liu.se Mon Apr 20 21:42:58 MET DST 1987
X#
X# This file contiains the official domain name for nodes
X# either on the locally connected DECnet or on the national
X# SUNET.
X#
X# Each line should contain the node's name within the DECnet
X# followed by it's full official domain name. The domain name
X# may be followed by other names by which the node should be
X# recognized, eg. when nodes are present in multiple domains.
X#
X# Nodes not represented here but present in the decnet/nodes file
X# are assumed to be contained in the SUNET.SE domain.
X#
X
Xagaton agaton.lu.se
Xaida aida.uu.se
Xaladin aladin.liu.se
Xbmc1 bmc1.uu.se
Xcarmen carmen.uu.se
Xcartus cartus.uu.se
Xcell cell.uu.se
Xclover clover.liu.se
Xdaisy daisy.liu.se
Xelinor elinor.liu.se
Xescil escil.uu.se
Xeva eva.uu.se
Xfarfar farfar.uu.se
Xfreja freja.qz.se
Xgraph graph.uu.se
Xgwax1 gwax1.uu.se
Xgwax2 gwax2.uu.se
Xhazel hazel.liu.se
Ximmuna immuna.uu.se
Ximunis imunis.uu.se
Xjinjin jinjin.liu.se
Xkemist kemist.uu.se
Xkvax1 kvax1.uu.se
Xkvax2 kvax2.uu.se
Xlaban laban.uu.se
Xlapse lapse.uu.se
Xlina lina.liu.se
Xlinnea linnea.liu.se
Xlinus linus.liu.se
Xlisbet lisbet.liu.se
Xludvig ludvig.liu.se
Xmaja maja.uu.se
Xmalin malin.uu.se
Xmax max.uu.se
Xminc minc.uu.se
Xminmin minmin.liu.se
Xnimbus nimbus.uu.se
Xp13l00 p13l00.liu.se
Xpandor pandor.lu.se
Xpax pax.uu.se
Xpelle pelle.uu.se
Xpictor pictor.uu.se
Xrtr18a rtr18a.uu.se
Xsigurd sigurd.uu.se
Xsilver silver.uu.se
Xtekla tekla.uu.se
Xtlu tlu.uu.se
Xturtle turtle.liu.se
Xviktor viktor.liu.se
Xweiwei weiwei.liu.se
Xxray xray.uu.se
END_OF_ida/lib/decnet/xtable
if test 1613 -ne `wc -c ida/lib/mailertable <<'END_OF_ida/lib/mailertable'
X#
X# Mailer table for physical node majestix.liu.se
X# (aka the UUCP node liuida)
X#
X
XUUCP:alp alp.UUCP alp.se
XUUCP:liutde liutde.UUCP liutde.se tde.liu.se
XUUCP:prosys prosys.UUCP prosys.se
XUUCP-A:enea enea.UUCP enea.se
XUUCP-A:erilin erilin.UUCP erilin.se erilin.ericsson.se
XUUCP-A:erix erix.UUCP erix.se erix.ericsson.se
XUUCP-A:rainier rainier.UUCP rainier.se rainier.liu.se
END_OF_ida/lib/mailertable
if test 374 -ne `wc -c ida/lib/restart_clients <<'END_OF_ida/lib/restart_clients'
X#!/bin/sh
X# restart sendmail on all clients
X#
X
Xfor h in crabbofix lillefix miraculix portofix prefix senilix smidefix tragico
mix; do
X echo -n "$h "
X rsh $h -n "(cd /usr/lib/mail; make restart)"
Xdone
END_OF_ida/lib/restart_clients
if test 202 -ne `wc -c ida/lib/sendmail.hf <<'END_OF_ida/lib/sendmail.hf'
X@(#) sendmail.hf 4.2 6/7/85
Xcpyr
Xcpyr Sendmail
Xcpyr Copyright (c) 1983 Eric P. Allman
Xcpyr Berkeley, California
Xcpyr
Xcpyr Copyright (c) 1983 Regents of the University of California.
Xcpyr All rights reserved. The Berkeley software License Agreement
Xcpyr specifies the terms and conditions for redistribution.
Xcpyr
Xcpyr @(#)sendmail.hf 4.2 (Berkeley) 6/7/85
Xcpyr
Xsmtp Commands:
Xsmtp HELO MAIL RCPT DATA RSET
Xsmtp NOOP QUIT HELP VRFY EXPN
Xsmtp For more info use "HELP ".
Xsmtp To report bugs in the implementation contact eric@Berkeley.ARPA
Xsmtp or eric@UCB-ARPA.ARPA.
Xsmtp For local information contact postmaster at this site.
Xhelp HELP [ ]
Xhelp The HELP command gives help info.
Xhelo HELO
Xhelo Introduce yourself. I am a boor, so I really don't
Xhelo care if you do.
Xmail MAIL FROM:
Xmail Specifies the sender.
Xrcpt RCPT TO:
Xrcpt Specifies the recipient. Can be used any number of times.
Xdata DATA
Xdata Following text is collected as the message.
Xdata End with a single dot.
Xrset RSET
Xrset Resets the system.
Xquit QUIT
Xquit Exit sendmail (SMTP).
Xvrfy VRFY
Xvrfy Not implemented to protocol. Gives some sexy
Xvrfy information.
Xexpn EXPN
Xexpn Same as VRFY in this implementation.
Xnoop NOOP
Xnoop Do nothing.
Xsend SEND FROM:
Xsend replaces the MAIL command, and can be used to send
Xsend directly to a users terminal. Not supported in this
Xsend implementation.
Xsoml SOML FROM:
Xsoml Send or mail. If the user is logged in, send directly,
Xsoml otherwise mail. Not supported in this implementation.
Xsaml SAML FROM:
Xsaml Send and mail. Send directly to the user's terminal,
Xsaml and also mail a letter. Not supported in this
Xsaml implementation.
Xturn TURN
Xturn Reverses the direction of the connection. Not currently
Xturn implemented.
END_OF_ida/lib/sendmail.hf
if test 1858 -ne `wc -c ida/lib/sendmail.st <<'END_OF_ida/lib/sendmail.st'
END_OF_ida/lib/sendmail.st
if test 0 -ne `wc -c ida/lib/stop_clients <<'END_OF_ida/lib/stop_clients'
X#!/bin/sh
X# stop sendmail on all clients
X#
X
Xfor h in crabbofix lillefix miraculix portofix prefix senilix smidefix tragico
mix; do
X echo -n "$h "
X rsh $h -n "(cd /usr/lib/mail; make stop)"
Xdone
END_OF_ida/lib/stop_clients
if test 196 -ne `wc -c ida/lib/uucp/relays <<'END_OF_ida/lib/uucp/relays'
Xakgua.UUCP
Xalberta.UUCP
Xbellcore.UUCP
Xburl.UUCP
Xcbosgd.UUCP
Xcernvax.UUCP
Xclyde.UUCP
Xcmcl2.UUCP
Xcuae2.UUCP
Xdecvax.UUCP
Xdecwrl.UUCP
Xdiku.UUCP
Xdrillsys.UUCP
Xenea.UUCP
Xenea.se
Xgatech.UUCP
Xglacier.UUCP
Xhao.UUCP
Xhplabs.UUCP
Xi2unix.UUCP
Xihnp4.UUCP
Xinria.UUCP
Xkddlab.UUCP
Xlll-crg.UUCP
Xlll-lcc.UUCP
Xmcnc.UUCP
Xmcvax.UUCP
Xmcvax.cwi.nl
Xmunnari.UUCP
Xoliveb.UUCP
Xpenet.UUCP
Xphilabs.UUCP
Xprlb2.UUCP
Xqantel.UUCP
Xsdcrdcf.UUCP
Xsdcsvax.UUCP
Xseismo.UUCP
Xtektronix.UUCP
Xubc-vision.UUCP
Xukc.UUCP
Xulysses.UUCP
Xunido.UUCP
Xutzoo.UUCP
Xuw-beaver.UUCP
Xvmars.UUCP
Xwatmath.UUCP
END_OF_ida/lib/uucp/relays
if test 548 -ne `wc -c ida/lib/uucp/xtable <<'END_OF_ida/lib/uucp/xtable'
X#
X# Translation table between domain addresses and
X# flat-spaced UUCP node names.
X#
X# This table is used when formatting addresses for
X# delivery overold-fashioned UUCP links. Batched SMTP
X# over UUCP does not use this table, since it is assumed
X# that (B)SMTP nodes already know about domain names.
X#
X# It is never necessary to enter a translation from "foo.UUCP"
X# to "foo", since that already (automatically) is done by
X# ruleset 14.
X#
X
Xalp alp.se
Xemil emil.uu.se
Xenea enea.se
Xerilin erilin.ericsson.se
Xerix erix.ericsson.se
Xkuling kuling.uu.se
Xliuida ida.liu.se
Xliutde tde.liu.se
Xmcvax mcvax.cwi.nl
Xnumax numax.uu.se
Xobelix obelix.liu.se
Xprosys prosys.se
END_OF_ida/lib/uucp/xtable
if test 672 -ne `wc -c ida/patches/BSD29.edit <<'END_OF_ida/patches/BSD29.edit'
X: BSD29.edit SRCDIR
Xcd $1
Xchmod u+w Makefile
Xecho ">>> Editing $1/Makefile for use with BSD 2.9..."
X/bin/ed Makefile <ida/patches/BSD42.diff <<'END_OF_ida/patches/BSD42.diff'
X*** sendmail.h.old Wed May 27 01:59:12 1987
X--- sendmail.h Wed May 27 02:26:37 1987
X***************
X*** 652,654 ****
X--- 652,673 ----
X };
X
X extern struct metamac MetaMacros[];
X+
X+ /*
X+ ** BSD4.2 Compatibility Code
X+ */
X+
X+ #ifndef sigmask
X+ # define sigmask(m) (1 << ((m)-1))
X+ #endif sigmask
X+
X+ #ifndef TRY_AGAIN
X+ # define TRY_AGAIN 2
X+ # ifdef EXTERN
X+ EXTERN int h_errno; /* ought to be initialized too */
X+ # endif EXTERN
X+ #endif TRY_AGAIN
X+
X+ #ifndef LOG_MAIL
X+ # define LOG_MAIL (2<<3)
X+ #endif LOG_MAIL
END_OF_ida/patches/BSD42.diff
if test 523 -ne `wc -c ida/patches/MDBM.edit <<'END_OF_ida/patches/MDBM.edit'
X: MDBM.edit SRCDIR DBMLIB
Xcd $1
Xchmod u+w Makefile
Xecho ">>> Editing $1/Makefile to enable MDBM..."
X/bin/ed Makefile <ida/patches/Makefile <<'END_OF_ida/patches/Makefile'
X#
X# MAKEFILE -- Sendmail Patches.
X# Copyright (c) 1987 Lennart Lovstrand
X# CIS Dept, Univ of Linkoping, Sweden
X#
X# Use it, abuse it, but don't sell it.
X#
X
XSRCDIFFS= Version.c.diff alias.c.diff conf.c.diff daemon.c.diff \
X deliver.c.diff err.c.diff headers.c.diff macro.c.diff \
X main.c.diff parseaddr.c.diff queue.c.diff readcf.c.diff \
X recipient.c.diff savemail.c.diff sendmail.h.diff \
X srvrsmtp.c.diff usersmtp.c.diff util.c.diff
XDOCDIFFS= op.me.diff
X
X
X# The following definitions are inserted by ../Makefile
X# Change them there--not here!
XMDBM=
XDBMLIB= -ldbm
XSRCDIR= ../../src
XDOCDIR= ../../doc
X
XBSD43 bsd43 patch:
X for f in $(SRCDIFFS); do \
X patch $(SRCDIR)/`basename $$f .diff` $$f; \
X done
X for f in $(DOCDIFFS); do \
X patch $(DOCDIR)/`basename $$f .diff` $$f; \
X done
X -if [ -n "$(MDBM)" ]; then \
X cp mdbm_compat.h $(SRCDIR); \
X patch -d $(SRCDIR) -b .old < MDBM.diff; \
X sh MDBM.edit $(SRCDIR) $(DBMLIB); \
X fi
X
XBSD42 bsd42: BSD43
X patch -d $(SRCDIR) -b .old < BSD42.diff
X
XBSD29 bsd29: BSD42
X patch -d $(SRCDIR) -b .old < BSD29.diff
X sh BSD29.edit $(SRCDIR)
X
Xbackup:
X tar cvf Backup.tar $(SRCDIR)/*.[hc] $(DOCDIR)/op.me
X
Xrestore:
X tar xvf Backup.tar
X
Xclean:
X -rm -f \#* *~ Backup.tar
END_OF_ida/patches/Makefile
if test 1231 -ne `wc -c ida/patches/Version.c.diff <<'END_OF_ida/patches/Version.c.diff'
X*** Version.c.orig Fri Mar 13 18:51:11 1987
X--- Version.c Mon May 25 15:51:13 1987
X***************
X*** 12,18 ****
X static char SccsId[] = "@(#)version.c 5.51 (Berkeley) 5/2/86";
X #endif not lint
X
X! char Version[] = "5.51";
X
X # ifdef COMMENT
X
X--- 12,18 ----
X static char SccsId[] = "@(#)version.c 5.51 (Berkeley) 5/2/86";
X #endif not lint
X
X! char Version[] = "5.51++";
X
X # ifdef COMMENT
X
END_OF_ida/patches/Version.c.diff
if test 405 -ne `wc -c ida/patches/conf.c.diff <<'END_OF_ida/patches/conf.c.diff'
X*** conf.c.orig Fri Mar 13 18:51:01 1987
X--- conf.c Mon May 25 15:54:51 1987
X***************
X*** 80,85 ****
X--- 80,86 ----
X "resent-cc", H_RCPT|H_RESENT,
X "bcc", H_RCPT|H_ACHECK,
X "resent-bcc", H_RCPT|H_ACHECK|H_RESENT,
X+ "apparently-to", H_RCPT,
X /* message identification and control */
X "message-id", 0,
X "resent-message-id", H_RESENT,
X***************
X*** 141,146 ****
X--- 142,149 ----
X
X setdefaults()
X {
X+ int c;
X+
X QueueLA = 8;
X QueueFactor = 10000;
X RefuseLA = 12;
X***************
X*** 151,156 ****
X--- 154,164 ----
X FileMode = 0644;
X DefUid = 1;
X DefGid = 1;
X+
X+ # ifdef NDBM
X+ for (c = 0; c < 128; c++)
X+ DbmTab[c].dbm = DB_NOTYETOPEN;
X+ # endif NDBM
X }
X
X # ifdef V6
END_OF_ida/patches/conf.c.diff
if test 720 -ne `wc -c ida/patches/err.c.diff <<'END_OF_ida/patches/err.c.diff'
X*** err.c.orig Fri Mar 13 18:51:05 1987
X--- err.c Mon May 25 15:55:17 1987
X***************
X*** 354,360 ****
X (void) sprintf(buf, "Connection refused by %s", CurHostName);
X return (buf);
X
X! case (TRY_AGAIN+MAX_ERRNO):
X (void) sprintf(buf, "Host Name Lookup Failure");
X return (buf);
X }
X--- 354,360 ----
X (void) sprintf(buf, "Connection refused by %s", CurHostName);
X return (buf);
X
X! case (TRY_AGAIN+MAX_ERRNO):
X (void) sprintf(buf, "Host Name Lookup Failure");
X return (buf);
X }
END_OF_ida/patches/err.c.diff
if test 518 -ne `wc -c ida/patches/headers.c.diff <<'END_OF_ida/patches/headers.c.diff'
X*** headers.c.orig Fri Mar 13 18:51:06 1987
X--- headers.c Mon May 25 15:51:27 1987
X***************
X*** 777,783 ****
X *p = '\0';
X
X /* translate the name to be relative */
X! name = remotename(name, m, bitset(H_FROM, h->h_flags), FALSE);
X if (*name == '\0')
X {
X *p = savechar;
X--- 777,784 ----
X *p = '\0';
X
X /* translate the name to be relative */
X! name = remotename(name, m, bitset(H_FROM, h->h_flags), FALSE,
X! TRUE);
X if (*name == '\0')
X {
X *p = savechar;
END_OF_ida/patches/headers.c.diff
if test 503 -ne `wc -c ida/patches/macro.c.diff <<'END_OF_ida/patches/macro.c.diff'
X*** macro.c.orig Fri Mar 13 18:51:06 1987
X--- macro.c Mon May 25 15:51:29 1987
X***************
X*** 168,173 ****
X--- 168,174 ----
X ** $h to host
X ** $i queue id
X ** $j official SMTP hostname, used in messages+
X+ ** $k our UUCP host name, if different from $w
X ** $l UNIX-style from line+
X ** $n name of sendmail ("MAILER-DAEMON" on local
X ** net typically)+
END_OF_ida/patches/macro.c.diff
if test 387 -ne `wc -c ida/patches/mdbm_compat.h <<'END_OF_ida/patches/mdbm_compat.h'
X/**
X ** MDBM Compatibility File
X **
X ** These definitions will make sendmail use Maryland's mdbm
X ** library package instead of the new multifile database
X ** routines of 4.3.
X **
X ** Note: Don't use this if you already have ndbm.
X **/
X
X#include
X
Xtypedef struct mdbm DBMFILE;
X
X#ifndef NDBM
X# define NDBM
X#endif NDBM
X#ifndef MDBM
X# define MDBM
X#endif MDBM
X
X/*
X * Mdbm equivalents for ndbm functions
X */
X
X#define DBM_REPLACE MDBM_REPLACE
X#define DBM_INSERT MDBM_INSERT
X
X#define dbm_open(file, flags, mode) \
X mdbm_open(file, flags, mode, NULL, NULL, NULL)
X#define dbm_close mdbm_close
X#define dbm_fetch mdbm_fetch
X#define dbm_store mdbm_store
X#define dbm_firstkey mdbm_firstkey
X#define dbm_nextkey mdbm_nextkey /* don't forget to fill in 2nd param! */
END_OF_ida/patches/mdbm_compat.h
if test 762 -ne `wc -c ida/patches/queue.c.diff <<'END_OF_ida/patches/queue.c.diff'
X*** queue.c.orig Fri Mar 13 18:51:03 1987
X--- queue.c Mon May 25 15:51:38 1987
X***************
X*** 175,181 ****
X */
X
X bzero((char *) &nullmailer, sizeof nullmailer);
X! nullmailer.m_r_rwset = nullmailer.m_s_rwset = -1;
X nullmailer.m_eol = "\n";
X
X define('g', "\001f", e);
X--- 175,182 ----
X */
X
X bzero((char *) &nullmailer, sizeof nullmailer);
X! nullmailer.m_re_rwset = nullmailer.m_se_rwset = -1;
X! nullmailer.m_rh_rwset = nullmailer.m_sh_rwset = -1;
X nullmailer.m_eol = "\n";
X
X define('g', "\001f", e);
X***************
X*** 352,357 ****
X--- 353,362 ----
X free(w->w_name);
X free((char *) w);
X }
X+ /*
X+ * Don't let dropenvelope() trash locked queue files!
X+ */
X+ CurEnv->e_id = NULL;
X finis();
X }
X /*
END_OF_ida/patches/queue.c.diff
if test 744 -ne `wc -c ida/patches/readcf.c.diff <<'END_OF_ida/patches/readcf.c.diff'
X*** readcf.c.orig Fri Mar 13 18:51:07 1987
X--- readcf.c Mon May 25 15:51:41 1987
X***************
X*** 434,441 ****
X setbitn(*p, m->m_flags);
X break;
X
X! case 'S': /* sender rewriting ruleset */
X! case 'R': /* recipient rewriting ruleset */
X i = atoi(p);
X if (i < 0 || i >= MAXRWSETS)
X {
X--- 434,441 ----
X setbitn(*p, m->m_flags);
X break;
X
X! case 'S': /* sender rewriting ruleset(s) */
X! case 'R': /* recipient rewriting ruleset(s) */
X i = atoi(p);
X if (i < 0 || i >= MAXRWSETS)
X {
X***************
X*** 442,451 ****
X syserr("invalid rewrite set, %d max", MAXRWSETS
);
X return;
X }
X! if (fcode == 'S')
X! m->m_s_rwset = i;
X! else
X! m->m_r_rwset = i;
X break;
X
X case 'E': /* end of line string */
X--- 442,464 ----
X syserr("invalid rewrite set, %d max", MAXRWSETS
);
X return;
X }
X! /* default envelope ruleset for header ruleset */
X! if (fcode == 'S') {
X! m->m_se_rwset = i;
X! m->m_sh_rwset = i;
X! } else {
X! m->m_re_rwset = i;
X! m->m_rh_rwset = i;
X! }
X! /* look for specific header rewriting ruleset */
X! while (*p != '\0' && *p != ',' && *p != '/') p++;
X! if (*p++ == '/') {
X! i = atoi(p);
X! if (fcode == 'S')
X! m->m_sh_rwset = i;
X! else
X! m->m_rh_rwset = i;
X! }
X break;
X
X case 'E': /* end of line string */
X***************
X*** 797,803 ****
X case 'i': /* ignore dot lines in message */
X IgnrDot = atobool(val);
X break;
X!
X case 'L': /* log level */
X LogLevel = atoi(val);
X break;
X--- 810,821 ----
X case 'i': /* ignore dot lines in message */
X IgnrDot = atobool(val);
X break;
X! # ifdef NDBM
X! case 'K': /* keyed database file */
X! if (*val != '\0')
X! DbmTab[*val].name = newstr(&val[1]);
X! break;
X! # endif NDBM
X case 'L': /* log level */
X LogLevel = atoi(val);
X break;
X***************
X*** 911,916 ****
X--- 929,938 ----
X
X case 'Z': /* work time factor */
X WkTimeFact = atoi(val);
X+ break;
X+
X+ case '/': /* use split envelope/header rewriting */
X+ SplitRewriting = TRUE;
X break;
X
X default:
END_OF_ida/patches/readcf.c.diff
if test 2154 -ne `wc -c ida/patches/savemail.c.diff <<'END_OF_ida/patches/savemail.c.diff
'
X*** savemail.c.orig Fri Mar 13 18:51:08 1987
X--- savemail.c Mon May 25 15:51:45 1987
X***************
X*** 366,371 ****
X--- 366,372 ----
X ENVELOPE errenvelope;
X static int returndepth;
X register ADDRESS *q;
X+ char *to, *cc;
X
X # ifdef DEBUG
X if (tTd(6, 1))
X***************
X*** 395,405 ****
X ee->e_flags |= EF_RESPONSE;
X ee->e_sendqueue = returnq;
X openxscript(ee);
X! for (q = returnq; q != NULL; q = q->q_next)
X! {
X! if (q->q_alias == NULL)
X! addheader("to", q->q_paddr, ee);
X }
X
X (void) sprintf(buf, "Returned mail: %s", msg);
X addheader("subject", buf, ee);
X--- 396,422 ----
X ee->e_flags |= EF_RESPONSE;
X ee->e_sendqueue = returnq;
X openxscript(ee);
X!
X! /* put the recipients in the to: header (cc: for PostMasterCopy) */
X! cc = NULL;
X! to = buf;
X! for (q = returnq; q != NULL; q = q->q_next) {
X! if (q->q_alias == NULL)
X! if (strcmp(q->q_paddr, PostMasterCopy) == 0)
X! cc = q->q_paddr;
X! else {
X! int len = strlen(q->q_paddr);
X!
X! *to++ = ',';
X! strncpy(to, q->q_paddr, len);
X! to += len;
X! }
X }
X+ *to = '\0';
X+ if (to != buf)
X+ addheader("to", buf+1, ee);
X+ if (cc)
X+ addheader("cc", cc, ee);
X
X (void) sprintf(buf, "Returned mail: %s", msg);
X addheader("subject", buf, ee);
END_OF_ida/patches/savemail.c.diff
if test 1282 -ne `wc -c ida/patches/usersmtp.c.diff <<'END_OF_ida/patches/usersmtp.c.diff
'
X*** usersmtp.c.orig Fri Mar 13 18:51:09 1987
X--- usersmtp.c Mon May 25 15:51:50 1987
X***************
X*** 34,39 ****
X--- 34,40 ----
X
X #define REPLYTYPE(r) ((r) / 100) /* first digit of reply code */
X #define REPLYCLASS(r) (((r) / 10) % 10) /* second digit of repl
y code */
X+ #define SMTPGOODREPLY 250 /* positive SMTP respon
se */
X #define SMTPCLOSING 421 /* "Service Shutting Down" */
X
X char SmtpMsgBuffer[MAXLINE]; /* buffer for commands */
X***************
X*** 241,247 ****
X register int r;
X extern char *remotename();
X
X! smtpmessage("RCPT To:<%s>", m, remotename(to->q_user, m, FALSE, TRUE));
X
X SmtpPhase = "RCPT wait";
X r = reply(m);
X--- 242,257 ----
X register int r;
X extern char *remotename();
X
X! /* DISABLED since I didn't understand why further rewriting
X! should be necessary. Since it doesn't go through ruleset 0
X! on this second rewriting (which it should since it's a
X! envelope recipient address) there is even the risk that it
X! gets screwed up.
X! -- lel@ida.liu.se
X! smtpmessage("RCPT To:<%s>", m, remotename(to->q_user, m, FALSE, TRUE,
X! FALSE));
X! */
X! smtpmessage("RCPT To:<%s>", m, to->q_user);
X
X SmtpPhase = "RCPT wait";
X r = reply(m);
X***************
X*** 291,297 ****
X return (EX_TEMPFAIL);
X else if (r == 554)
X return (EX_UNAVAILABLE);
X! else if (r != 354)
X return (EX_PROTOCOL);
X
X /* now output the actual message */
X--- 301,307 ----
X return (EX_TEMPFAIL);
X else if (r == 554)
X return (EX_UNAVAILABLE);
X! else if (r != 354 && r != 250)
X return (EX_PROTOCOL);
X
X /* now output the actual message */
X***************
X*** 377,382 ****
X--- 387,395 ----
X
X if (tTd(18, 1))
X printf("reply\n");
X+
X+ if (bitnset(M_BSMTP, m->m_flags))
X+ return (SMTPGOODREPLY);
X
X /*
X ** Read the input line, being careful not to hang.
END_OF_ida/patches/usersmtp.c.diff
if test 1852 -ne `wc -c ida/patches/util.c.diff <<'END_OF_ida/patches/util.c.diff'
X*** util.c.orig Fri Mar 13 18:51:10 1987
X--- util.c Mon May 25 15:51:52 1987
X***************
X*** 20,25 ****
X--- 20,27 ----
X # include
X # include "sendmail.h"
X
X+ bool catPrint = FALSE; /* xputs: print strings for catenation
*/
X+
X /*
X ** STRIPQUOTES -- Strip quotes & quote bits from a string.
X **
X***************
X*** 261,266 ****
X--- 263,269 ----
X register char *s;
X {
X register char c;
X+ register struct metamac *m;
X
X if (s == NULL)
X {
X***************
X*** 267,273 ****
X printf("");
X return;
X }
X! (void) putchar('"');
X while ((c = *s++) != '\0')
X {
X if (!isascii(c))
X--- 270,288 ----
X printf("");
X return;
X }
X!
X! if (s[0] == MATCHREPL && isdigit(s[1]) && s[2] == '\0') {
X! printf("$%c", s[1]);
X! return;
X! } else
X! for (m = MetaMacros; m->metaname != '\0'; m++)
X! if (m->metaval == *s) {
X! printf("$%c%s", m->metaname, &s[1]);
X! return;
X! }
X!
X! if (!catPrint)
X! (void) putchar('"');
X while ((c = *s++) != '\0')
X {
X if (!isascii(c))
X***************
X*** 282,288 ****
X }
X (void) putchar(c);
X }
X! (void) putchar('"');
X (void) fflush(stdout);
X }
X /*
X--- 297,304 ----
X }
X (void) putchar(c);
X }
X! if (!catPrint)
X! (void) putchar('"');
X (void) fflush(stdout);
X }
X /*
X***************
X*** 306,316 ****
X register char *p;
X {
X register char c;
X
X if (p == NULL)
X return;
X for (; (c = *p) != '\0'; p++)
X! if (isascii(c) && isupper(c))
X *p = c - 'A' + 'a';
X }
X /*
X--- 322,335 ----
X register char *p;
X {
X register char c;
X+ register bool quoted_string = FALSE;
X
X if (p == NULL)
X return;
X for (; (c = *p) != '\0'; p++)
X! if (c == '"')
X! quoted_string = !quoted_string;
X! else if (!quoted_string && isascii(c) && isupper(c))
X *p = c - 'A' + 'a';
X }
X /*
X***************
X*** 862,865 ****
X--- 881,907 ----
X if (map[i] != 0)
X return (FALSE);
X return (TRUE);
X+ }
X+
X+ /*
X+ ** PRINTCAV -- Print concatenated argument vector
X+ **
X+ ** Parameters:
X+ ** av -- argument vector.
X+ **
X+ ** Returns:
X+ ** none.
X+ **
X+ ** Side Effects:
X+ ** prints av.
X+ */
X+
X+ printcav(av)
X+ register char **av;
X+ {
X+ bool oldCatPrint = catPrint;
X+
X+ catPrint = TRUE;
X+ printav(av);
X+ catPrint = oldCatPrint;
X }
END_OF_ida/patches/util.c.diff
if test 2288 -ne `wc -c