xref: /netbsd-src/external/bsd/openldap/dist/servers/slapd/slapcat.c (revision 27fd3f6531803adac12382d7643a9a492b576601)
1 /* $OpenLDAP: pkg/ldap/servers/slapd/slapcat.c,v 1.7.2.6 2008/04/14 18:45:07 quanah Exp $ */
2 /* This work is part of OpenLDAP Software <http://www.openldap.org/>.
3  *
4  * Copyright 1998-2008 The OpenLDAP Foundation.
5  * Portions Copyright 1998-2003 Kurt D. Zeilenga.
6  * Portions Copyright 2003 IBM Corporation.
7  * All rights reserved.
8  *
9  * Redistribution and use in source and binary forms, with or without
10  * modification, are permitted only as authorized by the OpenLDAP
11  * Public License.
12  *
13  * A copy of this license is available in file LICENSE in the
14  * top-level directory of the distribution or, alternatively, at
15  * <http://www.OpenLDAP.org/license.html>.
16  */
17 /* ACKNOWLEDGEMENTS:
18  * This work was initially developed by Kurt Zeilenga for inclusion
19  * in OpenLDAP Software.  Additional signficant contributors include
20  *    Jong Hyuk Choi
21  */
22 
23 #include "portable.h"
24 
25 #include <stdio.h>
26 
27 #include <ac/stdlib.h>
28 #include <ac/ctype.h>
29 #include <ac/socket.h>
30 #include <ac/string.h>
31 
32 #include "slapcommon.h"
33 #include "ldif.h"
34 
35 static volatile sig_atomic_t gotsig;
36 
37 static RETSIGTYPE
38 slapcat_sig( int sig )
39 {
40 	gotsig=1;
41 }
42 
43 int
44 slapcat( int argc, char **argv )
45 {
46 	ID id;
47 	int rc = EXIT_SUCCESS;
48 	Operation op = {0};
49 	const char *progname = "slapcat";
50 
51 	slap_tool_init( progname, SLAPCAT, argc, argv );
52 
53 #ifdef SIGPIPE
54 	(void) SIGNAL( SIGPIPE, slapcat_sig );
55 #endif
56 #ifdef SIGHUP
57 	(void) SIGNAL( SIGHUP, slapcat_sig );
58 #endif
59 	(void) SIGNAL( SIGINT, slapcat_sig );
60 	(void) SIGNAL( SIGTERM, slapcat_sig );
61 
62 	if( !be->be_entry_open ||
63 		!be->be_entry_close ||
64 		!be->be_entry_first ||
65 		!be->be_entry_next ||
66 		!be->be_entry_get )
67 	{
68 		fprintf( stderr, "%s: database doesn't support necessary operations.\n",
69 			progname );
70 		exit( EXIT_FAILURE );
71 	}
72 
73 	if( be->be_entry_open( be, 0 ) != 0 ) {
74 		fprintf( stderr, "%s: could not open database.\n",
75 			progname );
76 		exit( EXIT_FAILURE );
77 	}
78 
79 	op.o_bd = be;
80 	for ( id = be->be_entry_first( be );
81 		id != NOID;
82 		id = be->be_entry_next( be ) )
83 	{
84 		char *data;
85 		int len;
86 		Entry* e;
87 
88 		if ( gotsig )
89 			break;
90 
91 		e = be->be_entry_get( be, id );
92 		if ( e == NULL ) {
93 			printf("# no data for entry id=%08lx\n\n", (long) id );
94 			rc = EXIT_FAILURE;
95 			if( continuemode ) continue;
96 			break;
97 		}
98 
99 		if( sub_ndn.bv_len && !dnIsSuffix( &e->e_nname, &sub_ndn ) ) {
100 			be_entry_release_r( &op, e );
101 			continue;
102 		}
103 
104 		if( filter != NULL ) {
105 			int rc = test_filter( NULL, e, filter );
106 			if( rc != LDAP_COMPARE_TRUE ) {
107 				be_entry_release_r( &op, e );
108 				continue;
109 			}
110 		}
111 
112 		if( verbose ) {
113 			printf( "# id=%08lx\n", (long) id );
114 		}
115 
116 		data = entry2str( e, &len );
117 		be_entry_release_r( &op, e );
118 
119 		if ( data == NULL ) {
120 			printf("# bad data for entry id=%08lx\n\n", (long) id );
121 			rc = EXIT_FAILURE;
122 			if( continuemode ) continue;
123 			break;
124 		}
125 
126 		if ( fputs( data, ldiffp->fp ) == EOF ||
127 			fputs( "\n", ldiffp->fp ) == EOF ) {
128 			fprintf(stderr, "%s: error writing output.\n",
129 				progname);
130 			rc = EXIT_FAILURE;
131 			break;
132 		}
133 	}
134 
135 	be->be_entry_close( be );
136 
137 	slap_tool_destroy();
138 	return rc;
139 }
140