1 /* This file is part of GDBM, the GNU data base manager.
2 Copyright (C) 2011, 2013 Free Software Foundation, Inc.
4 GDBM is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 3, or (at your option)
9 GDBM is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with GDBM. If not, see <http://www.gnu.org/licenses/>. */
17 # include "autoconf.h"
20 # include "gdbmdefs.h"
32 char *parseopt_program_doc = "load a GDBM database from a file";
33 char *parseopt_program_args = "FILE [DB_FILE]";
34 struct gdbm_option optab[] = {
35 { 'r', "replace", NULL, N_("replace records in the existing database") },
36 { 'm', "mode", N_("MODE"), N_("set file mode") },
37 { 'u', "user", N_("NAME|UID[:NAME|GID]"), N_("set file owner") },
38 { 'n', "no-meta", NULL, N_("do not attempt to set file meta-data") },
39 { 'M', "mmap", NULL, N_("use memory mapping") },
40 { 'c', "cache-size", N_("NUM"), N_("set the cache size") },
41 { 'b', "block-size", N_("NUM"), N_("set the block size") },
46 set_meta_info (GDBM_FILE dbf)
50 int fd = gdbm_fdesc (dbf);
52 if (meta_mask & GDBM_META_MASK_OWNER)
54 if (fchown (fd, owner_uid, owner_gid))
56 gdbm_errno = GDBM_ERR_FILE_OWNER;
60 if ((meta_mask & GDBM_META_MASK_MODE) && fchmod (fd, mode))
62 gdbm_errno = GDBM_ERR_FILE_OWNER;
70 get_int (const char *arg)
76 n = strtol (arg, &p, 0);
79 error (_("invalid number: %s"), arg);
84 error (_("invalid number: %s: %s"), arg, strerror (errno));
91 main (int argc, char **argv)
95 char *dbname, *filename;
97 unsigned long err_line, n;
99 int oflags = GDBM_NEWDB|GDBM_NOMMAP;
103 #ifdef HAVE_SETLOCALE
104 setlocale (LC_ALL, "");
106 bindtextdomain (PACKAGE, LOCALEDIR);
107 textdomain (PACKAGE);
109 set_progname (argv[0]);
111 for (opt = parseopt_first (argc, argv, optab);
113 opt = parseopt_next ())
118 block_size = get_int (optarg);
122 cache_size = get_int (optarg);
128 n = strtoul (optarg, &end, 8);
129 if (*end == 0 && errno == 0)
132 meta_mask |= GDBM_META_MASK_MODE;
136 error ("%s", _("invalid octal number"));
147 len = strcspn (optarg, ".:");
150 pw = getpwnam (optarg);
152 owner_uid = pw->pw_uid;
156 n = strtoul (optarg, &end, 10);
157 if (*end == 0 && errno == 0)
161 error (_("invalid user name: %s"), optarg);
168 char *grname = optarg + len;
169 struct group *gr = getgrnam (grname);
171 owner_gid = gr->gr_gid;
175 n = strtoul (grname, &end, 10);
176 if (*end == 0 && errno == 0)
180 error (_("invalid group name: %s"), grname);
189 pw = getpwuid (owner_uid);
192 error (_("no such UID: %lu"), (unsigned long)owner_uid);
196 owner_gid = pw->pw_gid;
198 meta_mask |= GDBM_META_MASK_OWNER;
211 oflags &= ~GDBM_NOMMAP;
215 error (_("unknown option"));
225 parseopt_print_help ();
231 error (_("too many arguments; try `%s -h' for more info"), progname);
241 if (strcmp (filename, "-") == 0)
243 filename = "<stdin>";
248 fp = fopen (filename, "r");
251 sys_perror (errno, _("cannot open %s"), filename);
258 dbf = gdbm_open (dbname, block_size, oflags, 0600, NULL);
261 gdbm_perror (_("gdbm_open failed"));
266 gdbm_setopt (dbf, GDBM_SETCACHESIZE, &cache_size, sizeof (int)) == -1)
267 error (_("gdbm_setopt failed: %s"), gdbm_strerror (gdbm_errno));
270 rc = gdbm_load_from_file (&dbf, fp, replace,
272 (GDBM_META_MASK_MODE | GDBM_META_MASK_OWNER) :
279 case GDBM_ERR_FILE_OWNER:
280 case GDBM_ERR_FILE_MODE:
281 error (_("error restoring metadata: %s (%s)"),
282 gdbm_strerror (gdbm_errno), strerror (errno));
288 gdbm_perror ("%s:%lu", filename, err_line);
290 gdbm_perror (_("cannot load from %s"), filename);
297 if (!no_meta_option && set_meta_info (dbf))
299 error (_("error restoring metadata: %s (%s)"),
300 gdbm_strerror (gdbm_errno), strerror (errno));
306 if (gdbm_setopt (dbf, GDBM_GETDBNAME, &dbname, sizeof (dbname)))
307 gdbm_perror (_("gdbm_setopt failed"));
310 printf ("%s: created %s\n", progname, dbname);