|
|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T a
Length: 25135 (0x622f)
Types: TextFile
Names: »alias.c,v«
└─⟦9ae75bfbd⟧ Bits:30007242 EUUGD3: Starter Kit
└─⟦bfebc70e2⟧ »EurOpenD3/mail/sendmail-5.65b+IDA-1.4.3.tar.Z«
└─⟦f9e35cd84⟧
└─⟦this⟧ »sendmail/src/RCS/alias.c,v«
head 5.21;
branch 5.21.0;
access;
symbols
UICSO:5.21.0
VANILLA:5.21;
locks; strict;
comment @ * @;
5.21
date 90.06.20.08.35.01; author paul; state Exp;
branches
5.21.0.1;
next ;
5.21.0.1
date 90.06.20.09.42.28; author paul; state Exp;
branches;
next 5.21.0.2;
5.21.0.2
date 90.06.25.09.19.29; author paul; state Exp;
branches;
next 5.21.0.3;
5.21.0.3
date 90.08.02.14.37.37; author paul; state Exp;
branches;
next 5.21.0.4;
5.21.0.4
date 90.08.27.17.14.39; author paul; state Exp;
branches;
next 5.21.0.5;
5.21.0.5
date 90.09.17.09.34.01; author paul; state Exp;
branches;
next 5.21.0.6;
5.21.0.6
date 90.10.13.17.39.29; author paul; state Exp;
branches;
next 5.21.0.7;
5.21.0.7
date 90.11.19.16.12.54; author paul; state Exp;
branches;
next 5.21.0.8;
5.21.0.8
date 90.11.24.02.18.57; author paul; state Exp;
branches;
next 5.21.0.9;
5.21.0.9
date 91.01.19.19.26.02; author paul; state Exp;
branches;
next 5.21.0.10;
5.21.0.10
date 91.02.15.20.15.20; author paul; state Exp;
branches;
next 5.21.0.11;
5.21.0.11
date 91.02.17.02.49.44; author paul; state Exp;
branches;
next 5.21.0.12;
5.21.0.12
date 91.03.04.21.48.23; author paul; state Exp;
branches;
next ;
desc
@@
5.21
log
@5.64 Berkeley release
@
text
@/*
* Copyright (c) 1983 Eric P. Allman
* Copyright (c) 1988 Regents of the University of California.
* All rights reserved.
*
* Redistribution and use in source and binary forms are permitted provided
* that: (1) source distributions retain this entire copyright notice and
* comment, and (2) distributions including binaries display the following
* acknowledgement: ``This product includes software developed by the
* University of California, Berkeley and its contributors'' in the
* documentation or other materials provided with the distribution and in
* all advertising materials mentioning features or use of this software.
* Neither the name of the University nor the names of its contributors may
* be used to endorse or promote products derived from this software without
* specific prior written permission.
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
*/
#ifndef lint
#ifdef DBM
static char sccsid[] = "@@(#)alias.c 5.21 (Berkeley) 6/1/90 (with DBM)";
#else
static char sccsid[] = "@@(#)alias.c 5.21 (Berkeley) 6/1/90 (without DBM)";
#endif
#endif /* not lint */
# include <sys/types.h>
# include <sys/stat.h>
# include <signal.h>
# include <errno.h>
# include "sendmail.h"
# include <sys/file.h>
# include <pwd.h>
/*
** ALIAS -- Compute aliases.
**
** Scans the alias file for an alias for the given address.
** If found, it arranges to deliver to the alias list instead.
** Uses libdbm database if -DDBM.
**
** Parameters:
** a -- address to alias.
** sendq -- a pointer to the head of the send queue
** to put the aliases in.
**
** Returns:
** none
**
** Side Effects:
** Aliases found are expanded.
**
** Notes:
** If NoAlias (the "-n" flag) is set, no aliasing is
** done.
**
** Deficiencies:
** It should complain about names that are aliased to
** nothing.
*/
#ifdef DBM
typedef struct
{
char *dptr;
int dsize;
} DATUM;
extern DATUM fetch();
#endif DBM
alias(a, sendq)
register ADDRESS *a;
ADDRESS **sendq;
{
register char *p;
extern char *aliaslookup();
if (tTd(27, 1))
printf("alias(%s)\n", a->q_paddr);
/* don't realias already aliased names */
if (bitset(QDONTSEND, a->q_flags))
return;
CurEnv->e_to = a->q_paddr;
/*
** Look up this name
*/
if (NoAlias)
p = NULL;
else
p = aliaslookup(a->q_user);
if (p == NULL)
return;
/*
** Match on Alias.
** Deliver to the target list.
*/
if (tTd(27, 1))
printf("%s (%s, %s) aliased to %s\n",
a->q_paddr, a->q_host, a->q_user, p);
message(Arpa_Info, "aliased to %s", p);
AliasLevel++;
sendtolist(p, a, sendq);
AliasLevel--;
}
\f
/*
** ALIASLOOKUP -- look up a name in the alias file.
**
** Parameters:
** name -- the name to look up.
**
** Returns:
** the value of name.
** NULL if unknown.
**
** Side Effects:
** none.
**
** Warnings:
** The return value will be trashed across calls.
*/
char *
aliaslookup(name)
char *name;
{
# ifdef DBM
DATUM rhs, lhs;
/* create a key for fetch */
lhs.dptr = name;
lhs.dsize = strlen(name) + 1;
rhs = fetch(lhs);
return (rhs.dptr);
# else DBM
register STAB *s;
s = stab(name, ST_ALIAS, ST_FIND);
if (s == NULL)
return (NULL);
return (s->s_alias);
# endif DBM
}
\f
/*
** INITALIASES -- initialize for aliasing
**
** Very different depending on whether we are running DBM or not.
**
** Parameters:
** aliasfile -- location of aliases.
** init -- if set and if DBM, initialize the DBM files.
**
** Returns:
** none.
**
** Side Effects:
** initializes aliases:
** if DBM: opens the database.
** if ~DBM: reads the aliases into the symbol table.
*/
# define DBMMODE 0644
initaliases(aliasfile, init)
char *aliasfile;
bool init;
{
#ifdef DBM
int atcnt;
time_t modtime;
bool automatic = FALSE;
char buf[MAXNAME];
#endif DBM
struct stat stb;
static bool initialized = FALSE;
if (initialized)
return;
initialized = TRUE;
if (aliasfile == NULL || stat(aliasfile, &stb) < 0)
{
if (aliasfile != NULL && init)
syserr("Cannot open %s", aliasfile);
NoAlias = TRUE;
errno = 0;
return;
}
# ifdef DBM
/*
** Check to see that the alias file is complete.
** If not, we will assume that someone died, and it is up
** to us to rebuild it.
*/
if (!init)
dbminit(aliasfile);
atcnt = SafeAlias * 2;
if (atcnt > 0)
{
while (!init && atcnt-- >= 0 && aliaslookup("@@") == NULL)
{
/*
** Reinitialize alias file in case the new
** one is mv'ed in instead of cp'ed in.
**
** Only works with new DBM -- old one will
** just consume file descriptors forever.
** If you have a dbmclose() it can be
** added before the sleep(30).
*/
sleep(30);
# ifdef NDBM
dbminit(aliasfile);
# endif NDBM
}
}
else
atcnt = 1;
/*
** See if the DBM version of the file is out of date with
** the text version. If so, go into 'init' mode automatically.
** This only happens if our effective userid owns the DBM.
** Note the unpalatable hack to see if the stat succeeded.
*/
modtime = stb.st_mtime;
(void) strcpy(buf, aliasfile);
(void) strcat(buf, ".pag");
stb.st_ino = 0;
if (!init && (stat(buf, &stb) < 0 || stb.st_mtime < modtime || atcnt < 0))
{
errno = 0;
if (AutoRebuild && stb.st_ino != 0 && stb.st_uid == geteuid())
{
init = TRUE;
automatic = TRUE;
message(Arpa_Info, "rebuilding alias database");
#ifdef LOG
if (LogLevel >= 7)
syslog(LOG_INFO, "rebuilding alias database");
#endif LOG
}
else
{
#ifdef LOG
if (LogLevel >= 7)
syslog(LOG_INFO, "alias database out of date");
#endif LOG
message(Arpa_Info, "Warning: alias database out of date");
}
}
/*
** If necessary, load the DBM file.
** If running without DBM, load the symbol table.
*/
if (init)
{
#ifdef LOG
if (LogLevel >= 6)
{
extern char *username();
syslog(LOG_NOTICE, "alias database %srebuilt by %s",
automatic ? "auto" : "", username());
}
#endif LOG
readaliases(aliasfile, TRUE);
}
# else DBM
readaliases(aliasfile, init);
# endif DBM
}
\f
/*
** READALIASES -- read and process the alias file.
**
** This routine implements the part of initaliases that occurs
** when we are not going to use the DBM stuff.
**
** Parameters:
** aliasfile -- the pathname of the alias file master.
** init -- if set, initialize the DBM stuff.
**
** Returns:
** none.
**
** Side Effects:
** Reads aliasfile into the symbol table.
** Optionally, builds the .dir & .pag files.
*/
static
readaliases(aliasfile, init)
char *aliasfile;
bool init;
{
register char *p;
char *rhs;
bool skipping;
int naliases, bytes, longest;
FILE *af;
void (*oldsigint)();
ADDRESS al, bl;
register STAB *s;
char line[BUFSIZ];
if ((af = fopen(aliasfile, "r")) == NULL)
{
if (tTd(27, 1))
printf("Can't open %s\n", aliasfile);
errno = 0;
NoAlias++;
return;
}
# ifdef DBM
/* see if someone else is rebuilding the alias file already */
if (flock(fileno(af), LOCK_EX | LOCK_NB) < 0 && errno == EWOULDBLOCK)
{
/* yes, they are -- wait until done and then return */
message(Arpa_Info, "Alias file is already being rebuilt");
if (OpMode != MD_INITALIAS)
{
/* wait for other rebuild to complete */
(void) flock(fileno(af), LOCK_EX);
}
(void) fclose(af);
errno = 0;
return;
}
# endif DBM
/*
** If initializing, create the new DBM files.
*/
if (init)
{
oldsigint = signal(SIGINT, SIG_IGN);
(void) strcpy(line, aliasfile);
(void) strcat(line, ".dir");
if (close(creat(line, DBMMODE)) < 0)
{
syserr("cannot make %s", line);
(void) signal(SIGINT, oldsigint);
return;
}
(void) strcpy(line, aliasfile);
(void) strcat(line, ".pag");
if (close(creat(line, DBMMODE)) < 0)
{
syserr("cannot make %s", line);
(void) signal(SIGINT, oldsigint);
return;
}
dbminit(aliasfile);
}
/*
** Read and interpret lines
*/
FileName = aliasfile;
LineNumber = 0;
naliases = bytes = longest = 0;
skipping = FALSE;
while (fgets(line, sizeof (line), af) != NULL)
{
int lhssize, rhssize;
LineNumber++;
p = index(line, '\n');
if (p != NULL)
*p = '\0';
switch (line[0])
{
case '#':
case '\0':
skipping = FALSE;
continue;
case ' ':
case '\t':
if (!skipping)
syserr("Non-continuation line starts with space");
skipping = TRUE;
continue;
}
skipping = FALSE;
/*
** Process the LHS
** Find the final colon, and parse the address.
** It should resolve to a local name -- this will
** be checked later (we want to optionally do
** parsing of the RHS first to maximize error
** detection).
*/
for (p = line; *p != '\0' && *p != ':' && *p != '\n'; p++)
continue;
if (*p++ != ':')
{
syserr("missing colon");
continue;
}
if (parseaddr(line, &al, 1, ':') == NULL)
{
syserr("illegal alias name");
continue;
}
loweraddr(&al);
/*
** Process the RHS.
** 'al' is the internal form of the LHS address.
** 'p' points to the text of the RHS.
*/
rhs = p;
for (;;)
{
register char c;
if (init && CheckAliases)
{
/* do parsing & compression of addresses */
while (*p != '\0')
{
extern char *DelimChar;
while (isspace(*p) || *p == ',')
p++;
if (*p == '\0')
break;
if (parseaddr(p, &bl, -1, ',') == NULL)
usrerr("%s... bad address", p);
p = DelimChar;
}
}
else
{
p = &p[strlen(p)];
if (p[-1] == '\n')
*--p = '\0';
}
/* see if there should be a continuation line */
c = fgetc(af);
if (!feof(af))
(void) ungetc(c, af);
if (c != ' ' && c != '\t')
break;
/* read continuation line */
if (fgets(p, sizeof line - (p - line), af) == NULL)
break;
LineNumber++;
}
if (al.q_mailer != LocalMailer)
{
syserr("cannot alias non-local names");
continue;
}
/*
** Insert alias into symbol table or DBM file
*/
lhssize = strlen(al.q_user) + 1;
rhssize = strlen(rhs) + 1;
# ifdef DBM
if (init)
{
DATUM key, content;
key.dsize = lhssize;
key.dptr = al.q_user;
content.dsize = rhssize;
content.dptr = rhs;
store(key, content);
}
else
# endif DBM
{
s = stab(al.q_user, ST_ALIAS, ST_ENTER);
s->s_alias = newstr(rhs);
}
/* statistics */
naliases++;
bytes += lhssize + rhssize;
if (rhssize > longest)
longest = rhssize;
}
# ifdef DBM
if (init)
{
/* add the distinquished alias "@@" */
DATUM key;
key.dsize = 2;
key.dptr = "@@";
store(key, key);
/* restore the old signal */
(void) signal(SIGINT, oldsigint);
}
# endif DBM
/* closing the alias file drops the lock */
(void) fclose(af);
CurEnv->e_to = NULL;
FileName = NULL;
message(Arpa_Info, "%d aliases, longest %d bytes, %d bytes total",
naliases, longest, bytes);
# ifdef LOG
if (LogLevel >= 8)
syslog(LOG_INFO, "%d aliases, longest %d bytes, %d bytes total",
naliases, longest, bytes);
# endif LOG
}
\f
/*
** FORWARD -- Try to forward mail
**
** This is similar but not identical to aliasing.
**
** Parameters:
** user -- the name of the user who's mail we would like
** to forward to. It must have been verified --
** i.e., the q_home field must have been filled
** in.
** sendq -- a pointer to the head of the send queue to
** put this user's aliases in.
**
** Returns:
** none.
**
** Side Effects:
** New names are added to send queues.
*/
forward(user, sendq)
ADDRESS *user;
ADDRESS **sendq;
{
char buf[60];
extern bool safefile();
if (tTd(27, 1))
printf("forward(%s)\n", user->q_paddr);
if (user->q_mailer != LocalMailer || bitset(QBADADDR, user->q_flags))
return;
if (user->q_home == NULL)
syserr("forward: no home");
/* good address -- look for .forward file in home */
define('z', user->q_home, CurEnv);
expand("\001z/.forward", buf, &buf[sizeof buf - 1], CurEnv);
if (!safefile(buf, user->q_uid, S_IREAD))
return;
/* we do have an address to forward to -- do it */
include(buf, "forwarding", user, sendq);
}
@
5.21.0.1
log
@IDA patches
@
text
@d65 6
a70 1
#if defined(DBM) && !defined(NDBM) && !defined(SDBM)
d72 1
a72 1
#endif /* DBM && !NDBM && !SDBM */
d82 1
a82 1
printf("alias(%s)\n", a->q_user);
d128 1
a128 2
** The return value will be trashed across calls
** unless NDBM or SDBM is defined and we're using mapkey().
a135 12
# if defined(NDBM) || defined(SDBM)
char *newname;
if (tTd(27, 3))
printf("aliaslookup(\"%s\") => ", name);
newname = (char *) mapkey(DB_ALIAS, name, 0, 0);
if (tTd(27, 3))
printf("%s\n", newname == NULL ? "NOT_FOUND" : newname);
return newname;
# else /* !NDBM && !SDBM */
a136 1
char *lowname = xalloc(strlen(name) + 1); /* potential space hog */
d139 1
a139 3
(void) strcpy(lowname, name);
(void) makelower(lowname);
lhs.dptr = lowname;
a140 2
if (tTd(27, 3))
printf("aliaslookup(\"%s\") => ", lhs.dptr);
a141 3
if (tTd(27, 3))
printf("%s\n", rhs.dptr == NULL ? "NOT_FOUND" : rhs.dptr);
(void) free(lowname);
d143 1
a143 2
# endif /* NDBM || SDBM */
# else /* !DBM */
a146 2
if (tTd(27, 3))
printf("%s\n", s == NULL ? "NOT_FOUND" : s->s_alias);
d150 1
a150 1
# endif /* DBM */
d158 1
d172 2
a173 1
initaliases(init)
d181 1
a181 1
#endif /* DBM */
d189 1
a189 8
if (AliasFile == NULL ||
#ifdef YPMARK
(AliasFile[0] != YPMARK &&
#endif /* YPMARK */
stat(AliasFile, &stb) < 0)
#ifdef YPMARK
)
#endif /* YPMARK */
d191 2
a192 2
if (AliasFile != NULL && init)
syserr("Cannot open %s", AliasFile);
a204 1
#if !defined(NDBM) && !defined(SDBM)
d206 1
a206 2
dbminit(AliasFile);
#endif /* !NDBM && !SDBM */
d209 1
d211 11
d223 5
d239 2
a240 2
(void) strcpy(buf, AliasFile);
(void) strcat(buf, DB_PAGEXT);
d242 1
a242 5
if (!init &&
#ifdef YPMARK
AliasFile[0] != YPMARK &&
#endif /* YPMARK */
(stat(buf, &stb) < 0 || stb.st_mtime < modtime || atcnt < 0))
d253 1
a253 1
#endif /* LOG */
d260 1
a260 1
#endif /* LOG */
d281 2
a282 2
#endif /* LOG */
readaliases(TRUE);
d284 3
a286 3
# else /* !DBM */
readaliases(init);
# endif /* DBM */
d295 1
d302 1
a302 1
** Reads AliasFile into the symbol table.
d307 2
a308 1
readaliases(init)
d316 1
a316 1
SIG_TYPE (*oldsigint)();
d321 1
a321 11
# ifdef YPMARK
if (AliasFile[0] == YPMARK) {
if (tTd(27, 1))
printf("Can't reinit YP databases: \"%s\"\n", AliasFile);
/* reuse old aliases */
errno = 0;
return;
}
# endif /* YPMARK */
if ((af = fopen(AliasFile, "r")) == NULL)
d324 1
a324 1
printf("Can't open %s\n", AliasFile);
d345 1
a345 1
# endif /* DBM */
d354 2
a355 2
(void) strcpy(line, AliasFile);
(void) strcat(line, DB_PAGEXT);
d362 2
a363 2
(void) strcpy(line, AliasFile);
(void) strcat(line, DB_DIREXT);
d370 1
a370 5
# if defined(NDBM) || defined(SDBM)
mapinit(DB_ALIAS);
# else /* !NDBM && !SDBM */
dbminit(AliasFile);
# endif /* NDBM || SDBM */
d377 1
a377 1
FileName = AliasFile;
a476 6
if (tTd(27, 3)) {
printf("Mailer al.q_mailer:\n");
print_mailer(al.q_mailer);
printf("\nMailer LocalMailer:\n");
print_mailer(LocalMailer);
}
a495 3
# if defined(NDBM) || defined(SDBM)
(void) dbm_store(AliasDbm, key, content, DBM_REPLACE);
# else /* !NDBM && !SDBM */
a496 1
# endif /* NDBM || SDBM */
d499 1
a499 1
# endif /* DBM */
d515 1
a516 3
# ifdef YP
DATUM content;
char Now[65];
a517 24
/* add the YP stamps. N.B., don't pad the lengths by 1! */
gethostname (Now, 64);
key.dsize = strlen ("YP_MASTER_NAME");
key.dptr = "YP_MASTER_NAME";
content.dsize = strlen (Now);
content.dptr = Now;
# if defined(NDBM) || defined(SDBM)
(void) dbm_store(AliasDbm, key, content, DBM_INSERT);
# else /* !NDBM && !SDBM */
store(key, content);
# endif /* NDBM || SDBM */
(void) sprintf (Now, "%010u", time(0));
key.dsize = strlen ("YP_LAST_MODIFIED");
key.dptr = "YP_LAST_MODIFIED";
content.dsize = strlen (Now);
content.dptr = Now;
# if defined(NDBM) || defined(SDBM)
(void) dbm_store(AliasDbm, key, content, DBM_INSERT);
# else /* !NDBM && !SDBM */
store(key, Now);
# endif /* NDBM || SDBM */
# endif /* YP */
/* add the distinquished alias "@@" */
a519 3
# if defined(NDBM) || defined(SDBM)
(void) dbm_store(AliasDbm, key, key, DBM_INSERT);
# else /* !NDBM && !SDBM */
a520 1
# endif /* NDBM || SDBM */
d525 1
a525 1
# endif /* DBM */
d537 1
a537 1
# endif /* LOG */
a581 52
}
\f
/*
** PRINT_MAILER -- Print contents of struct mailer
**
** This is for debugging
**
** Parameters:
** Mpnt -- pointer to struct mailer
**
** Returns:
** none.
**
** Side Effects:
** none.
*/
print_mailer(Mpnt)
MAILER *Mpnt;
{
register int i;
register char **j;
if (Mpnt == (MAILER *) NULL) {
printf("Null MAILER pointer\n");
return;
}
printf("m_name (symbolic name) %s\n",
(Mpnt->m_name == (char *)NULL) ? "NULL" : Mpnt->m_name);
printf("m_mailer (pathname) %s\n",
(Mpnt->m_mailer == (char *)NULL) ? "NULL" : Mpnt->m_mailer);
printf("m_flags BITMAP: ");
for (i = 0; i < (BITMAPBYTES / sizeof (int)); i++)
printf(" %X", Mpnt->m_flags[i]);
printf("\n");
printf("m_mno (internal mailer number) %d\n", (int) Mpnt->m_mno);
printf("m_argv (template argument vector): ");
for (j = Mpnt->m_argv; *j != (char *) NULL; j++)
printf(" \"%s\"", *j);
printf("\n");
printf("m_se_rwset (rewriting ruleset for envelope senders): %d\n",
(int) Mpnt->m_se_rwset);
printf("m_sh_rwset (rewriting ruleset for header senders): %d\n",
(int) Mpnt->m_sh_rwset);
printf("m_re_rwset (rewriting ruleset for envelope recipients): %d\n",
(int) Mpnt->m_re_rwset);
printf("m_rh_rwset (rewriting ruleset for header recipient): %d\n",
(int) Mpnt->m_rh_rwset);
printf("m_eol (end of line string) %s\n",
(Mpnt->m_eol == (char *)NULL) ? "NULL" : Mpnt->m_eol);
printf("m_maxsize (size limit on message to this mailer): %D\n",
Mpnt->m_maxsize);
return;
@
5.21.0.2
log
@Patches for HP-UX from Andy Linton <root@@comp.vuw.ac.nz>. Thanks Andy!
@
text
@a340 7
#if defined(hpux)
/*
* We can't get an exclusive lock on a file that
* isn't opened for writing - sigh!
*/
if ((af = fopen(AliasFile, "r+")) == NULL)
#else
a342 1
#endif /* hpux */
@
5.21.0.3
log
@Reported maximum alias size now includes the size of the lhs+rhs and the
name of the longest alias. Check success of dbm_store/store call.
@
text
@a330 1
char longest_lhs[BUFSIZ];
a534 1
if (
d536 1
a536 1
dbm_store(AliasDbm, key, content, DBM_REPLACE)
d538 1
a538 1
store(key, content)
a539 2
< 0)
syserr("DBM store of %s (size %d) failed", al.q_user, (lhssize+rhssize));
d551 2
a552 4
if ((rhssize + lhssize) > longest) {
longest = rhssize + lhssize;
(void) strcpy(longest_lhs, al.q_user);
}
d604 2
a605 2
message(Arpa_Info, "%d aliases, longest (%s) %d bytes, %d bytes total",
naliases, longest_lhs, longest, bytes);
d608 2
a609 2
syslog(LOG_INFO, "%d aliases, longest (%s) %d bytes, %d bytes total",
naliases, longest_lhs, longest, bytes);
@
5.21.0.4
log
@Use MAXHOSTNAMELEN from sys/param.h instead of a hardwired 64. Provide
a default value for older systems.
@
text
@a35 6
#ifdef YP
# include <sys/param.h>
# ifndef MAXHOSTNAMELEN
# define MAXHOSTNAMELEN 64
# endif /* !MAXHOSTNAMELEN */
#endif /* YP */
d567 1
a567 1
char Now[MAXHOSTNAMELEN+1];
d570 1
a570 1
gethostname (Now, MAXHOSTNAMELEN);
@
5.21.0.5
log
@Corrected use of mapkey() return value, changed a printf() format from %D
to %ld.
@
text
@a139 1
char *mapkey();
d143 1
a143 1
newname = mapkey(DB_ALIAS, name, 0, (char *)0);
d407 1
a407 1
(void) mapinit(DB_ALIAS);
d716 1
a716 1
printf("m_maxsize (size limit on message to this mailer): %ld\n",
@
5.21.0.6
log
@Re-did #statement indentation. All files to be exclusively flock()'ed are
now opened with type "r+" rather than "r". Many platforms implement flock()
with lockf(). The latter requires that files be opened for writing to
obtain an exclusive lock. Added GDBM support.
@
text
@d21 7
a27 9
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#include <errno.h>
#include "sendmail.h"
#include <sys/file.h>
#ifndef LOCK_EX
# include "flock.h"
#endif /* !LOCK_EX */
d29 7
a35 1
#include <pwd.h>
a42 8
#ifndef lint
# ifdef DBM
static char sccsid[] = "@@(#)alias.c 5.21 (Berkeley) 6/1/90 (with DBM)";
# else /* !DBM */
static char sccsid[] = "@@(#)alias.c 5.21 (Berkeley) 6/1/90 (without DBM)";
# endif /* DBM */
#endif /* not lint */
d71 3
a73 3
#if defined(DBM) && !defined(NDBM) && !defined(OTHERDBM)
extern XDATUM fetch();
#endif /* DBM && !NDBM && !OTHERDBM */
d130 1
a130 1
** unless NDBM or OTHERDBM is defined and we're using mapkey().
d137 2
a138 2
#ifdef DBM
# if defined(NDBM) || defined(OTHERDBM)
d140 1
a140 1
extern char *mapkey();
d144 1
a144 1
newname = mapkey(DB_ALIAS, name, 0, (char *)NULL);
d149 1
a149 1
# else /* !NDBM && !OTHERDBM */
d151 2
a152 2
XDATUM rhs, lhs;
char *lowname = newstr(name);
d155 1
d164 1
a164 1
free(lowname);
d166 2
a167 2
# endif /* NDBM || OTHERDBM */
#else /* !DBM */
d176 1
a176 1
#endif /* DBM */
d195 1
a195 1
#define DBMMODE 0644
d229 1
a229 1
#ifdef DBM
d236 1
a236 1
# if !defined(NDBM) && !defined(SDBM)
d239 1
a239 1
# endif /* !NDBM && !SDBM */
d259 1
a259 1
# ifdef YPMARK
d261 1
a261 1
# endif /* YPMARK */
d270 1
a270 1
# ifdef LOG
d273 1
a273 1
# endif /* LOG */
d277 1
a277 1
# ifdef LOG
d280 1
a280 1
# endif /* LOG */
d285 1
d293 1
a293 1
# ifdef LOG
d301 1
a301 1
# endif /* LOG */
d304 1
a304 1
#else /* !DBM */
d306 1
a306 1
#endif /* DBM */
d340 1
a340 1
#ifdef YPMARK
d348 11
a358 6
#endif /* YPMARK */
/*
* We can't get an exclusive lock on a file that isn't opened for
* writing on most systems - sigh!
*/
if ((af = fopen(AliasFile, "r+")) == NULL)
d367 1
a367 1
#ifdef DBM
d369 1
a369 2
if (flock(fileno(af), LOCK_EX | LOCK_NB) < 0 &&
(errno == EWOULDBLOCK || errno == EAGAIN))
d382 1
a382 1
#endif /* DBM */
d407 1
a407 1
#if defined(NDBM) || defined(OTHERDBM)
d409 1
a409 1
#else /* !NDBM && !OTHERDBM */
d411 1
a411 1
#endif /* NDBM || OTHERDBM */
d448 1
a448 1
** Find the first colon, and parse the address.
d534 1
a534 1
#ifdef DBM
d537 1
a537 1
XDATUM key, content;
d544 1
a544 1
# if defined(NDBM) || defined(OTHERDBM)
d546 1
a546 1
# else /* !NDBM && !OTHERDBM */
d548 1
a548 1
# endif /* NDBM || OTHERDBM */
d553 1
a553 1
#endif /* DBM */
d568 1
a568 1
#ifdef DBM
d571 1
a571 1
XDATUM key;
d573 1
a573 1
XDATUM content;
d582 1
a582 1
# if defined(NDBM) || defined(OTHERDBM)
d584 1
a584 1
# else /* !NDBM && !OTHERDBM */
d586 1
a586 1
# endif /* NDBM || OTHERDBM */
d592 1
a592 1
# if defined(NDBM) || defined(OTHERDBM)
d594 1
a594 1
# else /* !NDBM && !OTHERDBM */
d596 1
a596 1
# endif /* NDBM || OTHERDBM */
d602 1
a602 1
# if defined(NDBM) || defined(OTHERDBM)
d604 1
a604 1
# else /* !NDBM && !OTHERDBM */
d606 1
a606 1
# endif /* NDBM || OTHERDBM */
d611 1
a611 1
#endif /* DBM */
d619 1
a619 1
#ifdef LOG
d623 1
a623 1
#endif /* LOG */
@
5.21.0.7
log
@Moved test and include of flock.h to sendmail.h.
@
text
@d26 5
@
5.21.0.8
log
@Added forward declaration of readaliases() for gcc.
@
text
@a193 1
void readaliases();
d322 1
a322 1
static void
@
5.21.0.9
log
@Deleted #include <sys/types.h> as it's already included via sendmail.h from
useful.h. #include "sendmail.h" relocated to top of #include list.
@
text
@d21 1
a21 1
#include "sendmail.h"
d25 1
@
5.21.0.10
log
@Bulletproofing for POSIX.
@
text
@a31 3
#ifndef S_IREAD
# define S_IREAD _S_IREAD
#endif /* !S_IREAD */
@
5.21.0.11
log
@declared print_mailer() static.
@
text
@a679 1
static
@
5.21.0.12
log
@ANSIfied.
@
text
@a43 8
#ifdef __STDC__
static void print_mailer(MAILER *);
static void readaliases(int);
#else /* !__STDC__ */
static void print_mailer();
static void readaliases();
#endif /* __STDC__ */
a75 1
void
d81 1
d141 1
d196 1
a197 1
void
d244 1
a244 1
Xsleep(30);
d295 3
d300 1
a640 1
void
d646 1
d680 1
a680 1
static void
@