2
0
mirror of https://github.com/vdukhovni/postfix synced 2025-09-01 06:35:27 +00:00

postfix-1.1.11-20021104

This commit is contained in:
Wietse Venema
2002-11-04 00:00:00 -05:00
committed by Viktor Dukhovni
parent 341ed7c688
commit b095771a1b
8 changed files with 83 additions and 20 deletions

2
postfix/.indent.pro vendored
View File

@@ -93,6 +93,8 @@
-TMIME_STATE -TMIME_STATE
-TMIME_TOKEN -TMIME_TOKEN
-TMKMAP -TMKMAP
-TMKMAP_DB
-TMKMAP_DBM
-TMKMAP_OPEN_INFO -TMKMAP_OPEN_INFO
-TMULTI_SERVER -TMULTI_SERVER
-TMVECT -TMVECT

View File

@@ -7145,6 +7145,10 @@ Apologies for any names omitted.
records for finished recipients. Files: *qmgr/qmgr_message.c, records for finished recipients. Files: *qmgr/qmgr_message.c,
cleanup/cleanup_envelope.c, cleanup/cleanup_extracted.c. cleanup/cleanup_envelope.c, cleanup/cleanup_extracted.c.
Cleanup: further simplified the mkmap wrapper (used by
postmap and postalias only) to remove some hurdles for
Michael Tokarev's CDB support. Files: global/mkmap*.[hc].
Open problems: Open problems:
Low: revise other local delivery agent duplicate filters. Low: revise other local delivery agent duplicate filters.

View File

@@ -135,7 +135,7 @@ virtual_mailbox_lock
requires that the recipient UID or GID has write access to the requires that the recipient UID or GID has write access to the
parent directory of the mailbox file. parent directory of the mailbox file.
Use the "postconf -m" command to find out what locking methods Use the "postconf -l" command to find out what locking methods
Postfix supports on your system. Postfix supports on your system.
virtual_mailbox_limit virtual_mailbox_limit

View File

@@ -20,7 +20,7 @@
* Patches change the patchlevel and the release date. Snapshots change the * Patches change the patchlevel and the release date. Snapshots change the
* release date only, unless they include the same bugfix as a patch release. * release date only, unless they include the same bugfix as a patch release.
*/ */
#define MAIL_RELEASE_DATE "20021101" #define MAIL_RELEASE_DATE "20021104"
#define VAR_MAIL_VERSION "mail_version" #define VAR_MAIL_VERSION "mail_version"
#define DEF_MAIL_VERSION "1.1.11-" MAIL_RELEASE_DATE #define DEF_MAIL_VERSION "1.1.11-" MAIL_RELEASE_DATE

View File

@@ -25,15 +25,16 @@
typedef struct MKMAP { typedef struct MKMAP {
struct DICT *(*open) (const char *, int, int); /* dict_xx_open() */ struct DICT *(*open) (const char *, int, int); /* dict_xx_open() */
struct DICT *dict; /* dict_xx_open() result */ struct DICT *dict; /* dict_xx_open() result */
char *lock_file; /* lock file name */
int lock_fd; /* locked open file, or -1 */
void (*after_open) (struct MKMAP *); /* may be null */ void (*after_open) (struct MKMAP *); /* may be null */
void (*after_close) (struct MKMAP *); /* may be null */
} MKMAP; } MKMAP;
extern MKMAP *mkmap_open(const char *, const char *, int, int); extern MKMAP *mkmap_open(const char *, const char *, int, int);
extern void mkmap_append(MKMAP *, const char *, const char *); extern void mkmap_append(MKMAP *, const char *, const char *);
extern void mkmap_close(MKMAP *); extern void mkmap_close(MKMAP *);
#define mkmap_append(map, key, val) dict_put((map)->dict, (key), (val))
extern MKMAP *mkmap_dbm_open(const char *); extern MKMAP *mkmap_dbm_open(const char *);
extern MKMAP *mkmap_hash_open(const char *); extern MKMAP *mkmap_hash_open(const char *);
extern MKMAP *mkmap_btree_open(const char *); extern MKMAP *mkmap_btree_open(const char *);

View File

