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