X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/966e829c812abf574896810d3313247348a6532c..b10c87b38c2345d15d30da5c18c823355ac506a9:/src/src/dbfn.c diff --git a/src/src/dbfn.c b/src/src/dbfn.c index ec87eaeeb..a60775681 100644 --- a/src/src/dbfn.c +++ b/src/src/dbfn.c @@ -72,6 +72,7 @@ Arguments: dbblock Points to an open_db block to be filled in. lof If TRUE, write to the log for actual open failures (locking failures are always logged). + panic If TRUE, panic on failure to create the db directory Returns: NULL if the open failed, or the locking failed. After locking failures, errno is zero. @@ -85,7 +86,7 @@ moment I haven't changed them. */ open_db * -dbfn_open(uschar *name, int flags, open_db *dbblock, BOOL lof) +dbfn_open(uschar *name, int flags, open_db *dbblock, BOOL lof, BOOL panic) { int rc, save_errno; BOOL read_only = flags == O_RDONLY; @@ -114,7 +115,7 @@ snprintf(CS filename, sizeof(filename), "%s/%s.lockfile", dirname, name); if ((dbblock->lockfd = Uopen(filename, O_RDWR, EXIMDB_LOCKFILE_MODE)) < 0) { created = TRUE; - (void)directory_make(spool_directory, US"db", EXIMDB_DIRECTORY_MODE, TRUE); + (void)directory_make(spool_directory, US"db", EXIMDB_DIRECTORY_MODE, panic); dbblock->lockfd = Uopen(filename, O_RDWR|O_CREAT, EXIMDB_LOCKFILE_MODE); } @@ -137,9 +138,9 @@ DEBUG(D_hints_lookup|D_retry|D_route|D_deliver) debug_printf_indent("locking %s\n", filename); sigalrm_seen = FALSE; -alarm(EXIMDB_LOCK_TIMEOUT); +ALARM(EXIMDB_LOCK_TIMEOUT); rc = fcntl(dbblock->lockfd, F_SETLKW, &lock_data); -alarm(0); +ALARM_CLR(0); if (sigalrm_seen) errno = ETIMEDOUT; if (rc < 0) @@ -209,7 +210,7 @@ if (created && geteuid() == root_uid) if (Ustat(filename, &statbuf) >= 0 && statbuf.st_uid != exim_uid) { DEBUG(D_hints_lookup) debug_printf_indent("ensuring %s is owned by exim\n", filename); - if (Uchown(filename, exim_uid, exim_gid)) + if (exim_chown(filename, exim_uid, exim_gid)) DEBUG(D_hints_lookup) debug_printf_indent("failed setting %s to owned by exim\n", filename); } } @@ -382,6 +383,8 @@ dbfn_delete(open_db *dbblock, const uschar *key) int klen = Ustrlen(key) + 1; uschar * key_copy = store_get(klen); +DEBUG(D_hints_lookup) debug_printf_indent("dbfn_delete: key=%s\n", key); + memcpy(key_copy, key, klen); EXIM_DATUM key_datum; EXIM_DATUM_INIT(key_datum); /* Some DBM libraries require clearing */ @@ -415,6 +418,8 @@ EXIM_DATUM key_datum, value_datum; uschar *yield; value_datum = value_datum; /* dummy; not all db libraries use this */ +DEBUG(D_hints_lookup) debug_printf_indent("dbfn_scan\n"); + /* Some dbm require an initialization */ if (start) EXIM_DBCREATE_CURSOR(dbblock->dbptr, cursor); @@ -532,7 +537,7 @@ while (Ufgets(buffer, 256, stdin) != NULL) } start = clock(); - odb = dbfn_open(s, O_RDWR, dbblock + i, TRUE); + odb = dbfn_open(s, O_RDWR, dbblock + i, TRUE, TRUE); stop = clock(); if (odb)