X-Git-Url: http://git.meshlink.io/?a=blobdiff_plain;f=avahi-utils%2Fstdb.c;h=6602c97190587398299206fb4b0a5be2ee316b6e;hb=f423ed6e93e4becc756e9ec9d1a9c10ed0b49016;hp=388bf6b508860a0dd597e4405fd775c475ff637b;hpb=b7d566fc3ec60c0fbbca22af273bc67fdc1372fa;p=catta diff --git a/avahi-utils/stdb.c b/avahi-utils/stdb.c index 388bf6b..6602c97 100644 --- a/avahi-utils/stdb.c +++ b/avahi-utils/stdb.c @@ -1,18 +1,16 @@ -/* $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 @@ -43,6 +41,7 @@ static GDBM_FILE gdbm_file = NULL; static DBM *dbm_file = NULL; #endif static char *buffer = NULL; +static char *enum_key = NULL; static int init(void) { @@ -73,10 +72,10 @@ 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); @@ -90,7 +89,7 @@ const char* stdb_lookup(const char *name) { 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); @@ -138,9 +137,9 @@ 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; @@ -150,11 +149,64 @@ 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; }