diff options
-rw-r--r-- | ChangeLog | 8 | ||||
-rw-r--r-- | doc/gdbm.texinfo | 26 | ||||
-rw-r--r-- | src/gdbm.h.in | 18 | ||||
-rw-r--r-- | src/gdbmsetopt.c | 18 |
4 files changed, 60 insertions, 10 deletions
@@ -1,5 +1,13 @@ 2011-08-11 Sergey Poznyakoff <gray@gnu.org.ua> + New option GDBM_GETDBNAME. + + * src/gdbm.h.in (GDBM_GETDBNAME): New option. + * src/gdbmsetopt.c (gdbm_setopt): Handle GDBM_GETDBNAME. + * doc/gdbm.texinfo (Options): Document GDBM_GETDBNAME. + +2011-08-11 Sergey Poznyakoff <gray@gnu.org.ua> + Improve gdbm_setopt interface. * src/gdbm.h.in (GDBM_OPENMASK): New constant. diff --git a/doc/gdbm.texinfo b/doc/gdbm.texinfo index 04efeea..3463b84 100644 --- a/doc/gdbm.texinfo +++ b/doc/gdbm.texinfo @@ -874,6 +874,30 @@ disable it. @item GDBM_GETMMAP Check whether memory mapping is enabled. The @var{value} should point to an integer where to return the status. + +@kwindex GDBM_GETDBNAME +@item GDBM_GETDBNAME +Return the name of the database disk file. The @var{value} should +point to a variable of type @code{char**}. A pointer to the newly +allocated copy of the file name will be placed there. The caller is +responsible for freeing this memory when no longer needed. For +example: + +@example +char *name; + +if (gdbm_setopt (dbf, GDBM_GETDBNAME, &name, sizeof (name))) + @{ + fprintf (stderr, "gdbm_setopt failed: %s\n", + gdbm_strerror (gdbm_errno)); + @} +else + @{ + printf ("database name: %s\n", name); + free (name); + @} +@end example + @end table The return value will be @samp{-1} upon failure, or @samp{0} upon @@ -886,7 +910,7 @@ code could be used: @example @group int value = 10; -ret = gdbm_setopt(dbf, GDBM_CACHESIZE, &value, sizeof(int)); +ret = gdbm_setopt (dbf, GDBM_CACHESIZE, &value, sizeof (int)); @end group @end example diff --git a/src/gdbm.h.in b/src/gdbm.h.in index dbd88a4..52e0373 100644 --- a/src/gdbm.h.in +++ b/src/gdbm.h.in @@ -54,7 +54,7 @@ #define GDBM_SETCENTFREE 4 /* Keep all free blocks in the header. */ #define GDBM_SETCOALESCEBLKS 5 /* Attempt to coalesce free blocks. */ #define GDBM_SETMAXMAPSIZE 6 /* Set maximum mapped memory size */ -#define GDBM_SETMMAP 7 +#define GDBM_SETMMAP 7 /* Toggle mmap mode */ /* Compatibility defines: */ #define GDBM_CACHESIZE GDBM_SETCACHESIZE @@ -62,14 +62,14 @@ #define GDBM_CENTFREE GDBM_SETCENTFREE #define GDBM_COALESCEBLKS GDBM_SETCOALESCEBLKS -#define GDBM_GETFLAGS 8 -#define GDBM_GETMMAP 9 -#define GDBM_GETCACHESIZE 10 -#define GDBM_GETSYNCMODE 11 -#define GDBM_GETCENTFREE 12 -#define GDBM_GETCOALESCEBLKS 13 -#define GDBM_GETMAXMAPSIZE 14 - +#define GDBM_GETFLAGS 8 /* Get gdbm_open flags */ +#define GDBM_GETMMAP 9 /* Get mmap status */ +#define GDBM_GETCACHESIZE 10 /* Get current cache side */ +#define GDBM_GETSYNCMODE 11 /* Get synch mode */ +#define GDBM_GETCENTFREE 12 /* Get "centfree" status */ +#define GDBM_GETCOALESCEBLKS 13 /* Get free block coalesce status */ +#define GDBM_GETMAXMAPSIZE 14 /* Get maximum mapped memory size */ +#define GDBM_GETDBNAME 15 /* Return database file name */ /* The data and key structure. */ typedef struct { diff --git a/src/gdbmsetopt.c b/src/gdbmsetopt.c index 7961304..c31cdd5 100644 --- a/src/gdbmsetopt.c +++ b/src/gdbmsetopt.c @@ -231,6 +231,24 @@ gdbm_setopt (GDBM_FILE dbf, int optflag, void *optval, int optlen) } break; + case GDBM_GETDBNAME: + if (!optval || optlen != sizeof (char*)) + { + gdbm_errno = GDBM_OPT_ILLEGAL; + return -1; + } + else + { + char *p = strdup (dbf->name); + if (!p) + { + gdbm_errno = GDBM_MALLOC_ERROR; + return -1; + } + *(char**) optval = p; + } + break; + default: gdbm_errno = GDBM_OPT_ILLEGAL; return -1; |