git://git.exim.org
/
exim.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix build on FreeBSD
[exim.git]
/
src
/
src
/
exim_dbutil.c
diff --git
a/src/src/exim_dbutil.c
b/src/src/exim_dbutil.c
index 262e39044321f4675658e134a3637f39bd0c4ceb..fb455bbd38d0e62b9673e277bd2b897621f95af3 100644
(file)
--- a/
src/src/exim_dbutil.c
+++ b/
src/src/exim_dbutil.c
@@
-2,7
+2,7
@@
* Exim - an Internet mail transport agent *
*************************************************/
* Exim - an Internet mail transport agent *
*************************************************/
-/* Copyright (c) University of Cambridge 1995 - 201
5
*/
+/* Copyright (c) University of Cambridge 1995 - 201
6
*/
/* See the file NOTICE for conditions of use and distribution. */
/* See the file NOTICE for conditions of use and distribution. */
@@
-253,18
+253,19
@@
dbfn_open(uschar *name, int flags, open_db *dbblock, BOOL lof)
int rc;
struct flock lock_data;
BOOL read_only = flags == O_RDONLY;
int rc;
struct flock lock_data;
BOOL read_only = flags == O_RDONLY;
-uschar
buffer
[256];
+uschar
dirname[256], filename
[256];
/* The first thing to do is to open a separate file on which to lock. This
ensures that Exim has exclusive use of the database before it even tries to
open it. If there is a database, there should be a lock file in existence. */
/* The first thing to do is to open a separate file on which to lock. This
ensures that Exim has exclusive use of the database before it even tries to
open it. If there is a database, there should be a lock file in existence. */
-sprintf(CS buffer, "%s/db/%.200s.lockfile", spool_directory, name);
+snprintf(CS dirname, sizeof(dirname), "%s/db", spool_directory);
+snprintf(CS filename, sizeof(filename), "%s/%.200s.lockfile", dirname, name);
-dbblock->lockfd = Uopen(
buffer
, flags, 0);
+dbblock->lockfd = Uopen(
filename
, flags, 0);
if (dbblock->lockfd < 0)
{
if (dbblock->lockfd < 0)
{
- printf("** Failed to open database lock file %s: %s\n",
buffer
,
+ printf("** Failed to open database lock file %s: %s\n",
filename
,
strerror(errno));
return NULL;
}
strerror(errno));
return NULL;
}
@@
-285,8
+286,9
@@
if (sigalrm_seen) errno = ETIMEDOUT;
if (rc < 0)
{
printf("** Failed to get %s lock for %s: %s",
if (rc < 0)
{
printf("** Failed to get %s lock for %s: %s",
- ((flags & O_RDONLY) != 0)? "read" : "write", buffer,
- (errno == ETIMEDOUT)? "timed out" : strerror(errno));
+ flags & O_WRONLY ? "write" : "read",
+ filename,
+ errno == ETIMEDOUT ? "timed out" : strerror(errno));
(void)close(dbblock->lockfd);
return NULL;
}
(void)close(dbblock->lockfd);
return NULL;
}
@@
-294,12
+296,12
@@
if (rc < 0)
/* At this point we have an opened and locked separate lock file, that is,
exclusive access to the database, so we can go ahead and open it. */
/* At this point we have an opened and locked separate lock file, that is,
exclusive access to the database, so we can go ahead and open it. */
-sprintf(CS
buffer, "%s/db/%s", spool_directory
, name);
-EXIM_DBOPEN(
buffer
, flags, 0, &(dbblock->dbptr));
+sprintf(CS
filename, "%s/%s", dirname
, name);
+EXIM_DBOPEN(
filename, dirname
, flags, 0, &(dbblock->dbptr));
if (dbblock->dbptr == NULL)
{
if (dbblock->dbptr == NULL)
{
- printf("** Failed to open DBM file %s for %s:\n %s%s\n",
buffer
,
+ printf("** Failed to open DBM file %s for %s:\n %s%s\n",
filename
,
read_only? "reading" : "writing", strerror(errno),
#ifdef USE_DB
" (or Berkeley DB error while opening)"
read_only? "reading" : "writing", strerror(errno),
#ifdef USE_DB
" (or Berkeley DB error while opening)"
@@
-515,15
+517,16
@@
uschar keybuffer[1024];
dbdata_type = check_args(argc, argv, US"dumpdb", US"");
spool_directory = argv[1];
dbdata_type = check_args(argc, argv, US"dumpdb", US"");
spool_directory = argv[1];
-dbm = dbfn_open(argv[2], O_RDONLY, &dbblock, FALSE);
-
if (dbm == NULL)
exit(1);
+if (!(dbm = dbfn_open(argv[2], O_RDONLY, &dbblock, FALSE)))
+
exit(1);
/* Scan the file, formatting the information for each entry. Note
that data is returned in a malloc'ed block, in order that it be
correctly aligned. */
/* Scan the file, formatting the information for each entry. Note
that data is returned in a malloc'ed block, in order that it be
correctly aligned. */
-key = dbfn_scan(dbm, TRUE, &cursor);
-while (key != NULL)
+for (key = dbfn_scan(dbm, TRUE, &cursor);
+ key;
+ key = dbfn_scan(dbm, FALSE, &cursor))
{
dbdata_retry *retry;
dbdata_wait *wait;
{
dbdata_retry *retry;
dbdata_wait *wait;
@@
-545,9
+548,8
@@
while (key != NULL)
return 1;
}
Ustrcpy(keybuffer, key);
return 1;
}
Ustrcpy(keybuffer, key);
- value = dbfn_read_with_length(dbm, keybuffer, &length);
- if (
value == NULL
)
+ if (
!(value = dbfn_read_with_length(dbm, keybuffer, &length))
)
fprintf(stderr, "**** Entry \"%s\" was in the key scan, but the record "
"was not found in the file - something is wrong!\n",
CS keybuffer);
fprintf(stderr, "**** Entry \"%s\" was in the key scan, but the record "
"was not found in the file - something is wrong!\n",
CS keybuffer);
@@
-667,7
+669,6
@@
while (key != NULL)
}
store_reset(value);
}
}
store_reset(value);
}
- key = dbfn_scan(dbm, FALSE, &cursor);
}
dbfn_close(dbm);
}
dbfn_close(dbm);
@@
-774,8
+775,9
@@
for(;;)
{
int verify = 1;
spool_directory = argv[1];
{
int verify = 1;
spool_directory = argv[1];
- dbm = dbfn_open(argv[2], O_RDWR, &dbblock, FALSE);
- if (dbm == NULL) continue;
+
+ if (!(dbm = dbfn_open(argv[2], O_RDWR, &dbblock, FALSE)))
+ continue;
if (Ustrcmp(field, "d") == 0)
{
if (Ustrcmp(field, "d") == 0)
{
@@
-801,13
+803,13
@@
for(;;)
if (record == NULL) printf("not found\n"); else
{
time_t tt;
if (record == NULL) printf("not found\n"); else
{
time_t tt;
-
int length = 0; /*
Stops compiler warning */
+
/*int length = 0;
Stops compiler warning */
switch(dbdata_type)
{
case type_retry:
retry = (dbdata_retry *)record;
switch(dbdata_type)
{
case type_retry:
retry = (dbdata_retry *)record;
- length = sizeof(dbdata_retry) + Ustrlen(retry->text);
+ /* length = sizeof(dbdata_retry) + Ustrlen(retry->text); */
switch(fieldno)
{
switch(fieldno)
{
@@
-857,7
+859,7
@@
for(;;)
case type_callout:
callout = (dbdata_callout_cache *)record;
case type_callout:
callout = (dbdata_callout_cache *)record;
- length = sizeof(dbdata_callout_cache);
+ /* length = sizeof(dbdata_callout_cache); */
switch(fieldno)
{
case 0:
switch(fieldno)
{
case 0:
@@
-971,11
+973,10
@@
for(;;)
/* Handle a read request, or verify after an update. */
spool_directory = argv[1];
/* Handle a read request, or verify after an update. */
spool_directory = argv[1];
- dbm = dbfn_open(argv[2], O_RDONLY, &dbblock, FALSE);
-
if (dbm == NULL)
continue;
+ if (!(dbm = dbfn_open(argv[2], O_RDONLY, &dbblock, FALSE)))
+
continue;
- record = dbfn_read_with_length(dbm, name, &oldlength);
- if (record == NULL)
+ if (!(record = dbfn_read_with_length(dbm, name, &oldlength)))
{
printf("record %s not found\n", name);
name[0] = 0;
{
printf("record %s not found\n", name);
name[0] = 0;
@@
-1158,8
+1159,8
@@
oldest = time(NULL) - maxkeep;
printf("Tidying Exim hints database %s/db/%s\n", argv[1], argv[2]);
spool_directory = argv[1];
printf("Tidying Exim hints database %s/db/%s\n", argv[1], argv[2]);
spool_directory = argv[1];
-dbm = dbfn_open(argv[2], O_RDWR, &dbblock, FALSE);
-
if (dbm == NULL)
exit(1);
+if (!(dbm = dbfn_open(argv[2], O_RDWR, &dbblock, FALSE)))
+
exit(1);
/* Prepare for building file names */
/* Prepare for building file names */
@@
-1172,14
+1173,14
@@
to the file while scanning it. Pity the man page doesn't warn you about that.
Therefore, we scan and build a list of all the keys. Then we use that to
read the records and possibly update them. */
Therefore, we scan and build a list of all the keys. Then we use that to
read the records and possibly update them. */
-key = dbfn_scan(dbm, TRUE, &cursor);
-while (key != NULL)
+for (key = dbfn_scan(dbm, TRUE, &cursor);
+ key;
+ key = dbfn_scan(dbm, FALSE, &cursor))
{
key_item *k = store_get(sizeof(key_item) + Ustrlen(key));
k->next = keychain;
keychain = k;
Ustrcpy(k->key, key);
{
key_item *k = store_get(sizeof(key_item) + Ustrlen(key));
k->next = keychain;
keychain = k;
Ustrcpy(k->key, key);
- key = dbfn_scan(dbm, FALSE, &cursor);
}
/* Now scan the collected keys and operate on the records, resetting
}
/* Now scan the collected keys and operate on the records, resetting
@@
-1187,7
+1188,7
@@
the store each time round. */
reset_point = store_get(0);
reset_point = store_get(0);
-while (keychain
!= NULL
)
+while (keychain)
{
dbdata_generic *value;
{
dbdata_generic *value;