[prev in list] [next in list] [prev in thread] [next in thread]
List: exim-users
Subject: Berkeley DB patch for exim 0.50
From: Nigel Metheringham <Nigel.Metheringham () ThePLAnet ! net>
Date: 1996-05-23 16:10:15
[Download RAW message or body]
Philip,
Here's a patch for direct support of Berkeley db in exim (rather than
using the dbm emulation, which may or not be compiled in depending
how you build berkeley).
Its a touch of a mess because I didn't change any of your
organisation - so everywhere where dbm functions were there is now an
ifdef with dbm and db functions.
One thing to watch is that there is a difference between db using dbm
emulation and db direct - basically in direct mode it does *not* add
a .db extension to the filename. Hence I have added a check in
exim_dbmbuild to prevent you overwriting the source file!
Its only lightly tested, I'll hit it better soon.
To use it, define USE_DB in a config file along with setting DBMLIB
to the right thing.
Patch is an encoded MIME enclosure - some people have been unable to
use unencoded ones from me presumably due to white space mangling.
Nigel.
[Attachment #3 (unknown)]
Index: exim/scripts/os-type
diff -u exim/scripts/os-type:1.1.1.4 exim/scripts/os-type:1.2
--- exim/scripts/os-type:1.1.1.4 Thu May 23 10:28:48 1996
+++ exim/scripts/os-type Thu May 23 16:48:18 1996
@@ -33,7 +33,8 @@
Ultrix) os=ULTRIX;;
BSD/OS) os=BSDI;;
# Convert what tcsh sets OSTYPE to
-solaris) os=SunOS;;
+solaris) os=SunOS5;;
+sunos4) os=SunOS4;;
# Convert what some Linuxes set in OSTYPE
linux) os=Linux;;
esac
Index: exim/src/config.h.defaults
diff -u exim/src/config.h.defaults:1.1.1.5 exim/src/config.h.defaults:1.2
--- exim/src/config.h.defaults:1.1.1.5 Thu May 23 10:28:53 1996
+++ exim/src/config.h.defaults Thu May 23 16:48:21 1996
@@ -61,4 +61,7 @@
#define EXPAND_MAXN 9
#define ROOT_UID 0
+/* And build variations... */
+#define USE_DB
+
/* End of config.h.defaults */
Index: exim/src/db.c
diff -u exim/src/db.c:1.1.1.3 exim/src/db.c:1.4
--- exim/src/db.c:1.1.1.3 Thu May 23 10:28:55 1996
+++ exim/src/db.c Thu May 23 16:48:22 1996
@@ -31,20 +31,28 @@
* Open and lock a database file *
*************************************************/
-DBM *db_open(char *name, int flags)
+EXIM_DB *db_open(char *name, int flags)
{
-DBM *dbm;
+EXIM_DB *dbm;
flock_t lock_data;
int lock_count = 0;
char buffer[256];
sprintf(buffer, "%s/db/%s", spool_directory, name);
+#ifdef USE_DB
+dbm = dbopen(buffer, flags, DB_MODE, DB_HASH, NULL);
+#else
dbm = dbm_open(buffer, flags, DB_MODE);
+#endif
if (dbm == NULL)
{
directory_make(spool_directory, "db", DB_DIRECTORY_MODE);
+#ifdef USE_DB
+ dbm = dbopen(buffer, flags, DB_MODE, DB_HASH, NULL);
+#else
dbm = dbm_open(buffer, flags, DB_MODE);
+#endif
}
if (dbm == NULL)
@@ -63,13 +71,21 @@
the BSDI os.h file defines USE_DBM_DIRFNO, which causes dbhdr.h to define a
macro that turns dbm_pagfno() into dbm_dirfno(). */
+#ifdef USE_DB
+while (fcntl(dbm->fd(dbm), F_SETLK, &lock_data) < 0)
+#else
while (fcntl(dbm_pagfno(dbm), F_SETLK, &lock_data) < 0)
+#endif
{
if (lock_count++ > DB_LOCK_RETRIES)
{
log_write(LOG_MAIN, "Failed to get %s lock for %s\n",
((flags & O_RDONLY) != 0)? "read" : "write", buffer);
+#ifdef USE_DB
+ dbm->close(dbm);
+#else
dbm_close(dbm);
+#endif
return NULL;
}
@@ -91,17 +107,25 @@
/* There isn't much one can do if unlocking fails, and there's
no error return given by dbm_close(). */
-void db_close(DBM *dbm)
+void db_close(EXIM_DB *dbm)
{
flock_t lock_data;
lock_data.l_type = F_UNLCK;
lock_data.l_whence = lock_data.l_start = lock_data.l_len = 0;
+#ifdef USE_DB
+if (fcntl(dbm->fd(dbm), F_SETLK, &lock_data) < 0)
+ {
+ log_write(LOG_MAIN, "Unlock failed for dbm file: %s", strerror(errno));
+ }
+dbm->close(dbm);
+#else
if (fcntl(dbm_pagfno(dbm), F_SETLK, &lock_data) < 0)
{
log_write(LOG_MAIN, "Unlock failed for dbm file: %s", strerror(errno));
}
dbm_close(dbm);
+#endif
}
@@ -116,8 +140,18 @@
to be properly aligned to pick out the timestamps, etc., we might as
well do the copying centrally here. */
-void *db_read(DBM *dbm, char *key)
+void *db_read(EXIM_DB *dbm, char *key)
{
+#ifdef USE_DB
+void *yield;
+DBT key_datum, result_datum;
+key_datum.data = key;
+key_datum.size = (int)strlen(key) + 1;
+if (dbm->get(dbm, &key_datum, &result_datum, 0)) return NULL;
+yield = (void *)store_malloc(result_datum.size);
+memcpy(yield, result_datum.data, result_datum.size);
+#else
+
void *yield;
datum key_datum, result_datum;
key_datum.dptr = key;
@@ -126,6 +160,8 @@
if (result_datum.dptr == NULL) return NULL;
yield = (void *)store_malloc(result_datum.dsize);
memcpy(yield, result_datum.dptr, result_datum.dsize);
+#endif
+
return yield;
}
@@ -137,8 +173,18 @@
/* The yield is the result of dbm_store, that is, zero for OK. */
-int db_write(DBM *dbm, char *key, void *ptr, int length)
+int db_write(EXIM_DB *dbm, char *key, void *ptr, int length)
{
+#ifdef USE_DB
+DBT key_datum, value_datum;
+db_generic *gptr = (db_generic *)ptr;
+gptr->time_stamp = time(NULL);
+key_datum.data = key;
+key_datum.size = (int)strlen(key) + 1;
+value_datum.data = (char *)ptr;
+value_datum.size = length;
+return dbm->put(dbm, &key_datum, &value_datum, 0);
+#else
datum key_datum, value_datum;
db_generic *gptr = (db_generic *)ptr;
gptr->time_stamp = time(NULL);
@@ -147,6 +193,7 @@
value_datum.dptr = (char *)ptr;
value_datum.dsize = length;
return dbm_store(dbm, key_datum, value_datum, DBM_REPLACE);
+#endif
}
@@ -155,12 +202,19 @@
* Delete record from database file *
*************************************************/
-int db_delete(DBM *dbm, char *key)
+int db_delete(EXIM_DB *dbm, char *key)
{
+#ifdef USE_DB
+DBT key_datum;
+key_datum.data = key;
+key_datum.size = (int)strlen(key) + 1;
+return dbm->del(dbm, &key_datum, 0);
+#else
datum key_datum;
key_datum.dptr = key;
key_datum.dsize = (int)strlen(key) + 1;
return dbm_delete(dbm, key_datum);
+#endif
}
@@ -169,10 +223,17 @@
* Scan the keys of a database file *
*************************************************/
-char *db_scan(DBM *dbm, BOOL start)
+char *db_scan(EXIM_DB *dbm, BOOL start)
{
+#ifdef USE_DB
+DBT result_datum, key_datum;
+if (dbm->seq(dbm, &key_datum, &result_datum, start ? R_FIRST : R_NEXT))
+ return NULL;
+return key_datum.data;
+#else
datum result_datum = start? dbm_firstkey(dbm) : dbm_nextkey(dbm);
return result_datum.dptr;
+#endif
}
/* End of db.c */
Index: exim/src/dbhdr.h
diff -u exim/src/dbhdr.h:1.1.1.2 exim/src/dbhdr.h:1.3
--- exim/src/dbhdr.h:1.1.1.2 Thu May 23 10:28:56 1996
+++ exim/src/dbhdr.h Thu May 23 10:34:49 1996
@@ -9,9 +9,12 @@
BSDI has file in /usr/include called db.h which gets called from inside
/usr/include/ndbm.h. */
-
-#include <ndbm.h>
-
+#ifdef USE_DB
+# include <db.h>
+# define EXIM_DB DB
+#else
+# include <ndbm.h>
+# define EXIM_DB DBM
/* Most Unix systems have the function (usually a macro) dbm_pagfno(), and Exim
started life using that for getting a file descriptor in order to lock an open
@@ -23,10 +26,12 @@
to turn one into the other, first undefining any previous macro - BSDI defines
one that causes a compilation error. */
-#ifdef USE_DBM_DIRFNO
-#undef dbm_pagfno
-#define dbm_pagfno(a) dbm_dirfno(a)
-#endif
+# ifdef USE_DBM_DIRFNO
+# undef dbm_pagfno
+# define dbm_pagfno(a) dbm_dirfno(a)
+# endif
+
+#endif /* !defined(USE_DB) */
/* Structures for records stored in exim database dbm files. They all
@@ -75,11 +80,11 @@
/* Functions for reading/writing exim database files */
-void db_close(DBM *);
-int db_delete(DBM *, char *);
-DBM *db_open(char *, int);
-void *db_read(DBM *, char *);
-char *db_scan(DBM *, BOOL);
-int db_write(DBM *, char *, void *, int);
+void db_close(EXIM_DB *);
+int db_delete(EXIM_DB *, char *);
+EXIM_DB *db_open(char *, int);
+void *db_read(EXIM_DB *, char *);
+char *db_scan(EXIM_DB *, BOOL);
+int db_write(EXIM_DB *, char *, void *, int);
/* End of dbhdr.h */
Index: exim/src/deliver.c
diff -u exim/src/deliver.c:1.1.1.6 exim/src/deliver.c:1.5
--- exim/src/deliver.c:1.1.1.6 Thu May 23 10:28:58 1996
+++ exim/src/deliver.c Thu May 23 16:48:25 1996
@@ -963,7 +963,7 @@
int i, fd;
time_t now = time(NULL);
address_item *addr_last;
-DBM *dbm_file;
+EXIM_DB *dbm_file;
char spoolname[256];
DEBUG(1) debug_printf("delivering message %s\n", id);
Index: exim/src/exim_dbmbuild.c
diff -u exim/src/exim_dbmbuild.c:1.1.1.4 exim/src/exim_dbmbuild.c:1.2
--- exim/src/exim_dbmbuild.c:1.1.1.4 Thu May 23 10:29:04 1996
+++ exim/src/exim_dbmbuild.c Thu May 23 16:48:27 1996
@@ -12,7 +12,7 @@
by writing a new file or files, and then renaming; otherwise old entries can
never get flushed out.
-This program is clever enough to copy with ndbm, which creates two files called
+This program is clever enough to cope with ndbm, which creates two files called
<name>.dir and <name>.pag, or with db, which creates a single file called
<name>.db. If there are any other variants, it won't copy.
@@ -45,8 +45,12 @@
int yield = 0;
int is_db = 0;
FILE *f;
-DBM *d;
+EXIM_DB *d;
+#ifdef USE_DB
+DBT key, content;
+#else
datum key, content;
+#endif
char *bptr;
char keybuffer[256];
char temp_dbmname[256];
@@ -71,13 +75,27 @@
}
}
+#ifdef USE_DB
+/* By default Berkeley db does not put extensions on... which
+ can be painful! */
+if (!strcmp(argv[1], argv[2]))
+ {
+ printf("exim_dbmbuild: input and output filenames are the same\n");
+ exit(1);
+ }
+#endif
+
strcpy(temp_dbmname, argv[2]);
strcat(temp_dbmname, ".dbmbuild_temp");
/* It is apparently necessary to open with O_RDWR for this to work
with gdbm-1.7.3, though no reading is actually going to be done. */
+#ifdef USE_DB
+d = dbopen(temp_dbmname, O_RDWR|O_CREAT|O_EXCL, 0444, DB_HASH, NULL);
+#else
d = dbm_open(temp_dbmname, O_RDWR|O_CREAT|O_EXCL, 0444);
+#endif
if (d == NULL)
{
@@ -87,7 +105,8 @@
exit(1);
}
-/* See if we have created <name>.db; if not, assume .dir & .pag */
+/* See if we have created <name>.db; if not, assume .dir & .pag
+ If we are using Berkeley db then there are no extensions! */
sprintf(real_dbmname, "%s.db", temp_dbmname);
is_db = stat(real_dbmname, &statbuf) == 0;
@@ -129,21 +148,33 @@
else
{
- int i;
+ int i, size;
char *s = line;
if (started)
{
+#ifdef USE_DB
+ content.data = buffer;
+ content.size = bptr - buffer + 1;
+ d->put(d, &key, &content, 0);
+#else
content.dptr = buffer;
content.dsize = bptr - buffer + 1;
dbm_store(d, key, content, DBM_REPLACE);
+#endif
count++;
bptr = buffer;
}
while (*s != 0 && *s != ':' && !isspace(*s)) s++;
+ size = s - line + 1;
+#ifdef USE_DB
+ key.data = keybuffer;
+ key.size = size;
+#else
key.dptr = keybuffer;
- key.dsize = s - line + 1;
+ key.dsize = size;
+#endif
- if (key.dsize > 256)
+ if (size > 256)
{
printf("Keys longer than 255 characters cannot be handled\n");
started = 0;
@@ -151,7 +182,7 @@
break;
}
- for (i = 0; i < key.dsize - 1; i++) keybuffer[i] = tolower(line[i]);
+ for (i = 0; i < size - 1; i++) keybuffer[i] = tolower(line[i]);
keybuffer[i] = 0;
started = 1;
@@ -168,13 +199,22 @@
if (started)
{
+#ifdef USE_DB
+ content.data = buffer;
+ content.size = bptr - buffer + 1;
+ d->put(d, &key, &content, 0);
+#else
content.dptr = buffer;
content.dsize = bptr - buffer + 1;
dbm_store(d, key, content, DBM_REPLACE);
+#endif
count++;
}
-
+#ifdef USE_DB
+d->close(d);
+#else
dbm_close(d);
+#endif
fclose(f);
/* If successful, output the number of entries and rename the temporary
@@ -200,6 +240,17 @@
/* Rename .dir and .pag files */
else
+#ifdef USE_DB
+ {
+ strcpy(real_dbmname, temp_dbmname);
+ strcpy(buffer, argv[2]);
+ if (rename(real_dbmname, buffer) != 0)
+ {
+ printf("Unable to rename %s as %s\n", real_dbmname, buffer);
+ return 1;
+ }
+ }
+#else
{
sprintf(real_dbmname, "%s.dir", temp_dbmname);
sprintf(buffer, "%s.dir", argv[2]);
@@ -216,7 +267,8 @@
printf("Unable to rename %s as %s\n", real_dbmname, buffer);
return 1;
}
- }
+ }
+#endif
}
/* Otherwise unlink the temporary files. */
@@ -242,4 +294,3 @@
}
/* End of exim_dbmbuild.c */
-
Index: exim/src/exim_dumpdb.c
diff -u exim/src/exim_dumpdb.c:1.1.1.3 exim/src/exim_dumpdb.c:1.2
--- exim/src/exim_dumpdb.c:1.1.1.3 Thu May 23 10:29:05 1996
+++ exim/src/exim_dumpdb.c Thu May 23 16:48:29 1996
@@ -54,7 +54,7 @@
{
struct stat statbuf;
int db_type = 0;
-DBM *dbm;
+EXIM_DB *dbm;
char *key;
char buffer[256];
Index: exim/src/exim_fixdb.c
diff -u exim/src/exim_fixdb.c:1.1.1.3 exim/src/exim_fixdb.c:1.2
--- exim/src/exim_fixdb.c:1.1.1.3 Thu May 23 10:29:06 1996
+++ exim/src/exim_fixdb.c Thu May 23 16:48:31 1996
@@ -155,7 +155,7 @@
for(;;)
{
- DBM *dbm;
+ EXIM_DB *dbm;
void *record;
db_retry *retry;
db_wait *wait;
Index: exim/src/exim_tidydb.c
diff -u exim/src/exim_tidydb.c:1.1.1.3 exim/src/exim_tidydb.c:1.2
--- exim/src/exim_tidydb.c:1.1.1.3 Thu May 23 10:29:07 1996
+++ exim/src/exim_tidydb.c Thu May 23 16:48:34 1996
@@ -70,7 +70,7 @@
int keycount = 0;
key_item *keychain = NULL;
BOOL full = FALSE;
-DBM *dbm;
+EXIM_DB *dbm;
char buffer[256];
char *key;
Index: exim/src/retry.c
diff -u exim/src/retry.c:1.1.1.4 exim/src/retry.c:1.2
--- exim/src/retry.c:1.1.1.4 Thu May 23 10:29:23 1996
+++ exim/src/retry.c Thu May 23 16:48:37 1996
@@ -40,7 +40,7 @@
char *retry_check_address(host_item *host)
{
char *key;
-DBM *dbm_file;
+EXIM_DB *dbm_file;
tree_node *node;
db_retry *retry_record;
@@ -222,7 +222,7 @@
void retry_update(address_item **addr_defer, address_item **addr_failed,
address_item **addr_succeed)
{
-DBM *dbm_file = NULL;
+EXIM_DB *dbm_file = NULL;
time_t now = time(NULL);
int i;
Index: exim/src/search.c
diff -u exim/src/search.c:1.1.1.4 exim/src/search.c:1.2
--- exim/src/search.c:1.1.1.4 Thu May 23 10:29:25 1996
+++ exim/src/search.c Thu May 23 16:48:39 1996
@@ -133,7 +133,7 @@
{
int rc;
FILE *f;
-DBM *d;
+EXIM_DB *d;
char *nis_domain;
tree_node *t;
void *handle;
@@ -179,7 +179,11 @@
/* DBM search */
case stype_dbm:
+#ifdef USE_DB
+ d = dbopen(filename, O_RDONLY, DB_MODE, DB_HASH, NULL);
+#else
d = dbm_open(filename, O_RDONLY, 0);
+#endif
if (d == NULL)
{
*message = string_sprintf("failed to open %s.{dir,pag}: %s", filename,
@@ -187,9 +191,13 @@
return NULL;
}
+#ifdef USE_DB
+ if ((rc = check_file(d->fd(d), modemask, owners, owngroups)) != check_ok)
+#else
if ((rc = check_file(dbm_pagfno(d), modemask, owners, owngroups)) != check_ok
&&
(rc = check_file(dbm_dirfno(d), modemask, owners, owngroups)) != check_ok)
+#endif
{
*message = (rc == check_fstat)?
string_sprintf("%s: failed to fstat open file", filename) :
@@ -260,11 +268,15 @@
char *search_find(void *handle, char *filename, char *keystring, int type)
{
+#ifdef USE_DB
+DBT key, data;
+#else
datum key, data;
+#endif
int length;
int nis_data_length;
FILE *f;
-DBM *d;
+EXIM_DB *d;
BOOL free_orig = FALSE;
char *subkey;
char *colon = strchr(keystring, ':');
@@ -352,11 +364,18 @@
/* DBM search. */
case stype_dbm:
- d = (DBM *)handle;
+ d = (EXIM_DB *)handle;
+#ifdef USE_DB
+ key.data = keystring;
+ key.size = length + 1;
+ if (!d->get(d, &key, &data, 0))
+ cached_data = string_copy(data.data);
+#else
key.dptr = keystring;
key.dsize = length + 1;
data = dbm_fetch(d, key);
if (data.dptr != NULL) cached_data = string_copy(data.dptr);
+#endif
break;
/* NIS search */
@@ -425,7 +444,11 @@
break;
case stype_dbm:
- dbm_close((DBM *)handle);
+#ifdef USE_DB
+ ((EXIM_DB *)handle)->close((EXIM_DB *)handle);
+#else
+ dbm_close((EXIM_DB *)handle);
+#endif
break;
#if HAVE_NIS
Index: exim/src/transport.c
diff -u exim/src/transport.c:1.1.1.4 exim/src/transport.c:1.2
--- exim/src/transport.c:1.1.1.4 Thu May 23 10:29:34 1996
+++ exim/src/transport.c Thu May 23 16:48:41 1996
@@ -363,7 +363,7 @@
char buffer[256];
char *prevname = "";
host_item *host;
-DBM *dbm_file;
+EXIM_DB *dbm_file;
/* Open the database for this transport */
@@ -497,7 +497,7 @@
{
db_wait *host_record;
int host_length, path_len, pid, status;
-DBM *dbm_file;
+EXIM_DB *dbm_file;
char new_message_id[MESSAGE_ID_LENGTH + 1];
char buffer[256];
@@ -526,7 +526,11 @@
host_record = db_read(dbm_file, hostname);
if (host_record == NULL)
{
+#ifdef USE_DB
+ dbm_file->close(dbm_file);
+#else
dbm_close(dbm_file);
+#endif
DEBUG(4) debug_printf("no messages waiting for %s\n", hostname);
return FALSE;
}
Index: exim/src/verify.c
diff -u exim/src/verify.c:1.1.1.6 exim/src/verify.c:1.6
--- exim/src/verify.c:1.1.1.6 Thu May 23 10:29:36 1996
+++ exim/src/verify.c Thu May 23 16:48:43 1996
@@ -649,7 +649,7 @@
BOOL verify_sender_preliminary(int *errcode, char **errmess)
{
char *newaddr;
-DBM *dbmfile;
+EXIM_DB *dbmfile;
db_reject *reject;
char buffer[SENDER_ADDRESS_MAXLENGTH + 256];
@@ -778,7 +778,7 @@
BOOL verify_sender(int *errcode, char **errmess)
{
-DBM *dbmfile;
+EXIM_DB *dbmfile;
db_reject reject;
char buffer[256];
Index: exim/src/transports/autoreply.c
diff -u exim/src/transports/autoreply.c:1.1.1.1 exim/src/transports/autoreply.c:1.2
--- exim/src/transports/autoreply.c:1.1.1.1 Thu May 23 10:30:03 1996
+++ exim/src/transports/autoreply.c Thu May 23 16:48:46 1996
@@ -171,11 +171,16 @@
char *logfile, *oncelog;
char *now = NULL;
header_line *h;
-DBM *dbm_file = NULL;
+EXIM_DB *dbm_file = NULL;
FILE *f;
FILE *ff = NULL;
autoreply_transport_options_block *ob =
(autoreply_transport_options_block *)(tblock->options_block);
+#ifdef USE_DB
+DBT key_datum, result_datum;
+#else
+datum432_datum, result_datum;
+#endif
DEBUG(2) debug_printf("%s transport entered\n", tblock->name);
@@ -262,8 +267,11 @@
if (oncelog != NULL && to != NULL)
{
- datum key_datum, result_datum;
+#ifdef EXIM_DB
+ dbm_file = dbopen(oncelog, O_RDWR|O_CREAT, ob->mode, DB_HASH, NULL);
+#else
dbm_file = dbm_open(oncelog, O_RDWR|O_CREAT, ob->mode);
+#endif
if (dbm_file == NULL)
{
addr->transport_return = DEFER;
@@ -272,12 +280,21 @@
return;
}
+#ifdef USE_DB
+ key_datum.data = to;
+ key_datum.size = (int)strlen(to) + 1;
+ if (dbm_file->get(dbm_file, &key_datum, &result_datum,0) == 0)
+ {
+ dbm_file->close(dbm_file);
+#else
key_datum.dptr = to;
key_datum.dsize = (int)strlen(to) + 1;
result_datum = dbm_fetch(dbm_file, key_datum);
if (result_datum.dptr != NULL)
{
+ dbm_close(dbm_file);
+#endif
DEBUG(9) debug_printf("message already sent to %s\n", to);
log_fd = open(logfile, O_WRONLY|O_APPEND|O_CREAT, ob->mode);
if (log_fd >= 0)
@@ -288,7 +305,6 @@
while(*ptr) ptr++;
write(log_fd, log_buffer, ptr - log_buffer);
}
- dbm_close(dbm_file);
return;
}
}
@@ -411,14 +427,18 @@
if (dbm_file != NULL)
{
- datum key_datum, value_datum;
if (now == NULL) now = tod_stamp(tod_log);
- key_datum.dptr = to;
- key_datum.dsize = (int)strlen(to) + 1;
- value_datum.dptr = now;
- value_datum.dsize = (int)strlen(now) + 1;
- dbm_store(dbm_file, key_datum, value_datum, DBM_REPLACE);
+#ifdef USE_DB
+ result_datum.data = now;
+ result_datum.size = (int)strlen(now) + 1;
+ dbm_file->put(dbm_file, &key_datum, &result_datum, 0);
+ dbm_file->close(dbm_file);
+#else
+ result_datum.dptr = now;
+ result_datum.dsize = (int)strlen(now) + 1;
+ dbm_store(dbm_file, key_datum, result_datum, DBM_REPLACE);
dbm_close(dbm_file);
+#endif
}
/* If sending failed, defer to try again - but if once is set the next
[ Nigel.Metheringham@theplanet.net - Unix Applications Engineer ]
[ *Views expressed here are personal and not supported by PLAnet* ]
[ PLAnet Online : The White House Tel : +44 113 2345566 x 612 ]
[ Melbourne Street, Leeds LS2 7PS UK. Fax : +44 113 2345656 ]
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic