X-Git-Url: https://git.exim.org/exim.git/blobdiff_plain/0a6c178c6c5f45668b5bb37b8be723cc9d1e72ae..81344b40e3de597f60758926e5e1ae7a81dd5457:/src/src/dbstuff.h diff --git a/src/src/dbstuff.h b/src/src/dbstuff.h index a4ee603bb..bf5fa3f6e 100644 --- a/src/src/dbstuff.h +++ b/src/src/dbstuff.h @@ -2,7 +2,7 @@ * Exim - an Internet mail transport agent * *************************************************/ -/* Copyright (c) University of Cambridge 1995 - 2009 */ +/* Copyright (c) University of Cambridge 1995 - 2018 */ /* See the file NOTICE for conditions of use and distribution. */ /* This header file contains macro definitions so that a variety of DBM @@ -106,6 +106,10 @@ definition of DB_VERSION_STRING, which is present in versions 2.x onwards. */ #ifdef DB_VERSION_STRING +# if DB_VERSION_MAJOR >= 6 +# error Version 6 and later BDB API is not supported +# endif + /* The API changed (again!) between the 2.x and 3.x versions */ #if DB_VERSION_MAJOR >= 3 @@ -113,16 +117,22 @@ definition of DB_VERSION_STRING, which is present in versions 2.x onwards. */ /***************** Berkeley db 3.x/4.x native definitions ******************/ /* Basic DB type */ -#if DB_VERSION_MAJOR > 4 || (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 1) -# define EXIM_DB DB_ENV +# if DB_VERSION_MAJOR > 4 || (DB_VERSION_MAJOR == 4 && DB_VERSION_MINOR >= 1) +# define EXIM_DB DB_ENV /* Cursor type, for scanning */ -#define EXIM_CURSOR DBC +# define EXIM_CURSOR DBC /* The datum type used for queries */ -#define EXIM_DATUM DBT +# define EXIM_DATUM DBT /* Some text for messages */ -#define EXIM_DBTYPE "db (v4.1+)" +# define EXIM_DBTYPE "db (v4.1+)" + +/* Only more-recent versions. 5+ ? */ +# ifndef DB_FORCESYNC +# define DB_FORCESYNC 0 +# endif + /* Access functions */ @@ -130,9 +140,9 @@ definition of DB_VERSION_STRING, which is present in versions 2.x onwards. */ API changed for DB 4.1. - and we also starting using the "env" with a specified working dir, to avoid the DBCONFIG file trap. */ -# define ENV_TO_DB(env) ((DB *)((env)->app_private)) +# define ENV_TO_DB(env) ((DB *)((env)->app_private)) -# define EXIM_DBOPEN__(name, dirname, flags, mode, dbpp) \ +# define EXIM_DBOPEN__(name, dirname, flags, mode, dbpp) \ if ( db_env_create(dbpp, 0) != 0 \ || ((*dbpp)->set_errcall(*dbpp, dbfn_bdb_error_callback), 0) \ || (*dbpp)->open(*dbpp, CS dirname, DB_CREATE|DB_INIT_MPOOL|DB_PRIVATE, 0) != 0\ @@ -155,72 +165,72 @@ specified working dir, to avoid the DBCONFIG file trap. */ } /* EXIM_DBGET - returns TRUE if successful, FALSE otherwise */ -# define EXIM_DBGET(db, key, data) \ +# define EXIM_DBGET(db, key, data) \ (ENV_TO_DB(db)->get(ENV_TO_DB(db), NULL, &key, &data, 0) == 0) /* EXIM_DBPUT - returns nothing useful, assumes replace mode */ -# define EXIM_DBPUT(db, key, data) \ +# define EXIM_DBPUT(db, key, data) \ ENV_TO_DB(db)->put(ENV_TO_DB(db), NULL, &key, &data, 0) /* EXIM_DBPUTB - non-overwriting for use by dbmbuild */ -# define EXIM_DBPUTB(db, key, data) \ +# define EXIM_DBPUTB(db, key, data) \ ENV_TO_DB(db)->put(ENV_TO_DB(db), NULL, &key, &data, DB_NOOVERWRITE) /* Return values from EXIM_DBPUTB */ -# define EXIM_DBPUTB_OK 0 -# define EXIM_DBPUTB_DUP DB_KEYEXIST +# define EXIM_DBPUTB_OK 0 +# define EXIM_DBPUTB_DUP DB_KEYEXIST /* EXIM_DBDEL */ -# define EXIM_DBDEL(db, key) ENV_TO_DB(db)->del(ENV_TO_DB(db), NULL, &key, 0) +# define EXIM_DBDEL(db, key) ENV_TO_DB(db)->del(ENV_TO_DB(db), NULL, &key, 0) /* EXIM_DBCREATE_CURSOR - initialize for scanning operation */ -# define EXIM_DBCREATE_CURSOR(db, cursor) \ +# define EXIM_DBCREATE_CURSOR(db, cursor) \ ENV_TO_DB(db)->cursor(ENV_TO_DB(db), NULL, cursor, 0) /* EXIM_DBSCAN - returns TRUE if data is returned, FALSE at end */ -# define EXIM_DBSCAN(db, key, data, first, cursor) \ +# define EXIM_DBSCAN(db, key, data, first, cursor) \ ((cursor)->c_get(cursor, &key, &data, \ (first? DB_FIRST : DB_NEXT)) == 0) /* EXIM_DBDELETE_CURSOR - terminate scanning operation */ -# define EXIM_DBDELETE_CURSOR(cursor) \ +# define EXIM_DBDELETE_CURSOR(cursor) \ (cursor)->c_close(cursor) /* EXIM_DBCLOSE */ -# define EXIM_DBCLOSE__(db) \ +# define EXIM_DBCLOSE__(db) \ (ENV_TO_DB(db)->close(ENV_TO_DB(db), 0) , ((DB_ENV *)(db))->close((DB_ENV *)(db), DB_FORCESYNC)) /* Datum access types - these are intended to be assignable. */ -# define EXIM_DATUM_SIZE(datum) (datum).size -# define EXIM_DATUM_DATA(datum) (datum).data +# define EXIM_DATUM_SIZE(datum) (datum).size +# define EXIM_DATUM_DATA(datum) (datum).data /* The whole datum structure contains other fields that must be cleared before use, but we don't have to free anything after reading data. */ -# define EXIM_DATUM_INIT(datum) memset(&datum, 0, sizeof(datum)) -# define EXIM_DATUM_FREE(datum) +# define EXIM_DATUM_INIT(datum) memset(&datum, 0, sizeof(datum)) +# define EXIM_DATUM_FREE(datum) -#else /* pre- 4.1 */ +# else /* pre- 4.1 */ -# define EXIM_DB DB +# define EXIM_DB DB /* Cursor type, for scanning */ -# define EXIM_CURSOR DBC +# define EXIM_CURSOR DBC /* The datum type used for queries */ -# define EXIM_DATUM DBT +# define EXIM_DATUM DBT /* Some text for messages */ -# define EXIM_DBTYPE "db (v3/4)" +# define EXIM_DBTYPE "db (v3/4)" /* Access functions */ /* EXIM_DBOPEN - sets *dbpp to point to an EXIM_DB, NULL if failed. */ -# define EXIM_DBOPEN__(name, dirname, flags, mode, dbpp) \ +# define EXIM_DBOPEN__(name, dirname, flags, mode, dbpp) \ if (db_create(dbpp, NULL, 0) != 0 || \ ((*dbpp)->set_errcall(*dbpp, dbfn_bdb_error_callback), \ ((*dbpp)->open)(*dbpp, CS name, NULL, \ @@ -229,54 +239,54 @@ before use, but we don't have to free anything after reading data. */ mode)) != 0) *(dbpp) = NULL /* EXIM_DBGET - returns TRUE if successful, FALSE otherwise */ -# define EXIM_DBGET(db, key, data) \ +# define EXIM_DBGET(db, key, data) \ ((db)->get(db, NULL, &key, &data, 0) == 0) /* EXIM_DBPUT - returns nothing useful, assumes replace mode */ -# define EXIM_DBPUT(db, key, data) \ +# define EXIM_DBPUT(db, key, data) \ (db)->put(db, NULL, &key, &data, 0) /* EXIM_DBPUTB - non-overwriting for use by dbmbuild */ -# define EXIM_DBPUTB(db, key, data) \ +# define EXIM_DBPUTB(db, key, data) \ (db)->put(db, NULL, &key, &data, DB_NOOVERWRITE) /* Return values from EXIM_DBPUTB */ -# define EXIM_DBPUTB_OK 0 -# define EXIM_DBPUTB_DUP DB_KEYEXIST +# define EXIM_DBPUTB_OK 0 +# define EXIM_DBPUTB_DUP DB_KEYEXIST /* EXIM_DBDEL */ -# define EXIM_DBDEL(db, key) (db)->del(db, NULL, &key, 0) +# define EXIM_DBDEL(db, key) (db)->del(db, NULL, &key, 0) /* EXIM_DBCREATE_CURSOR - initialize for scanning operation */ -# define EXIM_DBCREATE_CURSOR(db, cursor) \ +# define EXIM_DBCREATE_CURSOR(db, cursor) \ (db)->cursor(db, NULL, cursor, 0) /* EXIM_DBSCAN - returns TRUE if data is returned, FALSE at end */ -# define EXIM_DBSCAN(db, key, data, first, cursor) \ +# define EXIM_DBSCAN(db, key, data, first, cursor) \ ((cursor)->c_get(cursor, &key, &data, \ (first? DB_FIRST : DB_NEXT)) == 0) /* EXIM_DBDELETE_CURSOR - terminate scanning operation */ -# define EXIM_DBDELETE_CURSOR(cursor) \ +# define EXIM_DBDELETE_CURSOR(cursor) \ (cursor)->c_close(cursor) /* EXIM_DBCLOSE */ -# define EXIM_DBCLOSE__(db) (db)->close(db, 0) +# define EXIM_DBCLOSE__(db) (db)->close(db, 0) /* Datum access types - these are intended to be assignable. */ -# define EXIM_DATUM_SIZE(datum) (datum).size -# define EXIM_DATUM_DATA(datum) (datum).data +# define EXIM_DATUM_SIZE(datum) (datum).size +# define EXIM_DATUM_DATA(datum) (datum).data /* The whole datum structure contains other fields that must be cleared before use, but we don't have to free anything after reading data. */ -# define EXIM_DATUM_INIT(datum) memset(&datum, 0, sizeof(datum)) -# define EXIM_DATUM_FREE(datum) +# define EXIM_DATUM_INIT(datum) memset(&datum, 0, sizeof(datum)) +# define EXIM_DATUM_FREE(datum) -#endif +# endif #else /* DB_VERSION_MAJOR >= 3 */ @@ -626,14 +636,18 @@ after reading data. */ # define EXIM_DBOPEN(name, dirname, flags, mode, dbpp) \ do { \ DEBUG(D_hints_lookup) \ - debug_printf("EXIM_DBOPEN: file <%s> dir <%s> flags 0x%x\n", \ - (name), (dirname), flags); \ + debug_printf_indent("EXIM_DBOPEN: file <%s> dir <%s> flags=%s\n", \ + (name), (dirname), \ + (flags) == O_RDONLY ? "O_RDONLY" \ + : (flags) == O_RDWR ? "O_RDWR" \ + : (flags) == (O_RDWR|O_CREAT) ? "O_RDWR|O_CREAT" \ + : "??"); \ EXIM_DBOPEN__(name, dirname, flags, mode, dbpp); \ - DEBUG(D_hints_lookup) debug_printf("returned from EXIM_DBOPEN: %p\n", *dbpp); \ + DEBUG(D_hints_lookup) debug_printf_indent("returned from EXIM_DBOPEN: %p\n", *dbpp); \ } while(0) # define EXIM_DBCLOSE(db) \ do { \ - DEBUG(D_hints_lookup) debug_printf("EXIM_DBCLOSE(%p)\n", db); \ + DEBUG(D_hints_lookup) debug_printf_indent("EXIM_DBCLOSE(%p)\n", db); \ EXIM_DBCLOSE__(db); \ } while(0) @@ -772,5 +786,31 @@ typedef struct { uschar bloom[40]; /* Bloom filter which may be larger than this */ } dbdata_ratelimit_unique; +#ifndef DISABLE_PIPE_CONNECT +/* This structure records the EHLO responses, cleartext and crypted, +for an IP, as bitmasks (cf. OPTION_TLS) */ + +typedef struct { + unsigned short cleartext_features; + unsigned short crypted_features; + unsigned short cleartext_auths; + unsigned short crypted_auths; +} ehlo_resp_precis; + +typedef struct { + time_t time_stamp; + /*************/ + ehlo_resp_precis data; +} dbdata_ehlo_resp; +#endif + +typedef struct { + time_t time_stamp; + /*************/ + uschar verify_override:1; + uschar ocsp:3; + uschar session[1]; +} dbdata_tls_session; + /* End of dbstuff.h */