aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog8
-rw-r--r--doc/gdbm.texinfo26
-rw-r--r--src/gdbm.h.in18
-rw-r--r--src/gdbmsetopt.c18
4 files changed, 60 insertions, 10 deletions
diff --git a/ChangeLog b/ChangeLog
index f7a97c6..5337f5c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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;

Return to:

Send suggestions and report system problems to the System administrator.