Imported Upstream version 1.11
[platform/upstream/gdbm.git] / src / gdbm_dump.c
1 /* This file is part of GDBM, the GNU data base manager.
2    Copyright (C) 2011, 2013 Free Software Foundation, Inc.
3
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)
7    any later version.
8
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.
13
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/>.   */
16
17 # include "autoconf.h"
18 # include "gdbm.h"
19 # include "gdbmapp.h"
20 # include "gdbmdefs.h"
21
22 char *parseopt_program_doc = "dump a GDBM database to a file";
23 char *parseopt_program_args = "DB_FILE [FILE]";
24 struct gdbm_option optab[] = {
25   { 'H', "format", "binary|ascii|0|1", N_("select dump format") },
26   { 0 }
27 };
28
29 int format = GDBM_DUMP_FMT_ASCII;
30
31 int
32 main (int argc, char **argv)
33 {
34   GDBM_FILE dbf;
35   int rc, opt;
36   char *dbname, *filename;
37   FILE *fp;
38
39 #ifdef HAVE_SETLOCALE
40   setlocale (LC_ALL, "");
41 #endif
42   bindtextdomain (PACKAGE, LOCALEDIR);
43   textdomain (PACKAGE);
44
45   set_progname (argv[0]);
46
47   for (opt = parseopt_first (argc, argv, optab);
48        opt != EOF;
49        opt = parseopt_next ())
50     {
51     switch (opt)
52       {
53       case 'H':
54         if (strcmp (optarg, "binary") == 0)
55           format = GDBM_DUMP_FMT_BINARY;
56         else if (strcmp (optarg, "ascii") == 0)
57           format = GDBM_DUMP_FMT_ASCII;
58         else
59           {
60             format = atoi (optarg);
61             switch (format)
62               {
63               case GDBM_DUMP_FMT_BINARY:
64               case GDBM_DUMP_FMT_ASCII:
65                 break;
66               default:
67                 error (_("unknown dump format"));
68                 exit (EXIT_USAGE);
69               }
70           }
71         break;
72         
73       default:
74         error (_("unknown option"));
75         exit (EXIT_USAGE);
76       }
77     }
78
79   argc -= optind;
80   argv += optind;
81
82   if (argc == 0)
83     {
84       parseopt_print_help ();
85       exit (EXIT_OK);
86     }
87
88   if (argc > 2)
89     {
90       error (_("too many arguments; try `%s -h' for more info"), progname);
91       exit (EXIT_USAGE);
92     }
93   
94   dbname = argv[0];
95   if (argc == 2)
96     filename = argv[1];
97   else
98     filename = NULL;
99
100   if (!filename || strcmp (filename, "-") == 0)
101     {
102       filename = "<stdout>";
103       fp = stdout;
104     }
105   else
106     {
107       fp = fopen (filename, "w");
108       if (!fp)
109         {
110           sys_perror (errno, _("cannot open %s"), filename);
111           exit (EXIT_FATAL);
112         }
113     }
114
115   dbf = gdbm_open (dbname, 0, GDBM_READER, 0600, NULL);
116   if (!dbf)
117     {
118       gdbm_perror (_("gdbm_open failed"));
119       exit (EXIT_FATAL);
120     }
121
122   rc = gdbm_dump_to_file (dbf, fp, format);
123   if (rc)
124     {
125       gdbm_perror (_("dump error"), filename);
126     }
127   
128   gdbm_close (dbf);
129
130   exit (rc ? EXIT_OK : EXIT_FATAL);
131 }
132