slapschema.c 3.6 KB
Newer Older
Quanah Gibson-Mount's avatar
Quanah Gibson-Mount committed
1
2
3
/* $OpenLDAP$ */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
 *
Quanah Gibson-Mount's avatar
Quanah Gibson-Mount committed
4
 * Copyright 1998-2019 The OpenLDAP Foundation.
Quanah Gibson-Mount's avatar
Quanah Gibson-Mount committed
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
 * Portions Copyright 1998-2003 Kurt D. Zeilenga.
 * Portions Copyright 2003 IBM Corporation.
 * 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 file LICENSE in the
 * top-level directory of the distribution or, alternatively, at
 * <http://www.OpenLDAP.org/license.html>.
 */
/* ACKNOWLEDGEMENTS:
 * This work was initially developed by Pierangelo Masarati for inclusion
 * in OpenLDAP Software.  Code portions borrowed from slapcat.c;
 * contributors are Kurt Zeilenga and Jong Hyuk Choi
 */

#include "portable.h"

#include <stdio.h>

#include "ac/stdlib.h"
#include "ac/ctype.h"
#include "ac/socket.h"
#include "ac/string.h"

#include "slapcommon.h"
#include "ldif.h"

static volatile sig_atomic_t gotsig;

static RETSIGTYPE
slapcat_sig( int sig )
{
	gotsig=1;
}

int
slapschema( int argc, char **argv )
{
	ID id;
	int rc = EXIT_SUCCESS;
	const char *progname = "slapschema";
	Connection conn = { 0 };
	OperationBuffer	opbuf;
	Operation *op = NULL;
Quanah Gibson-Mount's avatar
Quanah Gibson-Mount committed
52
	void *thrctx;
Quanah Gibson-Mount's avatar
Quanah Gibson-Mount committed
53
54
	int requestBSF = 0;
	int doBSF = 0;
Quanah Gibson-Mount's avatar
Quanah Gibson-Mount committed
55
56
57

	slap_tool_init( progname, SLAPCAT, argc, argv );

Quanah Gibson-Mount's avatar
Quanah Gibson-Mount committed
58
59
	requestBSF = ( sub_ndn.bv_len || filter );

Quanah Gibson-Mount's avatar
Quanah Gibson-Mount committed
60
61
62
63
64
65
66
67
68
69
70
#ifdef SIGPIPE
	(void) SIGNAL( SIGPIPE, slapcat_sig );
#endif
#ifdef SIGHUP
	(void) SIGNAL( SIGHUP, slapcat_sig );
#endif
	(void) SIGNAL( SIGINT, slapcat_sig );
	(void) SIGNAL( SIGTERM, slapcat_sig );

	if( !be->be_entry_open ||
		!be->be_entry_close ||
Quanah Gibson-Mount's avatar
Quanah Gibson-Mount committed
71
		!( be->be_entry_first || be->be_entry_first_x ) ||
Quanah Gibson-Mount's avatar
Quanah Gibson-Mount committed
72
73
74
75
76
77
78
79
80
81
82
83
84
85
		!be->be_entry_next ||
		!be->be_entry_get )
	{
		fprintf( stderr, "%s: database doesn't support necessary operations.\n",
			progname );
		exit( EXIT_FAILURE );
	}

	if( be->be_entry_open( be, 0 ) != 0 ) {
		fprintf( stderr, "%s: could not open database.\n",
			progname );
		exit( EXIT_FAILURE );
	}

Quanah Gibson-Mount's avatar
Quanah Gibson-Mount committed
86
87
	thrctx = ldap_pvt_thread_pool_context();
	connection_fake_init( &conn, &opbuf, thrctx );
Quanah Gibson-Mount's avatar
Quanah Gibson-Mount committed
88
89
90
91
	op = &opbuf.ob_op;
	op->o_tmpmemctx = NULL;
	op->o_bd = be;

Quanah Gibson-Mount's avatar
Quanah Gibson-Mount committed
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108

	if ( !requestBSF && be->be_entry_first ) {
		id = be->be_entry_first( be );

	} else {
		if ( be->be_entry_first_x ) {
			id = be->be_entry_first_x( be,
				sub_ndn.bv_len ? &sub_ndn : NULL, scope, filter );

		} else {
			assert( be->be_entry_first != NULL );
			doBSF = 1;
			id = be->be_entry_first( be );
		}
	}

	for ( ; id != NOID; id = be->be_entry_next( be ) ) {
Quanah Gibson-Mount's avatar
Quanah Gibson-Mount committed
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
		Entry* e;
		char textbuf[SLAP_TEXT_BUFLEN];
		size_t textlen = sizeof(textbuf);
		const char *text = NULL;

		if ( gotsig )
			break;

		e = be->be_entry_get( be, id );
		if ( e == NULL ) {
			printf("# no data for entry id=%08lx\n\n", (long) id );
			rc = EXIT_FAILURE;
			if( continuemode ) continue;
			break;
		}

Quanah Gibson-Mount's avatar
Quanah Gibson-Mount committed
125
126
127
		if ( doBSF ) {
			if ( sub_ndn.bv_len && !dnIsSuffixScope( &e->e_nname, &sub_ndn, scope ) )
			{
Quanah Gibson-Mount's avatar
Quanah Gibson-Mount committed
128
129
130
				be_entry_release_r( op, e );
				continue;
			}
Quanah Gibson-Mount's avatar
Quanah Gibson-Mount committed
131
132
133
134
135
136
137
138
139


			if ( filter != NULL ) {
				int rc = test_filter( NULL, e, filter );
				if ( rc != LDAP_COMPARE_TRUE ) {
					be_entry_release_r( op, e );
					continue;
				}
			}
Quanah Gibson-Mount's avatar
Quanah Gibson-Mount committed
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
		}

		if( verbose ) {
			printf( "# id=%08lx\n", (long) id );
		}

		rc = entry_schema_check( op, e, NULL, 0, 0, NULL,
			&text, textbuf, textlen );
		if ( rc != LDAP_SUCCESS ) {
			fprintf( ldiffp->fp, "# (%d) %s%s%s\n",
				rc, ldap_err2string( rc ),
				text ? ": " : "",
				text ? text : "" );
			fprintf( ldiffp->fp, "dn: %s\n\n", e->e_name.bv_val );
		}

		be_entry_release_r( op, e );
	}

	be->be_entry_close( be );

	if ( slap_tool_destroy() )
		rc = EXIT_FAILURE;

	return rc;
}