X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-utils%2Fstdb.c;h=6602c97190587398299206fb4b0a5be2ee316b6e;hb=7a5b2f69af7d36d6cd4153142f125fa011784e03;hp=53be7766cb5c7959d5ca7327ba7bd756dff0e382;hpb=48f053dc87279e2e3cad561db5b744cbcbf32387;p=catta diff --git a/avahi-utils/stdb.c b/avahi-utils/stdb.c index 53be776..6602c97 100644 --- a/avahi-utils/stdb.c +++ b/avahi-utils/stdb.c @@ -1,25 +1,30 @@ -/* $Id$ */ - /*** This file is part of avahi. - + avahi is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. - + avahi 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 Lesser General Public License for more details. - + You should have received a copy of the GNU Lesser General Public License along with avahi; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. ***/ +#include +#ifdef HAVE_GDBM #include +#endif +#ifdef HAVE_DBM +#include +#include +#endif #include #include #include @@ -29,16 +34,31 @@ #include "stdb.h" +#ifdef HAVE_GDBM static GDBM_FILE gdbm_file = NULL; +#endif +#ifdef HAVE_DBM +static DBM *dbm_file = NULL; +#endif static char *buffer = NULL; +static char *enum_key = NULL; static int init(void) { +#ifdef HAVE_GDBM if (gdbm_file) return 0; if (!(gdbm_file = gdbm_open((char*) DATABASE_FILE, 0, GDBM_READER, 0, NULL))) return -1; +#endif +#ifdef HAVE_DBM + if (dbm_file) + return 0; + + if (!(dbm_file = dbm_open((char*) DATABASE_FILE, O_RDONLY, 0))) + return -1; +#endif return 0; } @@ -52,25 +72,35 @@ const char* stdb_lookup(const char *name) { data.dptr = NULL; data.dsize = 0; - + if ((loc = setlocale(LC_MESSAGES, NULL))) { char k[256]; - + snprintf(k, sizeof(k), "%s[%s]", name, loc); key.dptr = k; key.dsize = strlen(k); +#ifdef HAVE_GDBM data = gdbm_fetch(gdbm_file, key); +#endif +#ifdef HAVE_DBM + data = dbm_fetch(dbm_file, key); +#endif if (!data.dptr) { char l[32], *e; snprintf(l, sizeof(l), "%s", loc); - + if ((e = strchr(l, '@'))) { *e = 0; snprintf(k, sizeof(k), "%s[%s]", name, l); key.dptr = k; key.dsize = strlen(k); +#ifdef HAVE_GDBM data = gdbm_fetch(gdbm_file, key); +#endif +#ifdef HAVE_DBM + data = dbm_fetch(dbm_file, key); +#endif } if (!data.dptr) { @@ -79,7 +109,12 @@ const char* stdb_lookup(const char *name) { snprintf(k, sizeof(k), "%s[%s]", name, l); key.dptr = k; key.dsize = strlen(k); +#ifdef HAVE_GDBM data = gdbm_fetch(gdbm_file, key); +#endif +#ifdef HAVE_DBM + data = dbm_fetch(dbm_file, key); +#endif } } } @@ -88,7 +123,12 @@ const char* stdb_lookup(const char *name) { if (!data.dptr) { key.dptr = (char*) name; key.dsize = strlen(name); +#ifdef HAVE_GDBM data = gdbm_fetch(gdbm_file, key); +#endif +#ifdef HAVE_DBM + data = dbm_fetch(dbm_file, key); +#endif } if (!data.dptr) @@ -97,17 +137,76 @@ const char* stdb_lookup(const char *name) { avahi_free(buffer); buffer = avahi_strndup(data.dptr, data.dsize); free(data.dptr); - + return buffer; - + fail: return name; } void stdb_shutdown(void) { +#ifdef HAVE_GDBM if (gdbm_file) gdbm_close(gdbm_file); + gdbm_file = NULL; +#endif +#ifdef HAVE_DBM + if (dbm_file) + dbm_close(dbm_file); + + dbm_file = NULL; +#endif + avahi_free(buffer); + avahi_free(enum_key); + + buffer = enum_key = NULL; +} + +char *stdb_getent(void) { + datum key; + + if (init() < 0) + return NULL; + + for (;;) { + + if (!enum_key) { +#ifdef HAVE_GDBM + key = gdbm_firstkey(gdbm_file); +#endif +#ifdef HAVE_DBM + key = dbm_firstkey(dbm_file); +#endif + } else { + key.dptr = enum_key; + key.dsize = strlen(enum_key); + +#ifdef HAVE_GDBM + key = gdbm_nextkey(gdbm_file, key); +#endif +#ifdef HAVE_DBM + key = dbm_nextkey(dbm_file); +#endif + } + + avahi_free(enum_key); + enum_key = NULL; + + if (!key.dptr) + return NULL; + + enum_key = avahi_strndup(key.dptr, key.dsize); + free(key.dptr); + + if (!strchr(enum_key, '[')) + return enum_key; + } +} + +void stdb_setent(void) { + avahi_free(enum_key); + enum_key = NULL; }