From 8cd17e22898fb1f13bc5da4507906276feddf64b Mon Sep 17 00:00:00 2001 From: Thadeu Lima de Souza Cascardo Date: Tue, 7 Jul 2009 17:42:37 -0300 Subject: [PATCH] User GDBM instead of QDBM. This will make it easier to support CentOS 5 without extra requirements. --- configure.ac | 5 ++--- ppmanager.c | 52 ++++++++++++++++++++++++++++------------------ usermap.c | 58 ++++++++++++++++++++++++++-------------------------- 3 files changed, 63 insertions(+), 52 deletions(-) diff --git a/configure.ac b/configure.ac index 3c5b42b..97cd9cd 100644 --- a/configure.ac +++ b/configure.ac @@ -4,9 +4,8 @@ AC_PROG_CC AC_PROG_INSTALL AM_PATH_GLIB_2_0(,,AC_MSG_ERROR(GLib not found)) PKG_CHECK_MODULES(GNUTLS, gnutls >= 1.4.0, , AC_MSG_ERROR(Could not find gnutls)) -PKG_CHECK_MODULES(QDBM, qdbm, , AC_MSG_ERROR(Could not find qdbm)) -LIBS="$GLIB_LIBS $GNUTLS_LIBS $QDBM_LIBS $LIBS" -CFLAGS="$GLIB_CFLAGS $GNUTLS_CFLAGS $QDBM_CFLAGS $CFLAGS" +LIBS="$GLIB_LIBS $GNUTLS_LIBS $LIBS" +CFLAGS="-lgdbm $GLIB_CFLAGS $GNUTLS_CFLAGS $CFLAGS" if test "${sysconfdir}x" = '${prefix}/etcx'; then if test "${prefix}x" = 'NONEx'; then AC_DEFINE_UNQUOTED(SYSCONFDIR, "${ac_default_prefix}/etc") diff --git a/ppmanager.c b/ppmanager.c index 4fdc08a..f67714b 100644 --- a/ppmanager.c +++ b/ppmanager.c @@ -21,7 +21,8 @@ #include #include #include -#include +#include +#include enum { @@ -31,15 +32,17 @@ enum }; void -pp_dplistkeys (DEPOT *dp) +pp_dblistkeys (GDBM_FILE db) { - char *key; - dpiterinit (dp); - int ksz; - while ((key = dpiternext (dp, &ksz)) != NULL && ksz > 0) + datum key; + datum oldkey; + key = gdbm_firstkey (db); + while (key.dptr != NULL) { - printf ("%s\n", key); - free (key); + printf ("%s\n", key.dptr); + oldkey = key; + key = gdbm_nextkey (db, oldkey); + free (oldkey.dptr); } } @@ -54,17 +57,19 @@ usage (char *programname) int main (int argc, char **argv) { - DEPOT *dp; + GDBM_FILE db; int action; - char *db; + char *db_fn; char *username; + datum key; + datum data; int r = 0; if (argc < 3) usage (argv[0]); if (!strcmp (argv[1], "deny")) - db = "/var/lib/popproxy/deny.db"; + db_fn = "/var/lib/popproxy/deny.db"; else if (!strcmp (argv[1], "allow")) - db = "/var/lib/popproxy/allow.db"; + db_fn = "/var/lib/popproxy/allow.db"; else usage (argv[0]); if (!strcmp (argv[2], "add")) @@ -77,9 +82,16 @@ main (int argc, char **argv) usage (argv[0]); if ((action == ACTION_ADD || action == ACTION_DEL) && argc < 4) usage (argv[0]); - username = argv[3]; - dp = dpopen (db, DP_OWRITER | DP_OCREAT, 0); - if (dp == NULL) + if (action != ACTION_LIST) + { + username = argv[3]; + key.dptr = username; + key.dsize = strlen (username); + data.dptr = ""; + data.dsize = 1; + } + db = gdbm_open (db_fn, 0, GDBM_WRCREAT, 0600, NULL); + if (db == NULL) { fprintf (stderr, "Could not create database.\n"); exit (1); @@ -87,19 +99,19 @@ main (int argc, char **argv) switch (action) { case ACTION_ADD: - dpput (dp, username, -1, "", -1, DP_DOVER); + r = gdbm_store (db, key, data, GDBM_REPLACE); break; case ACTION_DEL: - dpout (dp, username, -1); + r = gdbm_delete (db, key); break; case ACTION_LIST: - pp_dplistkeys (dp); - r = 1; + pp_dblistkeys (db); + r = 0; break; default: fprintf (stderr, "Action unrecognized.\n"); r = 1; } - dpclose (dp); + gdbm_close (db); return r; } diff --git a/usermap.c b/usermap.c index e2fa5bd..40e0aab 100644 --- a/usermap.c +++ b/usermap.c @@ -19,46 +19,46 @@ */ #include -#include +#include +#include #include "usermap.h" int usermap_perm (char *user) { - DEPOT* allow_dp = NULL; - DEPOT* deny_dp = NULL; - char* allow = NULL; - char* deny = NULL; + GDBM_FILE allow_db = NULL; + GDBM_FILE deny_db = NULL; + int allow = 0; + int deny = 0; + datum key; + key.dptr = user; + key.dsize = strlen (user); int allow_users = 0; - allow_dp = dpopen ("/var/lib/popproxy/allow.db", DP_OREADER, 0); - deny_dp = dpopen ("/var/lib/popproxy/deny.db", DP_OREADER, 0); - if (allow_dp) + allow_db = gdbm_open ("/var/lib/popproxy/allow.db", + 0, GDBM_READER, 0, NULL); + deny_db = gdbm_open ("/var/lib/popproxy/deny.db", + 0, GDBM_READER, 0, NULL); + if (allow_db) { - allow = dpget (allow_dp, user, -1, 0, -1, NULL); - allow_users = dprnum (allow_dp); - dpclose (allow_dp); + datum allow_fk; + allow = gdbm_exists (allow_db, key); + allow_fk = gdbm_firstkey (allow_db); + if (allow_fk.dptr) + { + allow_users = 1; + free (allow_fk.dptr); + } + gdbm_close (allow_db); } - if (deny_dp) + if (deny_db) { - deny = dpget (deny_dp, user, -1, 0, -1, NULL); - dpclose (deny_dp); - } - if (allow && deny) - { - free (allow); - free (deny); - return ACCESS_DENY; - } - if (allow) - { - free (allow); - return ACCESS_ALLOW; + deny = gdbm_exists (deny_db, key); + gdbm_close (deny_db); } if (deny) - { - free (deny); - return ACCESS_DENY; - } + return ACCESS_DENY; + if (allow) + return ACCESS_ALLOW; if (allow_users == 0) return ACCESS_ALLOW; return ACCESS_DENY; -- 2.20.1