]> git.sur5r.net Git - openldap/commitdiff
Import ITS#3764 from HEAD
authorHoward Chu <hyc@openldap.org>
Fri, 10 Jun 2005 20:21:00 +0000 (20:21 +0000)
committerHoward Chu <hyc@openldap.org>
Fri, 10 Jun 2005 20:21:00 +0000 (20:21 +0000)
CHANGES
servers/slapd/slapcat.c

diff --git a/CHANGES b/CHANGES
index 92fc963e440414d1e69ea2bfed2ec2848ed0d2c4..8eda784aed164a14e995bc8c621c8d115a2b0447 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -11,6 +11,7 @@ OpenLDAP 2.2.27 Engineering
        Fixed ACL dn=* <what> clause
        Fixed ACL val default style parsing crasher (ITS#3700)
        Disabled slapd broken undocumented configuration directive
+       Fixed slapcat unclean exits (ITS#3764)
        Fixed libldap sasl connection assert (ITS#3278)
        Build Environment
                Improved thread set stack size support (ITS#3691)
index 38602835c76525b954cceda7b595ff5d1cd400d0..f8b89c93065dc5c77f71f288913a68c450380dff 100644 (file)
 
 #include "slapcommon.h"
 
+static int gotsig;
+
+static RETSIGTYPE
+slapcat_sig( int sig )
+{
+       gotsig=1;
+}
+
 int
 slapcat( int argc, char **argv )
 {
@@ -41,6 +49,15 @@ slapcat( int argc, char **argv )
 
        slap_tool_init( progname, SLAPCAT, argc, argv );
 
+#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 ||
                !be->be_entry_first ||
@@ -58,15 +75,19 @@ slapcat( int argc, char **argv )
                exit( EXIT_FAILURE );
        }
 
+       op.o_bd = be;
        for ( id = be->be_entry_first( be );
                id != NOID;
                id = be->be_entry_next( be ) )
        {
                char *data;
                int len;
-               Entry* e = be->be_entry_get( be, id );
-               op.o_bd = be;
+               Entry* e;
+
+               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;