diff options
author | martti <martti> | 2008-10-16 09:40:20 +0000 |
---|---|---|
committer | martti <martti> | 2008-10-16 09:40:20 +0000 |
commit | cd6aa62335c18495e4d063faf53ea305bc551400 (patch) | |
tree | 39152d0f961d56b26534d25a43212b35310a7788 /mail | |
parent | e43d57c8e11537d167f0227bb806a420b7afebdf (diff) | |
download | pkgsrc-cd6aa62335c18495e4d063faf53ea305bc551400.tar.gz |
Added support for SQLite (pkg/39745 by Sébastien BOCAHU.
No existing binary packages are affected so I didn't bump the revision...
Diffstat (limited to 'mail')
-rw-r--r-- | mail/postfix/distinfo | 6 | ||||
-rw-r--r-- | mail/postfix/options.mk | 13 | ||||
-rw-r--r-- | mail/postfix/patches/patch-as | 55 | ||||
-rw-r--r-- | mail/postfix/patches/patch-at | 261 | ||||
-rw-r--r-- | mail/postfix/patches/patch-au | 39 | ||||
-rw-r--r-- | mail/postfix/patches/patch-av | 24 |
6 files changed, 395 insertions, 3 deletions
diff --git a/mail/postfix/distinfo b/mail/postfix/distinfo index c24c8f35795..249b5617b3c 100644 --- a/mail/postfix/distinfo +++ b/mail/postfix/distinfo @@ -1,4 +1,4 @@ -$NetBSD: distinfo,v 1.120 2008/09/17 13:21:19 joerg Exp $ +$NetBSD: distinfo,v 1.121 2008/10/16 09:40:20 martti Exp $ SHA1 (postfix/postfix-2.5.5.tar.gz) = 7240be9e362b991bacfcf7e3771ab611e872ac12 RMD160 (postfix/postfix-2.5.5.tar.gz) = 2118fa61710bdb266d4fb8b7a0f60cf0f633c801 @@ -6,3 +6,7 @@ Size (postfix/postfix-2.5.5.tar.gz) = 3157877 bytes SHA1 (patch-aa) = 5b4923402c80957e47b8a4e16c897287b88544bb SHA1 (patch-ag) = b77081a61bc2b95a40963fb1d3ac5818d55a778b SHA1 (patch-ai) = aedee357d43321d2c3557679d796814455ae0ea6 +SHA1 (patch-as) = 531d372fd2e51781616202b9c704b621b96770c4 +SHA1 (patch-at) = b0abf2c49bfe94153f7a3845b5709ff8e0027a03 +SHA1 (patch-au) = 60396f5f182e0f247b06974dc5cf912dbcf84bbf +SHA1 (patch-av) = 98073186738e1a4fcd0f620096f4be83a9ff9e73 diff --git a/mail/postfix/options.mk b/mail/postfix/options.mk index 80feddd2fcb..dc5e8cafff9 100644 --- a/mail/postfix/options.mk +++ b/mail/postfix/options.mk @@ -1,9 +1,9 @@ -# $NetBSD: options.mk,v 1.32 2008/06/03 10:30:51 ghen Exp $ +# $NetBSD: options.mk,v 1.33 2008/10/16 09:40:20 martti Exp $ # Global and legacy options PKG_OPTIONS_VAR= PKG_OPTIONS.postfix -PKG_SUPPORTED_OPTIONS= bdb ldap mysql mysql4 pcre pgsql sasl tls +PKG_SUPPORTED_OPTIONS= bdb ldap mysql mysql4 pcre pgsql sasl sqlite tls PKG_SUGGESTED_OPTIONS= tls .include "../../mk/bsd.options.mk" @@ -83,6 +83,15 @@ AUXLIBS+= -L${PGSQL_PREFIX}/lib -lpq \ .endif ### +### Support using a SQLite database for table lookups. +### +.if !empty(PKG_OPTIONS:Msqlite) +. include "../../databases/sqlite3/buildlink3.mk" +CCARGS+= -DHAS_SQLITE -I${SQLITE3_PREFIX}/include/sqlite3 +AUXLIBS+= -L${SQLITE3_PREFIX}/lib -lsqlite3 +.endif + +### ### Cyrus SASL support for SMTP authentication. ### (Dovecot SASL support is built in by default.) ### diff --git a/mail/postfix/patches/patch-as b/mail/postfix/patches/patch-as new file mode 100644 index 00000000000..06bb7d1bddc --- /dev/null +++ b/mail/postfix/patches/patch-as @@ -0,0 +1,55 @@ +$NetBSD: patch-as,v 1.4 2008/10/16 09:40:20 martti Exp $ + +Support for sqlite. + +--- src/global/Makefile.in.orig 2007-12-06 14:49:03.000000000 +0100 ++++ src/global/Makefile.in +@@ -4,7 +4,7 @@ SRCS = abounce.c anvil_clnt.c been_here. + clnt_stream.c conv_time.c db_common.c debug_peer.c debug_process.c \ + defer.c deliver_completed.c deliver_flock.c deliver_pass.c \ + deliver_request.c dict_ldap.c dict_mysql.c dict_pgsql.c \ +- dict_proxy.c domain_list.c dot_lockfile.c dot_lockfile_as.c \ ++ dict_proxy.c dict_sqlite.c domain_list.c dot_lockfile.c dot_lockfile_as.c \ + dsb_scan.c dsn.c dsn_buf.c dsn_mask.c dsn_print.c dsn_util.c \ + ehlo_mask.c ext_prop.c file_id.c flush_clnt.c header_opts.c \ + header_token.c input_transp.c int_filt.c is_header.c log_adhoc.c \ +@@ -34,7 +34,7 @@ OBJS = abounce.o anvil_clnt.o been_here. + clnt_stream.o conv_time.o db_common.o debug_peer.o debug_process.o \ + defer.o deliver_completed.o deliver_flock.o deliver_pass.o \ + deliver_request.o dict_ldap.o dict_mysql.o dict_pgsql.o \ +- dict_proxy.o domain_list.o dot_lockfile.o dot_lockfile_as.o \ ++ dict_proxy.o dict_sqlite.o domain_list.o dot_lockfile.o dot_lockfile_as.o \ + dsb_scan.o dsn.o dsn_buf.o dsn_mask.o dsn_print.o dsn_util.o \ + ehlo_mask.o ext_prop.o file_id.o flush_clnt.o header_opts.o \ + header_token.o input_transp.o int_filt.o is_header.o log_adhoc.o \ +@@ -63,7 +63,7 @@ HDRS = abounce.h anvil_clnt.h been_here. + canon_addr.h cfg_parser.h cleanup_user.h clnt_stream.h config.h \ + conv_time.h db_common.h debug_peer.h debug_process.h defer.h \ + deliver_completed.h deliver_flock.h deliver_pass.h deliver_request.h \ +- dict_ldap.h dict_mysql.h dict_pgsql.h dict_proxy.h domain_list.h \ ++ dict_ldap.h dict_mysql.h dict_pgsql.h dict_proxy.h dict_sqlite.h domain_list.h \ + dot_lockfile.h dot_lockfile_as.h dsb_scan.h dsn.h dsn_buf.h \ + dsn_mask.h dsn_print.h dsn_util.h ehlo_mask.h ext_prop.h \ + file_id.h flush_clnt.h header_opts.h header_token.h input_transp.h \ +@@ -860,6 +860,13 @@ dict_proxy.o: dict_proxy.c + dict_proxy.o: dict_proxy.h + dict_proxy.o: mail_params.h + dict_proxy.o: mail_proto.h ++dict_sqlite.o: ../../include/dict.h ++dict_sqlite.o: ../../include/msg.h ++dict_sqlite.o: ../../include/sys_defs.h ++dict_sqlite.o: cfg_parser.h ++dict_sqlite.o: db_common.h ++dict_sqlite.o: dict_sqlite.c ++dict_sqlite.o: dict_sqlite.h + domain_list.o: ../../include/match_list.h + domain_list.o: ../../include/match_ops.h + domain_list.o: ../../include/sys_defs.h +@@ -1219,6 +1226,7 @@ mail_dict.o: dict_ldap.h + mail_dict.o: dict_mysql.h + mail_dict.o: dict_pgsql.h + mail_dict.o: dict_proxy.h ++mail_dict.o: dict_sqlite.h + mail_dict.o: mail_dict.c + mail_dict.o: mail_dict.h + mail_error.o: ../../include/name_mask.h diff --git a/mail/postfix/patches/patch-at b/mail/postfix/patches/patch-at new file mode 100644 index 00000000000..5edb4dedda2 --- /dev/null +++ b/mail/postfix/patches/patch-at @@ -0,0 +1,261 @@ +$NetBSD: patch-at,v 1.4 2008/10/16 09:40:20 martti Exp $ + +Support for sqlite. + +--- src/global/dict_sqlite.c.orig 2008-10-17 00:40:21.000000000 +0200 ++++ src/global/dict_sqlite.c +@@ -0,0 +1,254 @@ ++/*++ ++/* NAME ++/* dict_sqlite 3 ++/* SUMMARY ++/* dictionary manager interface to SQLite3 databases ++/* SYNOPSIS ++/* #include <dict_sqlite.h> ++/* ++/* DICT *dict_sqlite_open(name, open_flags, dict_flags) ++/* const char *name; ++/* int open_flags; ++/* int dict_flags; ++/* DESCRIPTION ++/* dict_sqlite_open() creates a dictionary of type 'sqlite'. This ++/* dictionary is an interface for the postfix key->value mappings ++/* to SQLite. The result is a pointer to the installed dictionary, ++/* or a null pointer in case of problems. ++/* .PP ++/* Arguments: ++/* .IP name ++/* Either the path to the SQLite configuration file (if it starts ++/* with '/' or '.'), or the prefix which will be used to obtain ++/* main.cf configuration parameters for this search. ++/* ++/* In the first case, the configuration parameters below are ++/* specified in the file as \fIname\fR=\fBvalue\fR pairs. ++/* ++/* In the second case, the configuration parameters are ++/* prefixed with the value of \fIname\fR and an underscore, ++/* and they are specified in main.cf. For example, if this ++/* value is \fIsqlitecon\fR, the parameters would look like ++/* \fIsqlitecon_user\fR, \fIsqlitecon_table\fR, and so on. ++/* ++/* .IP open_flags ++/* Must be O_RDONLY. ++/* .IP dict_flags ++/* See dict_open(3). ++/* .PP ++/* Configuration parameters: ++/* ++/* The parameters encodes a number of pieces of information: ++/* dbpath, query, table, select_field and where_field: ++/* .IP \fIdbpath\fR ++/* Path to SQLite database ++/* .IP \fIquery\fR ++/* Query template, before the query is actually issued, variable ++/* substitutions are performed. See sqlite_table(5) for details. If ++/* No query is specified, the legacy variables \fItable\fR, ++/* \fIselect_field\fR, \fIwhere_field\fR and \fIadditional_conditions\fR ++/* are used to construct the query template. ++/* .IP \fIresult_format\fR ++/* The format used to expand results from queries. Substitutions ++/* are performed as described in sqlite_table(5). Defaults to returning ++/* the lookup result unchanged. ++/* .IP expansion_limit ++/* Limit (if any) on the total number of lookup result values. Lookups which ++/* exceed the limit fail with dict_errno=DICT_ERR_RETRY. Note that each ++/* non-empty (and non-NULL) column of a multi-column result row counts as ++/* one result. ++/* ++/* SEE ALSO ++/* dict(3) generic dictionary manager ++/* AUTHOR(S) ++/* Axel Steiner ++/* ast@treibsand.com ++/*--*/ ++ ++/* System library. */ ++#include "sys_defs.h" ++ ++#ifdef HAS_SQLITE ++#include <sqlite3.h> ++ ++/* Utility library. */ ++ ++#include "msg.h" ++#include "dict.h" ++#include "vstring.h" ++#include "stringops.h" ++ ++/* Global library. */ ++ ++#include "cfg_parser.h" ++#include "db_common.h" ++ ++/* Application-specific. */ ++ ++#include "dict_sqlite.h" ++ ++typedef struct { ++ DICT dict; ++ CFG_PARSER *parser; ++ sqlite3 *db; ++ char *dbpath; ++ char *query; ++ char *result_format; ++ int expansion_limit; ++ void *ctx; ++} DICT_SQLITE; ++ ++typedef sqlite3_stmt *SQL; ++ ++/* internal function declarations */ ++ ++static const char *dict_sqlite_lookup(DICT *, const char *); ++DICT *dict_sqlite_open(const char *, int, int); ++static void dict_sqlite_close(DICT *); ++static void sqlite_parse_config(DICT_SQLITE *, const char *); ++ ++ ++/* dict_sqlite_close - close the database */ ++ ++static void dict_sqlite_close(DICT *dict) { ++ const char *myname = "dict_sqlite_close"; ++ DICT_SQLITE *dict_sqlite = (DICT_SQLITE *) dict; ++ ++ if (msg_verbose) ++ msg_info("%s: dict_sqlite_close", myname); ++ if (sqlite3_close(dict_sqlite->db) != SQLITE_OK) ++ msg_fatal("%s: DB close failed", myname); ++ cfg_parser_free(dict_sqlite->parser); ++ if (dict->fold_buf) ++ vstring_free(dict->fold_buf); ++ dict_free(dict); ++} ++ ++ ++/* dict_sqlite_lookup - find database entry */ ++ ++static const char *dict_sqlite_lookup(DICT *dict, const char *name) { ++ const char *myname = "dict_sqlite_lookup"; ++ DICT_SQLITE *dict_sqlite = (DICT_SQLITE *) dict; ++ SQL sql; ++ const char *zErrMsg; ++ static VSTRING *query; ++ static VSTRING *result; ++ const char *r; ++ int expansion = 0; ++ ++ /* ++ * Optionally fold the key. ++ */ ++ if (dict->fold_buf) { ++ vstring_strcpy(dict->fold_buf, name); ++ name = lowercase(vstring_str(dict->fold_buf)); ++ } ++ ++ if (db_common_check_domain(dict_sqlite->ctx, name) == 0) { ++ if (msg_verbose) ++ msg_info("%s: Skipping lookup of '%s'", myname, name); ++ return (0); ++ } ++ ++#define INIT_VSTR(buf, len) do { \ ++ if (buf == 0) \ ++ buf = vstring_alloc(len); \ ++ VSTRING_RESET(buf); \ ++ VSTRING_TERMINATE(buf); \ ++ } while (0) ++ ++ INIT_VSTR(query, 10); ++ ++ if (!db_common_expand(dict_sqlite->ctx, dict_sqlite->query, ++ name, 0, query, NULL)) ++ return (0); ++ ++ if (msg_verbose) ++ msg_info("%s: %s: Searching with query %s", myname, ++ dict_sqlite->parser->name, vstring_str(query)); ++ ++ if(sqlite3_prepare_v2(dict_sqlite->db,vstring_str(query),-1,&sql,&zErrMsg)!=SQLITE_OK) { ++ msg_fatal("%s: sql prepare %s\n",myname,sqlite3_errmsg(dict_sqlite->db)); ++ } ++ ++ INIT_VSTR(result, 10); ++ while (sqlite3_step(sql) == SQLITE_ROW ) { ++ if (db_common_expand(dict_sqlite->ctx, dict_sqlite->result_format, ++ sqlite3_column_text(sql, 0), name, result, 0) ++ && dict_sqlite->expansion_limit > 0 ++ && ++expansion > dict_sqlite->expansion_limit) { ++ msg_warn("%s: %s: Expansion limit exceeded for key: '%s'", ++ myname, dict_sqlite->parser->name, name); ++ dict_errno = DICT_ERR_RETRY; ++ break; ++ } ++ } ++ ++ if(sqlite3_finalize(sql)){ ++ msg_fatal("%s: sql finalize for %s; %s\n",myname,vstring_str(query),sqlite3_errmsg(dict_sqlite->db)); ++ return(0); ++ } ++ ++ ++ r = vstring_str(result); ++ return ((dict_errno == 0 && *r) ? r : 0); ++} ++ ++/* sqlite_parse_config - parse sqlite configuration file */ ++ ++static void sqlite_parse_config(DICT_SQLITE *dict_sqlite, const char *sqlitecf) { ++ CFG_PARSER *p; ++ VSTRING *buf; ++ ++ p = dict_sqlite->parser = cfg_parser_alloc(sqlitecf); ++ dict_sqlite->dbpath = cfg_get_str(p, "dbpath", "", 1, 0); ++ dict_sqlite->result_format = cfg_get_str(p, "result_format", "%s", 1, 0); ++ ++ if ((dict_sqlite->query = cfg_get_str(p, "query", NULL, 0, 0)) == 0) { ++ buf = vstring_alloc(64); ++ db_common_sql_build_query(buf, p); ++ dict_sqlite->query = vstring_export(buf); ++ } ++ dict_sqlite->expansion_limit = cfg_get_int(p,"expansion_limit", 0, 0, 0); ++ dict_sqlite->ctx = 0; ++ ++ (void) db_common_parse(&dict_sqlite->dict, &dict_sqlite->ctx, dict_sqlite->query, 1); ++ (void) db_common_parse(0, &dict_sqlite->ctx, dict_sqlite->result_format, 0); ++ ++ db_common_parse_domain(p, dict_sqlite->ctx); ++ ++ if (db_common_dict_partial(dict_sqlite->ctx)) ++ dict_sqlite->dict.flags |= DICT_FLAG_PATTERN; ++ else ++ dict_sqlite->dict.flags |= DICT_FLAG_FIXED; ++ ++ if (dict_sqlite->dict.flags & DICT_FLAG_FOLD_FIX) ++ dict_sqlite->dict.fold_buf = vstring_alloc(10); ++} ++ ++/* dict_sqlite_open - open sqlite database */ ++ ++DICT *dict_sqlite_open(const char *name, int open_flags, int dict_flags) { ++ DICT_SQLITE *dict_sqlite; ++ ++ /* ++ * Sanity checks. ++ */ ++ if (open_flags != O_RDONLY) ++ msg_fatal("%s:%s map requires O_RDONLY access mode", DICT_TYPE_SQLITE, name); ++ ++ dict_sqlite = (DICT_SQLITE *) dict_alloc(DICT_TYPE_SQLITE, name, sizeof(DICT_SQLITE)); ++ dict_sqlite->dict.lookup = dict_sqlite_lookup; ++ dict_sqlite->dict.close = dict_sqlite_close; ++ dict_sqlite->dict.flags = dict_flags; ++ sqlite_parse_config(dict_sqlite, name); ++ ++ if (sqlite3_open(dict_sqlite->dbpath, &dict_sqlite->db)) { ++ msg_fatal("Can't open database: %s\n", sqlite3_errmsg(dict_sqlite->db)); ++ sqlite3_close(dict_sqlite->db); ++ } ++ ++ return (DICT_DEBUG (&dict_sqlite->dict)); ++} ++#endif diff --git a/mail/postfix/patches/patch-au b/mail/postfix/patches/patch-au new file mode 100644 index 00000000000..8094b1d4521 --- /dev/null +++ b/mail/postfix/patches/patch-au @@ -0,0 +1,39 @@ +$NetBSD: patch-au,v 1.5 2008/10/16 09:40:20 martti Exp $ + +Support for sqlite. + +--- src/global/dict_sqlite.h.orig 2008-10-17 00:40:21.000000000 +0200 ++++ src/global/dict_sqlite.h +@@ -0,0 +1,32 @@ ++#ifndef _DICT_SQLITE_H_INCLUDED_ ++#define _DICT_SQLITE_H_INCLUDED_ ++ ++/*++ ++/* NAME ++/* dict_sqlite 3h ++/* SUMMARY ++/* dictionary manager interface to sqlite databases ++/* SYNOPSIS ++/* #include <dict_sqlite.h> ++/* DESCRIPTION ++/* .nf ++ ++ /* ++ * Utility library. ++ */ ++#include <dict.h> ++ ++ /* ++ * External interface. ++ */ ++#define DICT_TYPE_SQLITE "sqlite" ++ ++extern DICT *dict_sqlite_open(const char *, int, int); ++ ++ ++/* AUTHOR(S) ++/* Axel Steiner ++/* ast@treibsand.com ++/*--*/ ++ ++#endif diff --git a/mail/postfix/patches/patch-av b/mail/postfix/patches/patch-av new file mode 100644 index 00000000000..1b25124a499 --- /dev/null +++ b/mail/postfix/patches/patch-av @@ -0,0 +1,24 @@ +$NetBSD: patch-av,v 1.6 2008/10/16 09:40:20 martti Exp $ + +Support for sqlite. + +--- src/global/mail_dict.c.orig 2008-01-08 22:07:47.000000000 +0100 ++++ src/global/mail_dict.c +@@ -36,6 +36,7 @@ + #include <dict_ldap.h> + #include <dict_mysql.h> + #include <dict_pgsql.h> ++#include <dict_sqlite.h> + #include <mail_dict.h> + + typedef struct { +@@ -54,6 +55,9 @@ static const DICT_OPEN_INFO dict_open_in + #ifdef HAS_PGSQL + DICT_TYPE_PGSQL, dict_pgsql_open, + #endif ++#ifdef HAS_SQLITE ++ DICT_TYPE_SQLITE, dict_sqlite_open, ++#endif + 0, + }; + |