#include "slap.h"
#include "ldap_pvt.h"
+#include "lutil.h"
#if defined( SLAPD_SCHEMA_DN )
= slap_schema.si_ad_structuralObjectClass;
AttributeDescription *ad_objectClass
= slap_schema.si_ad_objectClass;
+ AttributeDescription *ad_createTimestamp
+ = slap_schema.si_ad_createTimestamp;
+ AttributeDescription *ad_modifyTimestamp
+ = slap_schema.si_ad_modifyTimestamp;
Entry *e;
- struct berval vals[2];
-
- vals[1].bv_val = NULL;
+ struct berval vals[5];
e = (Entry *) ch_calloc( 1, sizeof(Entry) );
vals[0].bv_val = "subentry";
vals[0].bv_len = sizeof("subentry")-1;
- attr_merge( e, ad_structuralObjectClass, vals );
+ attr_merge_one( e, ad_structuralObjectClass, vals );
vals[0].bv_val = "top";
vals[0].bv_len = sizeof("top")-1;
- attr_merge( e, ad_objectClass, vals );
-
- vals[0].bv_val = "subentry";
- vals[0].bv_len = sizeof("subentry")-1;
- attr_merge( e, ad_objectClass, vals );
-
- vals[0].bv_val = "subschema";
- vals[0].bv_len = sizeof("subschema")-1;
- attr_merge( e, ad_objectClass, vals );
-
- vals[0].bv_val = "extensibleObject";
- vals[0].bv_len = sizeof("extensibleObject")-1;
+ vals[1].bv_val = "subentry";
+ vals[1].bv_len = sizeof("subentry")-1;
+ vals[2].bv_val = "subschema";
+ vals[2].bv_len = sizeof("subschema")-1;
+ vals[3].bv_val = "extensibleObject";
+ vals[3].bv_len = sizeof("extensibleObject")-1;
+ vals[4].bv_val = NULL;
attr_merge( e, ad_objectClass, vals );
{
return LDAP_OTHER;
}
- attr_merge( e, desc, vals );
+ attr_merge_one( e, desc, vals );
+ }
+
+ {
+ 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 );
+
+ attr_merge_one( e, ad_createTimestamp, vals );
+ attr_merge_one( e, ad_modifyTimestamp, vals );
}
if ( syn_schema_info( e )