@@ -63,10 +63,29 @@
#include <db.h> #include <db.h>
#endif #endif
typedef struct MKMAP_DB {
MKMAP mkmap; /* parent class */
char *lock_file; /* path name */
int lock_fd; /* -1 or open locked file */
} MKMAP_DB;
/* mkmap_db_after_close - clean up after closing database */
static void mkmap_db_after_close(MKMAP *mp)
{
MKMAP_DB *mkmap = (MKMAP_DB *) mp;
if (mkmap->lock_fd >= 0 && close(mkmap->lock_fd) < 0)
msg_warn("close %s: %m", mkmap->lock_file);
myfree(mkmap->lock_file);
}
/* mkmap_db_after_open - lock newly created database */ /* mkmap_db_after_open - lock newly created database */
static void mkmap_db_after_open(MKMAP *mkmap) static void mkmap_db_after_open(MKMAP *mp)
{ {
MKMAP_DB *mkmap = (MKMAP_DB *) mp;
if (mkmap->lock_fd < 0) { if (mkmap->lock_fd < 0) {
if ((mkmap->lock_fd = open(mkmap->lock_file, O_RDWR, 0644)) < 0) if ((mkmap->lock_fd = open(mkmap->lock_file, O_RDWR, 0644)) < 0)
msg_fatal("open lockfile %s: %m", mkmap->lock_file); msg_fatal("open lockfile %s: %m", mkmap->lock_file);
@@ -80,7 +99,7 @@ static void mkmap_db_after_open(MKMAP *mkmap)
static MKMAP *mkmap_db_before_open(const char *path, static MKMAP *mkmap_db_before_open(const char *path,
DICT *(*db_open) (const char *, int, int)) DICT *(*db_open) (const char *, int, int))
{ {
MKMAP *mkmap = (MKMAP *) mymalloc(sizeof(*mkmap)); MKMAP_DB *mkmap = (MKMAP_DB *) mymalloc(sizeof(*mkmap));
struct stat st; struct stat st;
/* /*
@@ -107,8 +126,9 @@ static MKMAP *mkmap_db_before_open(const char *path,
* Fill in the generic members. * Fill in the generic members.
*/ */
mkmap->lock_file = concatenate(path, ".db", (char *) 0); mkmap->lock_file = concatenate(path, ".db", (char *) 0);
mkmap->open = db_open; mkmap->mkmap.open = db_open;
mkmap->after_open = mkmap_db_after_open; mkmap->mkmap.after_open = mkmap_db_after_open;
mkmap->mkmap.after_close = mkmap_db_after_close;
/* /*
* Unfortunately, not all systems that might support db databases do * Unfortunately, not all systems that might support db databases do
@@ -150,7 +170,7 @@ static MKMAP *mkmap_db_before_open(const char *path,
} }
} }
return (mkmap); return (&mkmap->mkmap);
} }
/* mkmap_hash_open - create or open hashed DB file */ /* mkmap_hash_open - create or open hashed DB file */

View File

@@ -55,11 +55,28 @@
#include <ndbm.h> #include <ndbm.h>
#endif #endif
typedef struct MKMAP_DBM {
MKMAP mkmap; /* parent class */
char *lock_file; /* path name */
int lock_fd; /* -1 or open locked file */
} MKMAP_DBM;
/* mkmap_dbm_after_close - clean up after closing database */
static void mkmap_dbm_after_close(MKMAP *mp)
{
MKMAP_DBM *mkmap = (MKMAP_DBM *) mp;
if (mkmap->lock_fd >= 0 && close(mkmap->lock_fd) < 0)
msg_warn("close %s: %m", mkmap->lock_file);
myfree(mkmap->lock_file);
}
/* mkmap_dbm_open - create or open database */ /* mkmap_dbm_open - create or open database */
MKMAP *mkmap_dbm_open(const char *path) MKMAP *mkmap_dbm_open(const char *path)
{ {
MKMAP *mkmap = (MKMAP *) mymalloc(sizeof(*mkmap)); MKMAP_DBM *mkmap = (MKMAP_DBM *) mymalloc(sizeof(*mkmap));
char *pag_file; char *pag_file;
int pag_fd; int pag_fd;
@@ -67,8 +84,9 @@ MKMAP *mkmap_dbm_open(const char *path)
* Fill in the generic members. * Fill in the generic members.
*/ */
mkmap->lock_file = concatenate(path, ".dir", (char *) 0); mkmap->lock_file = concatenate(path, ".dir", (char *) 0);
mkmap->open = dict_dbm_open; mkmap->mkmap.open = dict_dbm_open;
mkmap->after_open = 0; mkmap->mkmap.after_open = 0;
mkmap->mkmap.after_close = mkmap_dbm_after_close;
/* /*
* Unfortunately, not all systems support locking on open(), so we open * Unfortunately, not all systems support locking on open(), so we open
@@ -90,9 +108,9 @@ MKMAP *mkmap_dbm_open(const char *path)
* have any spectators. * have any spectators.
*/ */
if (myflock(mkmap->lock_fd, INTERNAL_LOCK, MYFLOCK_OP_EXCLUSIVE) < 0) if (myflock(mkmap->lock_fd, INTERNAL_LOCK, MYFLOCK_OP_EXCLUSIVE) < 0)
msg_fatal("lock %s: %m", mkmap->lock_file); msg_fatal("lock %s: %m", mkmap->lock_file);
return (mkmap); return (&mkmap->mkmap);
} }
#endif #endif

View File

@@ -22,6 +22,8 @@
/* MKMAP *mkmap; /* MKMAP *mkmap;
/* DESCRIPTION /* DESCRIPTION
/* This module implements support for creating Postfix databases. /* This module implements support for creating Postfix databases.
/* It is a dict(3) wrapper that adds global locking to dict-level
/* routines where appropriate.
/* /*
/* mkmap_open() creates or truncates the named database, after /* mkmap_open() creates or truncates the named database, after
/* appending the appropriate suffixes to the specified filename. /* appending the appropriate suffixes to the specified filename.
@@ -91,6 +93,8 @@ MKMAP_OPEN_INFO mkmap_types[] = {
/* mkmap_append - append entry to map */ /* mkmap_append - append entry to map */
#undef mkmap_append
void mkmap_append(MKMAP *mkmap, const char *key, const char *value) void mkmap_append(MKMAP *mkmap, const char *key, const char *value)
{ {
dict_put(mkmap->dict, key, value); dict_put(mkmap->dict, key, value);
@@ -102,11 +106,19 @@ void mkmap_close(MKMAP *mkmap)
{ {
/* /*
* Close the database and the locking file descriptor. * Close the database.
*/ */
dict_close(mkmap->dict); dict_close(mkmap->dict);
if (close(mkmap->lock_fd) < 0)
msg_warn("close %s: %m", mkmap->lock_file); /*
* Do whatever special processing is needed after closing the database,
* such as releasing a global exclusive lock on the database file.
* Individual Postfix dict modules implement locking only for individual
* record operations, because most Postfix applications don't need global
* exclusive locks.
*/
if (mkmap->after_close)
mkmap->after_close(mkmap);
/* /*
* Resume signal delivery. * Resume signal delivery.
@@ -116,7 +128,6 @@ void mkmap_close(MKMAP *mkmap)
/* /*
* Cleanup. * Cleanup.
*/ */
myfree(mkmap->lock_file);
myfree((char *) mkmap); myfree((char *) mkmap);
} }
@@ -141,7 +152,10 @@ MKMAP *mkmap_open(const char *type, const char *path,
msg_info("open %s %s", type, path); msg_info("open %s %s", type, path);
/* /*
* Do whatever before-open initialization is needed. * Do whatever before-open initialization is needed, such as acquiring a
* global exclusive lock on an existing database file. Individual Postfix
* dict modules implement locking only for individual record operations,
* because most Postfix applications don't need global exclusive locks.
*/ */
mkmap = mp->before_open(path); mkmap = mp->before_open(path);
@@ -161,7 +175,11 @@ MKMAP *mkmap_open(const char *type, const char *path,
mkmap->dict->flags |= DICT_FLAG_DUP_WARN; mkmap->dict->flags |= DICT_FLAG_DUP_WARN;
/* /*
* Do whatever post-open initialization is needed. * Do whatever post-open initialization is needed, such as acquiring a
* global exclusive lock on a database file that did not exist.
* Individual Postfix dict modules implement locking only for individual
* record operations, because most Postfix applications don't need global
* exclusive locks.
*/ */
if (mkmap->after_open) if (mkmap->after_open)
mkmap->after_open(mkmap); mkmap->after_open(mkmap);