summaryrefslogtreecommitdiff
path: root/lib/mu_dbm.c
diff options
context:
space:
mode:
authorSergey Poznyakoff <gray@gnu.org.ua>2011-10-25 15:19:46 +0300
committerSergey Poznyakoff <gray@gnu.org.ua>2011-10-25 21:26:09 +0300
commit0cb608de0ac37bfe71e06f4d592c232c78ac4db1 (patch)
treee98d2a2a2476e77fc10801616e8d0660952cc655 /lib/mu_dbm.c
parentf70ebb8c1d67d70222768b34ce7568b78fe191de (diff)
downloadmailutils-0cb608de0ac37bfe71e06f4d592c232c78ac4db1.tar.gz
mailutils-0cb608de0ac37bfe71e06f4d592c232c78ac4db1.tar.bz2
Reimplement DBM support.
* lib/mu_dbm.c: Remove. * lib/mu_dbm.h: Remove. * lib/Makefile.am: Remove mu_dbm.[ch]. * include/mailutils/sys/dbm.h: New file. * include/mailutils/sys/Makefile.am: Add dbm.h * include/mailutils/dbm.h: New file. * include/mailutils/Makefile.am (pkginclude_HEADERS): Add dbm.h. * include/mailutils/types.hin (mu_dbm_file_t): New data type. * libmu_dbm/Makefile.am: New file. * libmu_dbm/berkeley.c: New file. * libmu_dbm/close.c: New file. * libmu_dbm/create.c: New file. * libmu_dbm/datumfree.c: New file. * libmu_dbm/dbm.c: New file. * libmu_dbm/delete.c: New file. * libmu_dbm/destroy.c: New file. * libmu_dbm/errstr.c: New file. * libmu_dbm/fetch.c: New file. * libmu_dbm/firstkey.c: New file. * libmu_dbm/gdbm.c: New file. * libmu_dbm/mudbm.h: New file. * libmu_dbm/ndbm.c: New file. * libmu_dbm/nextkey.c: New file. * libmu_dbm/open.c: New file. * libmu_dbm/safety.c: New file. * libmu_dbm/store.c: New file. * Makefile.am [MU_COND_DBM]: Define LIBMU_DBM_DIR (SUBDIRS): Add $(LIBMU_DBM_DIR) * configure.ac: Revamp DBM support: several database types can be specified at once. (AC_CONFIG_FILES): Build libmu_dbm/Makefile * libmu_sieve/extensions/vacation.c: Remove inclusion of mu_dbm.h. * maidag/Makefile.am (maidag_LDADD): Add DBM libraries. * maidag/maidag.c: ENABLE_DBM instead of USE_DBM * maidag/maidag.h: Include <mailutils/dbm.h> instead of mu_dbm.h. * maidag/mailquota.c (dbm_retrieve_quota): Rewrite using libmu_dbm library calls. * mu/Makefile.am [MU_COND_DBM]: Define DBM_C. (MODULES): Add $(DBM_C). (AM_CPPFLAGS): Define DBMLIBS. * mu/ldflags.c (NEEDAUTH): Change definition. (lib_descr) <weight>: New member. All uses changed. (add_entry): Null arguments ignored. (mutool_ldflags): Rewrite traversal of lib_descr. * mu/dbm.c: New file. * pop3d/Makefile.am (pop3d_LDADD, popauth_LDADD): Add DBM libraries. * pop3d/apop.c: Rewrite using libmu_dbm library calls. * pop3d/bulletin.c: Likewise. * pop3d/logindelay.c: Likewise. * pop3d/pop3d.c: Change USE_DBM to ENABLE_DBM. * pop3d/pop3d.h: Include mailutils/dbm.h instead of mu_dbm.h * pop3d/popauth.c: Rewrite using libmu_dbm library calls. * include/mailutils/cctype.h (MU_CTYPE_ENDLN): New character class. (mu_isendln): New macro. * libmailutils/string/muctype.c (mu_c_tab): Mark \r and \n as MU_CTYPE_ENDLN.
Diffstat (limited to 'lib/mu_dbm.c')
-rw-r--r--lib/mu_dbm.c575
1 files changed, 0 insertions, 575 deletions
diff --git a/lib/mu_dbm.c b/lib/mu_dbm.c
deleted file mode 100644
index ec270f0ab..000000000
--- a/lib/mu_dbm.c
+++ /dev/null
@@ -1,575 +0,0 @@
-/* GNU Mailutils -- a suite of utilities for electronic mail
- Copyright (C) 1999, 2000, 2001, 2002, 2006, 2007, 2009, 2010, 2011
- Free Software Foundation, Inc.
-
- GNU Mailutils is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 3, or (at your option)
- any later version.
-
- GNU Mailutils is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with GNU Mailutils. If not, see <http://www.gnu.org/licenses/>. */
-
-#ifdef HAVE_CONFIG_H
-# include <config.h>
-#endif
-
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <string.h>
-#ifdef HAVE_STRINGS_H
-# include <strings.h>
-#endif
-#include <errno.h>
-#include <mailutils/errno.h>
-#include <mailutils/stream.h>
-#include <mu_dbm.h>
-#include <xalloc.h>
-
-int
-mu_fcheck_perm (int fd, int mode)
-{
- struct stat st;
-
- if (mode == 0)
- return 0;
- if (fstat (fd, &st) == -1)
- {
- if (errno == ENOENT)
- return 0;
- else
- return 1;
- }
- if ((st.st_mode & 0777) != mode)
- {
- errno = MU_ERR_UNSAFE_PERMS;
- return 1;
- }
- return 0;
-}
-
-int
-mu_check_perm (const char *name, int mode)
-{
- struct stat st;
-
- if (mode == 0)
- return 0;
- if (stat (name, &st) == -1)
- {
- if (errno == ENOENT)
- return 0;
- else
- return 1;
- }
- if ((st.st_mode & 0777) != mode)
- {
- errno = MU_ERR_UNSAFE_PERMS;
- return 1;
- }
- return 0;
-}
-
-static char *
-make_db_name (const char *name, const char *suffix)
-{
- int nlen = strlen (name);
- int slen = strlen (suffix);
- char *p;
-
- if (nlen > slen && strcmp (name + nlen - slen, suffix) == 0)
- p = xstrdup (name);
- else
- {
- p = xmalloc (strlen (name) + slen + 1);
- strcat (strcpy (p, name), suffix);
- }
- return p;
-}
-
-#if defined(WITH_GDBM)
-
-#define DB_SUFFIX ".db"
-
-int
-mu_dbm_stat (char *name, struct stat *sb)
-{
- int rc;
- char *pfname = make_db_name (name, DB_SUFFIX);
- rc = stat (pfname, sb);
- free (pfname);
- return rc;
-}
-
-int
-mu_dbm_open (char *name, DBM_FILE *db, int flags, int mode)
-{
- int f;
- char *pfname = make_db_name (name, DB_SUFFIX);
-
- if (mu_check_perm (pfname, mode))
- {
- free (pfname);
- return -1;
- }
-
- switch (flags)
- {
- case MU_STREAM_CREAT:
- f = GDBM_NEWDB;
- break;
-
- case MU_STREAM_READ:
- f = GDBM_READER;
- break;
-
- case MU_STREAM_RDWR:
- f = GDBM_WRCREAT;
- break;
-
- default:
- free (pfname);
- errno = EINVAL;
- return 1;
- }
- *db = gdbm_open (pfname, 512, f, mode, NULL);
- free (pfname);
- return *db == NULL;
-}
-
-int
-mu_dbm_close (DBM_FILE db)
-{
- gdbm_close(db);
- return 0;
-}
-
-int
-mu_dbm_fetch (DBM_FILE db, DBM_DATUM key, DBM_DATUM *ret)
-{
- *ret = gdbm_fetch (db, key);
- return ret->dptr == NULL;
-}
-
-int
-mu_dbm_delete (DBM_FILE db, DBM_DATUM key)
-{
- return gdbm_delete (db, key);
-}
-
-int
-mu_dbm_insert (DBM_FILE db, DBM_DATUM key, DBM_DATUM contents, int replace)
-{
- return gdbm_store (db, key, contents,
- replace ? GDBM_REPLACE : GDBM_INSERT);
-}
-
-DBM_DATUM
-mu_dbm_firstkey (DBM_FILE db)
-{
- return gdbm_firstkey (db);
-}
-
-DBM_DATUM
-mu_dbm_nextkey (DBM_FILE db, DBM_DATUM key)
-{
- return gdbm_nextkey (db, key);
-}
-
-void
-mu_dbm_datum_free (DBM_DATUM *datum)
-{
- void *ptr = MU_DATUM_PTR (*datum);
- if (ptr)
- free (ptr);
- MU_DATUM_PTR (*datum) = 0;
-}
-
-#elif defined(WITH_BDB)
-
-#define DB_SUFFIX ".db"
-
-int
-mu_dbm_stat (char *name, struct stat *sb)
-{
- int rc;
- char *pfname = make_db_name (name, DB_SUFFIX);
- rc = stat (pfname, sb);
- free (pfname);
- return rc;
-}
-
-int
-mu_dbm_open (char *name, DBM_FILE *dbm, int flags, int mode)
-{
- int f, rc;
- DB *db;
- char *pfname = make_db_name (name, DB_SUFFIX);
-
- if (mu_check_perm (pfname, mode))
- {
- free (pfname);
- errno = MU_ERR_UNSAFE_PERMS;
- return -1;
- }
-
- switch (flags)
- {
- case MU_STREAM_CREAT:
- f = DB_CREATE|DB_TRUNCATE;
- break;
-
- case MU_STREAM_READ:
- f = DB_RDONLY;
- break;
-
- case MU_STREAM_RDWR:
- f = DB_CREATE;
- break;
-
- default:
- free (pfname);
- errno = EINVAL;
- return -1;
- }
-
-#if WITH_BDB == 2
- rc = db_open (pfname, DB_HASH, f, mode, NULL, NULL, &db);
-#else
- rc = db_create (&db, NULL, 0);
- if (rc != 0 || db == NULL)
- return rc;
-# if DB_VERSION_MAJOR == 3
- rc = db->open (db, pfname, NULL, DB_HASH, f, mode);
-# else
- rc = db->open (db, NULL, pfname, NULL, DB_HASH, f, mode);
-# endif
-#endif
-
- free (pfname);
- if (rc)
- return -1;
-
- *dbm = malloc (sizeof **dbm);
- if (!*dbm)
- {
- db->close (db, 0);
- errno = ENOMEM;
- return -1;
- }
- (*dbm)->db = db;
- (*dbm)->dbc = NULL;
- return 0;
-}
-
-int
-mu_dbm_close (DBM_FILE db)
-{
- db->db->close (db->db, 0);
- free (db);
- return 0;
-}
-
-int
-mu_dbm_fetch (DBM_FILE db, DBM_DATUM key, DBM_DATUM *ret)
-{
- return db->db->get (db->db, NULL, &key, ret, 0);
-}
-
-int
-mu_dbm_delete (DBM_FILE db, DBM_DATUM key)
-{
- return db->db->del (db->db, NULL, &key, 0);
-}
-
-int
-mu_dbm_insert (DBM_FILE db, DBM_DATUM key, DBM_DATUM contents, int replace)
-{
- /*FIXME: replace unused*/
- return db->db->put (db->db, NULL, &key, &contents, 0);
-}
-
-DBM_DATUM
-mu_dbm_firstkey (DBM_FILE db)
-{
- DBT key, data;
- int ret;
-
- memset (&key, 0, sizeof key);
- memset (&data, 0, sizeof data);
-
- if (!db->dbc)
- {
- if (db->db->cursor (db->db, NULL, &db->dbc BDB2_CURSOR_LASTARG) != 0)
- return key;
- }
-
- if ((ret = db->dbc->c_get (db->dbc, &key, &data, DB_FIRST)) != 0)
- {
- key.data = NULL;
- key.size = 0;
- if (ret == DB_NOTFOUND)
- errno = MU_ERR_NOENT;
- else
- errno = ret;
- }
- return key;
-}
-
-DBM_DATUM
-mu_dbm_nextkey (DBM_FILE db, DBM_DATUM pkey /*unused*/)
-{
- DBT key, data;
- int ret;
-
- memset (&key, 0, sizeof key);
- memset (&data, 0, sizeof data);
-
- if (!db->dbc)
- return key;
-
- if ((ret = db->dbc->c_get (db->dbc, &key, &data, DB_NEXT)) != 0)
- {
- key.data = NULL;
- key.size = 0;
- if (ret == DB_NOTFOUND)
- errno = MU_ERR_NOENT;
- else
- errno = ret;
- }
- return key;
-}
-
-void
-mu_dbm_datum_free (DBM_DATUM *datum)
-{
- /* empty */
-}
-
-#elif defined(WITH_NDBM)
-
-#define DB_SUFFIX ".pag"
-
-int
-mu_dbm_stat (char *name, struct stat *sb)
-{
- int rc;
- char *pfname = make_db_name (name, DB_SUFFIX);
- rc = stat (pfname, sb);
- free (pfname);
- return rc;
-}
-
-int
-mu_dbm_open (char *name, DBM_FILE *db, int flags, int mode)
-{
- int f;
- char *pfname;
-
- switch (flags)
- {
- case MU_STREAM_CREAT:
- f = O_CREAT|O_TRUNC|O_RDWR;
- break;
-
- case MU_STREAM_READ:
- f = O_RDONLY;
- break;
-
- case MU_STREAM_RDWR:
- f = O_CREAT|O_RDWR;
- break;
-
- default:
- errno = EINVAL;
- return -1;
- }
- pfname = strip_suffix (name, DB_SUFFIX);
- *db = dbm_open (pfname, f, mode);
- free (pfname);
- if (!*db)
- return -1;
-
- if (mu_fcheck_perm (dbm_dirfno (*db), mode)
- || mu_fcheck_perm (dbm_pagfno (*db), mode))
- {
- dbm_close (*db);
- return 1;
- }
-
- return 0;
-}
-
-int
-mu_dbm_close (DBM_FILE db)
-{
- dbm_close (db);
- return 0;
-}
-
-int
-mu_dbm_fetch (DBM_FILE db, DBM_DATUM key, DBM_DATUM *ret)
-{
- *ret = dbm_fetch (db, key);
- return ret->dptr == NULL;
-}
-
-int
-mu_dbm_delete (DBM_FILE db, DBM_DATUM key)
-{
- return dbm_delete (db, key);
-}
-
-int
-mu_dbm_insert (DBM_FILE db, DBM_DATUM key, DBM_DATUM contents, int replace)
-{
- return dbm_store (db, key, contents, replace ? DBM_REPLACE : DBM_INSERT);
-}
-
-DBM_DATUM
-mu_dbm_firstkey (DBM_FILE db)
-{
- return dbm_firstkey (db);
-}
-
-DBM_DATUM
-mu_dbm_nextkey (DBM_FILE db, DBM_DATUM key)
-{
- return dbm_nextkey (db, key);
-}
-
-void
-mu_dbm_datum_free (DBM_DATUM *datum)
-{
- /* empty */
-}
-
-#elif defined(WITH_TOKYOCABINET)
-
-#define DB_SUFFIX ".tch"
-
-int
-mu_dbm_stat (char *name, struct stat *sb)
-{
- int rc;
- char *pfname = make_db_name (name, DB_SUFFIX);
- rc = stat (pfname, sb);
- free (pfname);
- return rc;
-}
-
-int
-mu_dbm_open (char *name, DBM_FILE *db, int flags, int mode)
-{
- int f, ecode;
- char *pfname = make_db_name (name, DB_SUFFIX);
-
- if (mu_check_perm (pfname, mode))
- {
- free (pfname);
- return -1;
- }
-
- switch (flags)
- {
- case MU_STREAM_CREAT:
- f = HDBOWRITER | HDBOCREAT;
- break;
-
- case MU_STREAM_READ:
- f = HDBOREADER;
- break;
-
- case MU_STREAM_RDWR:
- f = HDBOREADER | HDBOWRITER;
- break;
-
- default:
- free (pfname);
- errno = EINVAL;
- return 1;
- }
-
- *db = malloc (sizeof **db);
- if (!*db)
- {
- errno = ENOMEM;
- return -1;
- }
- (*db)->hdb = tchdbnew ();
-
- if (!tchdbopen ((*db)->hdb, pfname, f))
- ecode = tchdbecode ((*db)->hdb);
-
- free (pfname);
- return 0;
-}
-
-int
-mu_dbm_close (DBM_FILE db)
-{
- tchdbclose (db->hdb);
- tchdbdel (db->hdb);
- return 0;
-}
-
-int
-mu_dbm_fetch (DBM_FILE db, DBM_DATUM key, DBM_DATUM *ret)
-{
- ret->data = tchdbget (db->hdb, key.data, key.size, &ret->size);
- return ret->data == NULL;
-}
-
-int
-mu_dbm_delete (DBM_FILE db, DBM_DATUM key)
-{
- return !tchdbout (db->hdb, key.data, key.size);
-}
-
-int
-mu_dbm_insert (DBM_FILE db, DBM_DATUM key, DBM_DATUM contents, int replace)
-{
- if (replace)
- return !tchdbput (db->hdb, key.data, key.size, contents.data, contents.size);
- else
- return !tchdbputkeep (db->hdb, key.data, key.size,
- contents.data, contents.size);
-}
-
-DBM_DATUM
-mu_dbm_firstkey (DBM_FILE db)
-{
- DBM_DATUM key;
- memset (&key, 0, sizeof key);
-
- tchdbiterinit (db->hdb);
- key.data = tchdbiternext (db->hdb, &key.size);
- return key;
-}
-
-DBM_DATUM
-mu_dbm_nextkey (DBM_FILE db, DBM_DATUM unused)
-{
- DBM_DATUM key;
- memset (&key, 0, sizeof key);
-
- key.data = tchdbiternext (db->hdb, &key.size);
- return key;
-}
-
-void
-mu_dbm_datum_free (DBM_DATUM *datum)
-{
- /* empty */
-}
-
-#endif
-

Return to:

Send suggestions and report system problems to the System administrator.