+ vals[0].bv_val++;
+ vals[0].bv_len = rdn.bv_len - (vals[0].bv_val - rdn.bv_val);
+ rdn.bv_len -= vals[0].bv_len + 1;
+
+ rc = slap_bv2ad( &rdn, &desc, text );
+
+ if( rc != LDAP_SUCCESS ) {
+ entry_free( e );
+ *text = "improperly configured subschema subentry";
+ return LDAP_OTHER;
+ }
+
+ nvals[0].bv_val = strchr( global_schemandn.bv_val, '=' );
+ assert( nvals[0].bv_val );
+ nvals[0].bv_val++;
+ nvals[0].bv_len = global_schemandn.bv_len -
+ (nvals[0].bv_val - global_schemandn.bv_val);
+
+ if( attr_merge_one( e, desc, vals, nvals ) )
+ {
+ /* Out of memory, do something about it */
+ entry_free( e );
+ *text = "out of memory";
+ return LDAP_OTHER;
+ }
+ }
+
+ {
+ struct tm *ltm;
+ char timebuf[ LDAP_LUTIL_GENTIME_BUFSIZE ];
+
+ /*
+ * According to RFC 2251:
+
+ Servers SHOULD provide the attributes createTimestamp and
+ modifyTimestamp in subschema entries, in order to allow clients to
+ maintain their caches of schema information.
+
+ * to be conservative, we declare schema created
+ * AND modified at server startup time ...
+ */
+
+ ldap_pvt_thread_mutex_lock( &gmtime_mutex );
+ ltm = gmtime( &starttime );
+ lutil_gentime( timebuf, sizeof(timebuf), ltm );
+ ldap_pvt_thread_mutex_unlock( &gmtime_mutex );
+
+ vals[0].bv_val = timebuf;
+ vals[0].bv_len = strlen( timebuf );
+
+ if( attr_merge_one( e, ad_createTimestamp, vals, vals ) )
+ {
+ /* Out of memory, do something about it */
+ entry_free( e );
+ *text = "out of memory";
+ return LDAP_OTHER;
+ }
+ if( attr_merge_one( e, ad_modifyTimestamp, vals, vals ) )
+ {
+ /* Out of memory, do something about it */
+ entry_free( e );
+ *text = "out of memory";
+ return LDAP_OTHER;
+ }