]> git.sur5r.net Git - openldap/commitdiff
Lastmod attributes
authorKurt Zeilenga <kurt@openldap.org>
Thu, 29 Aug 2002 03:50:22 +0000 (03:50 +0000)
committerKurt Zeilenga <kurt@openldap.org>
Thu, 29 Aug 2002 03:50:22 +0000 (03:50 +0000)
servers/slapd/tools/Makefile.in
servers/slapd/tools/slapadd.c

index 1e8f1525d345e777f4a1af068084319f890dd7b8..98d17978e97cb4706655aa3c25cb349963bcc870 100644 (file)
@@ -34,7 +34,7 @@ PROGRAMS=slapadd slapcat slapindex slappasswd
 SRCS = mimic.c slapcommon.c \
        slapadd.c slapcat.c slapindex.c slappasswd.c
 
-SLAPD_OBJS = ../config.o ../ch_malloc.o ../backend.o ../charray.o \
+SLAPD_OBJS = ../config.o ../ch_malloc.o ../backend.o \
                ../module.o ../aclparse.o ../filterentry.o ../schema.o \
                ../schema_check.o ../schema_init.o ../schema_prep.o \
                ../schemaparse.o ../ad.o ../at.o ../mr.o ../oc.o \
index 771012774028b89b2c7c634084196d32b5c7cf90..e993da5fa8fb9f35aab4c156f8a537dd1887114d 100644 (file)
@@ -16,6 +16,7 @@
 
 #include <lber.h>
 #include <ldif.h>
+#include <lutil.h>
 
 #include "slapcommon.h"
 
@@ -99,7 +100,7 @@ main( int argc, char **argv )
                        break;
                }
 
-               {
+               if( global_schemacheck ) {
                        Attribute *sc = attr_find( e->e_attrs,
                                slap_schema.si_ad_structuralObjectClass );
                        Attribute *oc = attr_find( e->e_attrs,
@@ -118,13 +119,12 @@ main( int argc, char **argv )
                        if( sc == NULL ) {
                                struct berval vals[2];
 
-                               /* int ret = */ 
-                                       structural_class( oc->a_vals, vals,
+                               rc = structural_class( oc->a_vals, vals,
                                        NULL, &text, textbuf, textlen );
 
-                               if( vals[0].bv_len == 0 ) {
-                                       fprintf( stderr, "%s: dn=\"%s\" (line=%d): %s\n",
-                                       progname, e->e_dn, lineno, text );
+                               if( rc != LDAP_SUCCESS ) {
+                                       fprintf( stderr, "%s: dn=\"%s\" (line=%d): (%d) %s\n",
+                                               progname, e->e_dn, lineno, rc, text );
                                        rc = EXIT_FAILURE;
                                        entry_free( e );
                                        if( continuemode ) continue;
@@ -135,16 +135,13 @@ main( int argc, char **argv )
                                attr_merge( e, slap_schema.si_ad_structuralObjectClass,
                                        vals );
                        }
-               }
 
-               if( global_schemacheck ) {
                        /* check schema */
-
                        rc = entry_schema_check( be, e, NULL, &text, textbuf, textlen );
 
                        if( rc != LDAP_SUCCESS ) {
-                               fprintf( stderr, "%s: dn=\"%s\" (line=%d): %s\n",
-                                       progname, e->e_dn, lineno, text );
+                               fprintf( stderr, "%s: dn=\"%s\" (line=%d): (%d) %s\n",
+                                       progname, e->e_dn, lineno, rc, text );
                                rc = EXIT_FAILURE;
                                entry_free( e );
                                if( continuemode ) continue;
@@ -152,6 +149,88 @@ main( int argc, char **argv )
                        }
                }
 
+               if ( SLAP_LASTMOD(be) ) {
+                       struct tm *ltm;
+                       time_t now = slap_get_time();
+                       char uuidbuf[40];
+                       struct berval vals[2];
+
+                       struct berval name, timestamp, csn;
+                       char timebuf[22];
+                       char csnbuf[64];
+
+                       ltm = gmtime(&now);
+                       lutil_gentime( timebuf, sizeof(timebuf), ltm );
+
+                       csn.bv_len = lutil_csnstr( csnbuf, sizeof( csnbuf ), 0, 0 );
+                       csn.bv_val = csnbuf;
+
+                       timestamp.bv_val = timebuf;
+                       timestamp.bv_len = strlen(timebuf);
+
+                       if ( be->be_rootndn.bv_len == 0 ) {
+                               name.bv_val = SLAPD_ANONYMOUS;
+                               name.bv_len = sizeof(SLAPD_ANONYMOUS) - 1;
+                       } else {
+                               name = be->be_rootndn;
+                       }
+
+                       if( attr_find( e->e_attrs, slap_schema.si_ad_entryUUID )
+                               == NULL )
+                       {
+                               vals[0].bv_len = lutil_uuidstr( uuidbuf, sizeof( uuidbuf ) );
+                               vals[0].bv_val = uuidbuf;
+                               vals[1].bv_len = 0;
+                               vals[1].bv_val = NULL;
+                               attr_merge( e, slap_schema.si_ad_entryUUID, vals );
+                       }
+
+                       if( attr_find( e->e_attrs, slap_schema.si_ad_creatorsName )
+                               == NULL )
+                       {
+                               ber_dupbv( &vals[0], &name );
+                               vals[1].bv_len = 0;
+                               vals[1].bv_val = NULL;
+                               attr_merge( e, slap_schema.si_ad_creatorsName, vals);
+                       }
+
+                       if( attr_find( e->e_attrs, slap_schema.si_ad_modifiersName )
+                               == NULL )
+                       {
+                               ber_dupbv( &vals[0], &name );
+                               vals[1].bv_len = 0;
+                               vals[1].bv_val = NULL;
+                               attr_merge( e, slap_schema.si_ad_modifiersName, vals);
+                       }
+
+                       if( attr_find( e->e_attrs, slap_schema.si_ad_createTimestamp )
+                               == NULL )
+                       {
+                               ber_dupbv( &vals[0], &timestamp );
+                               vals[1].bv_len = 0;
+                               vals[1].bv_val = NULL;
+                               attr_merge( e, slap_schema.si_ad_createTimestamp, vals );
+                       }
+
+                       if( attr_find( e->e_attrs, slap_schema.si_ad_modifyTimestamp )
+                               == NULL )
+                       {
+                               ber_dupbv( &vals[0], &timestamp );
+                               vals[1].bv_len = 0;
+                               vals[1].bv_val = NULL;
+                               attr_merge( e, slap_schema.si_ad_modifyTimestamp, vals );
+                       }
+
+                       if( attr_find( e->e_attrs, slap_schema.si_ad_entryCSN )
+                               == NULL )
+                       {
+                               ber_dupbv( &vals[0], &csn );
+                               vals[1].bv_len = 0;
+                               vals[1].bv_val = NULL;
+                               attr_merge( e, slap_schema.si_ad_entryCSN, vals );
+                       }
+               }
+
                if (!dryrun) {
                        ID id = be->be_entry_put( be, e, &bvtext );
                        if( id == NOID ) {