/* lastmod.c - returns last modification info */
/* This work is part of OpenLDAP Software <http://www.openldap.org/>.
*
- * Copyright 2004-2005 The OpenLDAP Foundation.
+ * Copyright 2004-2006 The OpenLDAP Foundation.
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
};
static struct m_s {
- char *name;
char *schema;
slap_mask_t flags;
int offset;
} moc[] = {
- { "lastmod", "( 1.3.6.1.4.1.4203.666.3.13"
+ { "( 1.3.6.1.4.1.4203.666.3.13"
"NAME 'lastmod' "
"DESC 'OpenLDAP per-database last modification monitoring' "
"STRUCTURAL "
offsetof( struct lastmod_schema_t, lms_oc_lastmod ) },
{ NULL }
}, mat[] = {
- { "lastmodDN", "( 1.3.6.1.4.1.4203.666.1.28"
+ { "( 1.3.6.1.4.1.4203.666.1.28"
"NAME 'lastmodDN' "
"DESC 'DN of last modification' "
"EQUALITY distinguishedNameMatch "
"NO-USER-MODIFICATION "
"USAGE directoryOperation )", SLAP_AT_HIDE,
offsetof( struct lastmod_schema_t, lms_ad_lastmodDN ) },
- { "lastmodType", "( 1.3.6.1.4.1.4203.666.1.29"
+ { "( 1.3.6.1.4.1.4203.666.1.29"
"NAME 'lastmodType' "
"DESC 'Type of last modification' "
"SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 "
"NO-USER-MODIFICATION "
"USAGE directoryOperation )", SLAP_AT_HIDE,
offsetof( struct lastmod_schema_t, lms_ad_lastmodType ) },
- { "lastmodEnabled", "( 1.3.6.1.4.1.4203.666.1.30"
+ { "( 1.3.6.1.4.1.4203.666.1.30"
"NAME 'lastmodEnabled' "
"DESC 'Lastmod overlay state' "
"SYNTAX 1.3.6.1.4.1.1466.115.121.1.7 "
{
slap_overinst *on = (slap_overinst *)op->o_bd->bd_info;
lastmod_info_t *lmi = (lastmod_info_t *)on->on_bi.bi_private;
- unsigned i;
Modifications *ml;
if ( dn_match( &op->o_req_ndn, &lmi->lmi_e->e_nname ) ) {
char csnbuf[ LDAP_LUTIL_CSNSTR_BUFSIZE ];
struct berval entryCSN;
- slap_get_csn( NULL, csnbuf, sizeof(csnbuf), &entryCSN, 0 );
+ entryCSN.bv_val = csnbuf;
+ entryCSN.bv_len = sizeof( csnbuf );
+ slap_get_csn( NULL, &entryCSN, 0 );
ber_dupbv( bv_entryCSN, &entryCSN );
ber_dupbv( bv_nentryCSN, &entryCSN );
}
if ( bv_modifyTimestamp ) {
- struct tm *tm;
-#ifdef HAVE_GMTIME_R
- struct tm tm_buf;
-#endif
char tmbuf[ LDAP_LUTIL_GENTIME_BUFSIZE ];
+ struct berval timestamp;
time_t currtime;
/* best guess */
/* maybe we better use the time the operation was initiated */
currtime = op->o_time;
-#ifndef HAVE_GMTIME_R
- ldap_pvt_thread_mutex_lock( &gmtime_mutex );
- tm = gmtime( &currtime );
-#else /* HAVE_GMTIME_R */
- tm = gmtime_r( &currtime, &tm_buf );
-#endif /* HAVE_GMTIME_R */
- lutil_gentime( tmbuf, sizeof( tmbuf ), tm );
-#ifndef HAVE_GMTIME_R
- ldap_pvt_thread_mutex_unlock( &gmtime_mutex );
-#endif
+ timestamp.bv_val = tmbuf;
+ timestamp.bv_len = sizeof(tmbuf);
+ slap_timestamp( &currtime, ×tamp );
- ber_str2bv( tmbuf, 0, 1, bv_modifyTimestamp );
+ ber_dupbv( bv_modifyTimestamp, ×tamp );
ber_dupbv( bv_nmodifyTimestamp, bv_modifyTimestamp );
}
{
slap_overinst *on = (slap_overinst *)op->o_bd->bd_info;
lastmod_info_t *lmi = (lastmod_info_t *)on->on_bi.bi_private;
- unsigned int i;
/* don't record failed operations */
switch ( rs->sr_err ) {
}
ldap_pvt_thread_mutex_unlock( &lmi->lmi_entry_mutex );
-process:;
(void)lastmod_update( op, rs );
return SLAP_CB_CONTINUE;
const char *text;
/* schema integration */
- for ( i = 0; mat[i].name; i++ ) {
- LDAPAttributeType *at;
+ for ( i = 0; mat[i].schema; i++ ) {
int code;
- const char *err;
- AttributeDescription **ad;
-
- at = ldap_str2attributetype( mat[i].schema, &code,
- &err, LDAP_SCHEMA_ALLOW_ALL );
- if ( !at ) {
- Debug( LDAP_DEBUG_ANY, "lastmod_init: "
- "in AttributeType '%s' %s before %s\n",
- mat[i].name, ldap_scherr2str(code), err );
- return -1;
- }
-
- if ( at->at_oid == NULL ) {
- Debug( LDAP_DEBUG_ANY, "lastmod_init: "
- "null OID for attributeType '%s'\n",
- mat[i].name, 0, 0 );
- return -1;
- }
-
- code = at_add(at, 0, &err);
- if ( code ) {
- Debug( LDAP_DEBUG_ANY, "lastmod_init: "
- "%s in attributeType '%s'\n",
- scherr2str(code), mat[i].name, 0 );
- return -1;
- }
- ldap_memfree(at);
-
- ad = ((AttributeDescription **)&(((char *)&lastmod_schema)[mat[i].offset]));
+ AttributeDescription **ad =
+ ((AttributeDescription **)&(((char *)&lastmod_schema)[mat[i].offset]));
ad[0] = NULL;
- if ( slap_str2ad( mat[i].name, ad, &text ) ) {
+
+ code = register_at( mat[i].schema, ad, 0 );
+ if ( code ) {
Debug( LDAP_DEBUG_ANY,
- "lastmod_init: %s\n", text, 0, 0 );
+ "lastmod_init: register_at failed\n", 0, 0, 0 );
return -1;
}
-
(*ad)->ad_type->sat_flags |= mat[i].flags;
}
- for ( i = 0; moc[i].name; i++ ) {
- LDAPObjectClass *oc;
+ for ( i = 0; moc[i].schema; i++ ) {
int code;
- const char *err;
- ObjectClass *Oc;
+ ObjectClass **Oc =
+ ((ObjectClass **)&(((char *)&lastmod_schema)[moc[i].offset]));
- oc = ldap_str2objectclass(moc[i].schema, &code, &err,
- LDAP_SCHEMA_ALLOW_ALL );
- if ( !oc ) {
- Debug( LDAP_DEBUG_ANY,
- "unable to parse lastmod objectClass '%s': "
- "%s before %s\n" , moc[i].name,
- ldap_scherr2str(code), err );
- return -1;
- }
-
- if ( oc->oc_oid == NULL ) {
- Debug( LDAP_DEBUG_ANY,
- "objectClass '%s' has no OID\n" ,
- moc[i].name, 0, 0 );
- return -1;
- }
-
- code = oc_add(oc, 0, &err);
+ code = register_oc( moc[i].schema, Oc, 0 );
if ( code ) {
Debug( LDAP_DEBUG_ANY,
- "objectClass '%s': %s \"%s\"\n" ,
- moc[i].name, scherr2str(code), err );
+ "lastmod_init: register_oc failed\n", 0, 0, 0 );
return -1;
}
-
- ldap_memfree(oc);
-
- Oc = oc_find( moc[i].name );
- if ( Oc == NULL ) {
- Debug( LDAP_DEBUG_ANY, "lastmod_init: "
- "unable to find objectClass %s "
- "(just added)\n", moc[i].name, 0, 0 );
- return -1;
- }
-
- Oc->soc_flags |= moc[i].flags;
-
- ((ObjectClass **)&(((char *)&lastmod_schema)[moc[i].offset]))[0] = Oc;
+ (*Oc)->soc_flags |= moc[i].flags;
}
}
slap_overinst *on = (slap_overinst *) be->bd_info;
lastmod_info_t *lmi = (lastmod_info_t *)on->on_bi.bi_private;
char buf[ 8192 ];
- struct tm *tms;
-#ifdef HAVE_GMTIME_R
- struct tm tm_buf;
-#endif
static char tmbuf[ LDAP_LUTIL_GENTIME_BUFSIZE ];
char csnbuf[ LDAP_LUTIL_CSNSTR_BUFSIZE ];
struct berval entryCSN;
+ struct berval timestamp;
if ( !SLAP_LASTMOD( be ) ) {
fprintf( stderr, "set \"lastmod on\" to make this overlay effective\n" );
/*
* Start
*/
-#ifndef HAVE_GMTIME_R
- ldap_pvt_thread_mutex_lock( &gmtime_mutex );
- tms = gmtime( &starttime );
-#else /* HAVE_GMTIME_R */
- tms = gmtime_r( &starttime, &tm_buf );
-#endif /* HAVE_GMTIME_R */
- lutil_gentime( tmbuf, sizeof(tmbuf), tms );
-#ifndef HAVE_GMTIME_R
- ldap_pvt_thread_mutex_unlock( &gmtime_mutex );
-#endif
+ timestamp.bv_val = tmbuf;
+ timestamp.bv_len = sizeof(tmbuf);
+ slap_timestamp( &starttime, ×tamp );
- slap_get_csn( NULL, csnbuf, sizeof(csnbuf), &entryCSN, 0 );
+ entryCSN.bv_val = csnbuf;
+ entryCSN.bv_len = sizeof( csnbuf );
+ slap_get_csn( NULL, &entryCSN, 0 );
if ( BER_BVISNULL( &lmi->lmi_rdnvalue ) ) {
ber_str2bv( "Lastmod", 0, 1, &lmi->lmi_rdnvalue );
static slap_overinst lastmod;
int
-lastmod_init()
+lastmod_initialize()
{
lastmod.on_bi.bi_type = "lastmod";
lastmod.on_bi.bi_db_init = lastmod_db_init;
int
init_module( int argc, char *argv[] )
{
- return lastmod_init();
+ return lastmod_initialize();
}
#endif /* SLAPD_OVER_LASTMOD == SLAPD_MOD_DYNAMIC */