aboutsummaryrefslogtreecommitdiff
path: root/src/gdbm_load.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/gdbm_load.c')
-rw-r--r--src/gdbm_load.c47
1 files changed, 45 insertions, 2 deletions
diff --git a/src/gdbm_load.c b/src/gdbm_load.c
index 7746b1b..20942dc 100644
--- a/src/gdbm_load.c
+++ b/src/gdbm_load.c
@@ -36,6 +36,9 @@ struct gdbm_option optab[] = {
{ 'm', "mode", N_("MODE"), N_("set file mode") },
{ 'u', "user", N_("NAME|UID[:NAME|GID]"), N_("set file owner") },
{ 'n', "no-meta", NULL, N_("do not attempt to set file meta-data") },
+ { 'M', "mmap", NULL, N_("use memory mapping") },
+ { 'c', "cache-size", N_("NUM"), N_("set the cache size") },
+ { 'b', "block-size", N_("NUM"), N_("set the block size") },
{ 0 }
};
@@ -63,6 +66,27 @@ set_meta_info (GDBM_FILE dbf)
return 0;
}
+static int
+get_int (const char *arg)
+{
+ char *p;
+ long n;
+
+ errno = 0;
+ n = strtol (arg, &p, 0);
+ if (*p)
+ {
+ error (_("invalid number: %s"), arg);
+ exit (EXIT_USAGE);
+ }
+ if (errno)
+ {
+ error (_("invalid number: %s: %s"), arg, strerror (errno));
+ exit (EXIT_USAGE);
+ }
+ return n;
+}
+
int
main (int argc, char **argv)
{
@@ -72,6 +96,9 @@ main (int argc, char **argv)
FILE *fp;
unsigned long err_line, n;
char *end;
+ int oflags = GDBM_NEWDB|GDBM_NOMMAP;
+ int cache_size = 0;
+ int block_size = 0;
#ifdef HAVE_SETLOCALE
setlocale (LC_ALL, "");
@@ -87,6 +114,14 @@ main (int argc, char **argv)
{
switch (opt)
{
+ case 'b':
+ block_size = get_int (optarg);
+ break;
+
+ case 'c':
+ cache_size = get_int (optarg);
+ break;
+
case 'm':
{
errno = 0;
@@ -171,6 +206,10 @@ main (int argc, char **argv)
case 'n':
no_meta_option = 1;
break;
+
+ case 'M':
+ oflags &= ~GDBM_NOMMAP;
+ break;
default:
error (_("unknown option"));
@@ -216,12 +255,16 @@ main (int argc, char **argv)
if (dbname)
{
- dbf = gdbm_open (dbname, 0, GDBM_NEWDB, 0600, NULL);
+ dbf = gdbm_open (dbname, block_size, oflags, 0600, NULL);
if (!dbf)
{
gdbm_perror (_("gdbm_open failed"));
exit (EXIT_FATAL);
}
+
+ if (cache_size &&
+ gdbm_setopt (dbf, GDBM_SETCACHESIZE, &cache_size, sizeof (int)) == -1)
+ error (_("gdbm_setopt failed: %s"), gdbm_strerror (gdbm_errno));
}
rc = gdbm_load_from_file (&dbf, fp, replace,
@@ -248,7 +291,7 @@ main (int argc, char **argv)
rc = EXIT_FATAL;
}
}
-
+
if (dbf)
{
if (!no_meta_option && set_meta_info (dbf))

Return to:

Send suggestions and report system problems to the System administrator.