|
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 @