mdb_copy.c 1.77 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
/* mdb_copy.c - memory-mapped database backup tool */
/*
 * Copyright 2012 Howard Chu, Symas Corp.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted only as authorized by the OpenLDAP
 * Public License.
 *
 * A copy of this license is available in the file LICENSE in the
 * top-level directory of the distribution or, alternatively, at
 * <http://www.OpenLDAP.org/license.html>.
 */
Howard Chu's avatar
Howard Chu committed
14
15
16
17
18
19
#ifdef _WIN32
#include <windows.h>
#define	MDB_STDOUT	GetStdHandle(STD_OUTPUT_HANDLE)
#else
#define	MDB_STDOUT	1
#endif
20
21
#include <stdio.h>
#include <stdlib.h>
Howard Chu's avatar
Howard Chu committed
22
#include <signal.h>
Howard Chu's avatar
Howard Chu committed
23
#include "lmdb.h"
24

Howard Chu's avatar
Howard Chu committed
25
26
27
28
29
static void
sighandle(int sig)
{
}

30
31
32
33
int main(int argc,char * argv[])
{
	int rc;
	MDB_env *env;
Hallvard Furuseth's avatar
Hallvard Furuseth committed
34
35
36
37
38
39
	const char *progname = argv[0], *act;
	unsigned flags = MDB_RDONLY;

	for (; argc > 1 && argv[1][0] == '-'; argc--, argv++) {
		if (argv[1][1] == 'n' && argv[1][2] == '\0')
			flags |= MDB_NOSUBDIR;
Howard Chu's avatar
Howard Chu committed
40
41
42
43
		else if (argv[1][1] == 'V' && argv[1][2] == '\0') {
			printf("%s\n", MDB_VERSION_STRING);
			exit(0);
		} else
Hallvard Furuseth's avatar
Hallvard Furuseth committed
44
45
			argc = 0;
	}
46

Howard Chu's avatar
Howard Chu committed
47
	if (argc<2 || argc>3) {
Howard Chu's avatar
Howard Chu committed
48
		fprintf(stderr, "usage: %s [-V] [-n] srcpath [dstpath]\n", progname);
49
50
51
		exit(EXIT_FAILURE);
	}

Howard Chu's avatar
Howard Chu committed
52
53
54
55
56
57
58
59
60
#ifdef SIGPIPE
	signal(SIGPIPE, sighandle);
#endif
#ifdef SIGHUP
	signal(SIGHUP, sighandle);
#endif
	signal(SIGINT, sighandle);
	signal(SIGTERM, sighandle);

Hallvard Furuseth's avatar
Hallvard Furuseth committed
61
	act = "opening environment";
62
	rc = mdb_env_create(&env);
Hallvard Furuseth's avatar
Hallvard Furuseth committed
63
64
65
66
67
	if (rc == MDB_SUCCESS) {
		rc = mdb_env_open(env, argv[1], flags, 0);
	}
	if (rc == MDB_SUCCESS) {
		act = "copying";
Howard Chu's avatar
Howard Chu committed
68
		if (argc == 2)
Howard Chu's avatar
Howard Chu committed
69
			rc = mdb_env_copyfd(env, MDB_STDOUT);
Howard Chu's avatar
Howard Chu committed
70
71
		else
			rc = mdb_env_copy(env, argv[2]);
72
	}
Hallvard Furuseth's avatar
Hallvard Furuseth committed
73
74
75
	if (rc)
		fprintf(stderr, "%s: %s failed, error %d (%s)\n",
			progname, act, rc, mdb_strerror(rc));
76
77
78
79
	mdb_env_close(env);

	return rc ? EXIT_FAILURE : EXIT_SUCCESS;
}