⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 database.c

📁 ldap服务器源码
💻 C
📖 第 1 页 / 共 2 页
字号:
						"modifyTimestamp: %s\n",						o,						i,						ms->mss_dn.bv_val,						mi->mi_oc_monitoredObject->soc_cname.bv_val,						mi->mi_oc_monitoredObject->soc_cname.bv_val,						o,						mi->mi_ad_monitoredInfo->ad_cname.bv_val,						on->on_bi.bi_type,						j,						ms_overlay->mss_dn.bv_val,						mi->mi_creatorsName.bv_val,						mi->mi_creatorsName.bv_val,						mi->mi_startTime.bv_val,						mi->mi_startTime.bv_val );								e_overlay = str2entry( buf );				if ( e_overlay == NULL ) {					Debug( LDAP_DEBUG_ANY,						"monitor_subsys_database_init: "						"unable to create entry "						"\"cn=Overlay %d,cn=Database %d,%s\"\n",						o, i, ms->mss_dn.bv_val );					return( -1 );				}				mp_overlay = monitor_entrypriv_create();				if ( mp_overlay == NULL ) {					return -1;				}				e_overlay->e_private = ( void * )mp_overlay;				mp_overlay->mp_info = ms;				mp_overlay->mp_flags = ms->mss_flags					| MONITOR_F_SUB;						if ( monitor_cache_add( mi, e_overlay ) ) {					Debug( LDAP_DEBUG_ANY,						"monitor_subsys_database_init: "						"unable to add entry "						"\"cn=Overlay %d,cn=Database %d,%s\"\n",						o, i, ms->mss_dn.bv_val );					return( -1 );				}				*ep_overlay = e_overlay;				ep_overlay = &mp_overlay->mp_next;			}		}		*ep = e;		ep = &mp->mp_next;	}		monitor_cache_release( mi, e_database );	return( 0 );}/* * v: array of values * cur: must not contain the tags corresponding to the values in v * delta: will contain the tags corresponding to the values in v */static intvalue_mask( BerVarray v, slap_mask_t cur, slap_mask_t *delta ){	for ( ; !BER_BVISNULL( v ); v++ ) {		struct restricted_ops_t		*rops;		int				i;		if ( OID_LEADCHAR( v->bv_val[ 0 ] ) ) {			rops = restricted_exops;		} else {			rops = restricted_ops;		}		for ( i = 0; !BER_BVISNULL( &rops[ i ].op ); i++ ) {			if ( ber_bvstrcasecmp( v, &rops[ i ].op ) != 0 ) {				continue;			}			if ( rops[ i ].tag & *delta ) {				return LDAP_OTHER;			}			if ( rops[ i ].tag & cur ) {				return LDAP_OTHER;			}			cur |= rops[ i ].tag;			*delta |= rops[ i ].tag;			break;		}		if ( BER_BVISNULL( &rops[ i ].op ) ) {			return LDAP_INVALID_SYNTAX;		}	}	return LDAP_SUCCESS;}static intmonitor_subsys_database_modify(	Operation	*op,	SlapReply	*rs,	Entry		*e ){	monitor_info_t	*mi = (monitor_info_t *)op->o_bd->be_private;	int		rc = LDAP_OTHER;	Attribute	*save_attrs, *a;	Modifications	*ml;	Backend		*be;	int		ro_gotval = 1, i, n;	slap_mask_t	rp_add = 0, rp_delete = 0, rp_cur;	struct berval	*tf;		i = sscanf( e->e_nname.bv_val, "cn=database %d,", &n );	if ( i != 1 ) {		return SLAP_CB_CONTINUE;	}	if ( n < 0 || n >= nBackendDB ) {		rs->sr_text = "invalid database index";		return ( rs->sr_err = LDAP_NO_SUCH_OBJECT );	}	LDAP_STAILQ_FOREACH( be, &backendDB, be_next ) {		if ( n == 0 ) {			break;		}		n--;	}	/* do not allow some changes on back-monitor (needs work)... */	if ( SLAP_MONITOR( be ) ) {		rs->sr_text = "no modifications allowed to monitor database entry";		return ( rs->sr_err = LDAP_UNWILLING_TO_PERFORM );	}			rp_cur = be->be_restrictops;	save_attrs = e->e_attrs;	e->e_attrs = attrs_dup( e->e_attrs );	for ( ml = op->orm_modlist; ml; ml = ml->sml_next ) {		Modification *mod = &ml->sml_mod;		if ( mod->sm_desc == mi->mi_ad_readOnly ) {			int	val = -1;			if ( mod->sm_values ) {				if ( !BER_BVISNULL( &mod->sm_values[ 1 ] ) ) {					rs->sr_text = "attempting to modify multiple values of single-valued attribute";					rc = rs->sr_err = LDAP_CONSTRAINT_VIOLATION;					goto done;				}				if ( bvmatch( &slap_true_bv, mod->sm_values )) {					val = 1;				} else if ( bvmatch( &slap_false_bv, mod->sm_values )) {					val = 0;				} else {					assert( 0 );					rc = rs->sr_err = LDAP_INVALID_SYNTAX;					goto done;				}			}			switch ( mod->sm_op ) {			case LDAP_MOD_DELETE:				if ( ro_gotval < 1 ) {					rc = rs->sr_err = LDAP_CONSTRAINT_VIOLATION;					goto done;				}				ro_gotval--;				if ( val == 0 && ( rp_cur & SLAP_RESTRICT_OP_WRITES ) == SLAP_RESTRICT_OP_WRITES ) {					rc = rs->sr_err = LDAP_NO_SUCH_ATTRIBUTE;					goto done;				}								if ( val == 1 && ( rp_cur & SLAP_RESTRICT_OP_WRITES ) != SLAP_RESTRICT_OP_WRITES ) {					rc = rs->sr_err = LDAP_NO_SUCH_ATTRIBUTE;					goto done;				}								break;			case LDAP_MOD_REPLACE:				ro_gotval = 0;				/* fall thru */			case LDAP_MOD_ADD:				if ( ro_gotval > 0 ) {					rc = rs->sr_err = LDAP_CONSTRAINT_VIOLATION;					goto done;				}				ro_gotval++;				if ( val == 1 ) {					rp_add |= (~rp_cur) & SLAP_RESTRICT_OP_WRITES;					rp_cur |= SLAP_RESTRICT_OP_WRITES;					rp_delete &= ~SLAP_RESTRICT_OP_WRITES;									} else if ( val == 0 ) {					rp_delete |= rp_cur & SLAP_RESTRICT_OP_WRITES;					rp_cur &= ~SLAP_RESTRICT_OP_WRITES;					rp_add &= ~SLAP_RESTRICT_OP_WRITES;				}				break;			default:				rc = rs->sr_err = LDAP_OTHER;				goto done;			}		} else if ( mod->sm_desc == mi->mi_ad_restrictedOperation ) {			slap_mask_t	mask = 0;			switch ( mod->sm_op ) {			case LDAP_MOD_DELETE:				if ( mod->sm_values == NULL ) {					rp_delete = rp_cur;					rp_cur = 0;					rp_add = 0;					break;				}				rc = value_mask( mod->sm_values, ~rp_cur, &mask );				if ( rc == LDAP_SUCCESS ) {					rp_delete |= mask;					rp_add &= ~mask;					rp_cur &= ~mask;				} else if ( rc == LDAP_OTHER ) {					rc = LDAP_NO_SUCH_ATTRIBUTE;				}				break;			case LDAP_MOD_REPLACE:				rp_delete = rp_cur;				rp_cur = 0;				rp_add = 0;				/* fall thru */			case LDAP_MOD_ADD:				rc = value_mask( mod->sm_values, rp_cur, &mask );				if ( rc == LDAP_SUCCESS ) {					rp_add |= mask;					rp_cur |= mask;					rp_delete &= ~mask;				} else if ( rc == LDAP_OTHER ) {					rc = rs->sr_err = LDAP_TYPE_OR_VALUE_EXISTS;				}				break;			default:				rc = rs->sr_err = LDAP_OTHER;				break;			}			if ( rc != LDAP_SUCCESS ) {				goto done;			}		} else if ( is_at_operational( mod->sm_desc->ad_type )) {		/* accept all operational attributes */			attr_delete( &e->e_attrs, mod->sm_desc );			rc = attr_merge( e, mod->sm_desc, mod->sm_values,				mod->sm_nvalues );			if ( rc ) {				rc = rs->sr_err = LDAP_OTHER;				break;			}		} else {			rc = rs->sr_err = LDAP_UNWILLING_TO_PERFORM;			break;		}	}	/* sanity checks: */	if ( ro_gotval < 1 ) {		rc = rs->sr_err = LDAP_CONSTRAINT_VIOLATION;		goto done;	}	if ( ( rp_cur & SLAP_RESTRICT_OP_EXTENDED ) && ( rp_cur & SLAP_RESTRICT_EXOP_MASK ) ) {		rc = rs->sr_err = LDAP_CONSTRAINT_VIOLATION;		goto done;	}	if ( rp_delete & rp_add ) {		rc = rs->sr_err = LDAP_OTHER;		goto done;	}	/* check current value of readOnly */	if ( ( rp_cur & SLAP_RESTRICT_OP_WRITES ) == SLAP_RESTRICT_OP_WRITES ) {		tf = (struct berval *)&slap_true_bv;	} else {		tf = (struct berval *)&slap_false_bv;	}	a = attr_find( e->e_attrs, mi->mi_ad_readOnly );	if ( a == NULL ) {		rc = LDAP_OTHER;		goto done;	}	if ( !bvmatch( &a->a_vals[ 0 ], tf ) ) {		attr_delete( &e->e_attrs, mi->mi_ad_readOnly );		rc = attr_merge_one( e, mi->mi_ad_readOnly, tf, tf );	}	if ( rc == LDAP_SUCCESS ) {		if ( rp_delete ) {			if ( rp_delete == be->be_restrictops ) {				attr_delete( &e->e_attrs, mi->mi_ad_restrictedOperation );			} else {				a = attr_find( e->e_attrs, mi->mi_ad_restrictedOperation );				if ( a == NULL ) {					rc = rs->sr_err = LDAP_OTHER;					goto done;				}				for ( i = 0; !BER_BVISNULL( &restricted_ops[ i ].op ); i++ ) {					if ( rp_delete & restricted_ops[ i ].tag ) {						int	j;											for ( j = 0; !BER_BVISNULL( &a->a_nvals[ j ] ); j++ ) {							int		k;							if ( !bvmatch( &a->a_nvals[ j ], &restricted_ops[ i ].op ) ) {								continue;							}							ch_free( a->a_vals[ j ].bv_val );							ch_free( a->a_nvals[ j ].bv_val );							for ( k = j + 1; !BER_BVISNULL( &a->a_nvals[ k ] ); k++ ) {								a->a_vals[ k - 1 ] = a->a_vals[ k ];								a->a_nvals[ k - 1 ] = a->a_nvals[ k ];							}								BER_BVZERO( &a->a_vals[ k - 1 ] );							BER_BVZERO( &a->a_nvals[ k - 1 ] );						}					}				}								for ( i = 0; !BER_BVISNULL( &restricted_exops[ i ].op ); i++ ) {					if ( rp_delete & restricted_exops[ i ].tag ) {						int	j;											for ( j = 0; !BER_BVISNULL( &a->a_nvals[ j ] ); j++ ) {							int		k;							if ( !bvmatch( &a->a_nvals[ j ], &restricted_exops[ i ].op ) ) {								continue;							}							ch_free( a->a_vals[ j ].bv_val );							ch_free( a->a_nvals[ j ].bv_val );							for ( k = j + 1; !BER_BVISNULL( &a->a_nvals[ k ] ); k++ ) {								a->a_vals[ k - 1 ] = a->a_vals[ k ];								a->a_nvals[ k - 1 ] = a->a_nvals[ k ];							}								BER_BVZERO( &a->a_vals[ k - 1 ] );							BER_BVZERO( &a->a_nvals[ k - 1 ] );						}					}				}			}		}		if ( rp_add ) {			for ( i = 0; !BER_BVISNULL( &restricted_ops[ i ].op ); i++ ) {				if ( rp_add & restricted_ops[ i ].tag ) {					attr_merge_one( e, mi->mi_ad_restrictedOperation,							&restricted_ops[ i ].op,							&restricted_ops[ i ].op );				}			}			for ( i = 0; !BER_BVISNULL( &restricted_exops[ i ].op ); i++ ) {				if ( rp_add & restricted_exops[ i ].tag ) {					attr_merge_one( e, mi->mi_ad_restrictedOperation,							&restricted_exops[ i ].op,							&restricted_exops[ i ].op );				}			}		}	}	be->be_restrictops = rp_cur;done:;	if ( rc == LDAP_SUCCESS ) {		attrs_free( save_attrs );		rc = SLAP_CB_CONTINUE;	} else {		Attribute *tmp = e->e_attrs;		e->e_attrs = save_attrs;		attrs_free( tmp );	}	return rc;}#if defined(LDAP_SLAPI)static intmonitor_back_add_plugin( monitor_info_t *mi, Backend *be, Entry *e_database ){	Slapi_PBlock	*pCurrentPB; 	int		i, rc = LDAP_SUCCESS;	if ( slapi_int_pblock_get_first( be, &pCurrentPB ) != LDAP_SUCCESS ) {		/*		 * LDAP_OTHER is returned if no plugins are installed		 */		rc = LDAP_OTHER;		goto done;	}	i = 0;	do {		Slapi_PluginDesc	*srchdesc;		char			buf[ BACKMONITOR_BUFSIZE ];		struct berval		bv;		rc = slapi_pblock_get( pCurrentPB, SLAPI_PLUGIN_DESCRIPTION,				&srchdesc );		if ( rc != LDAP_SUCCESS ) {			goto done;		}		snprintf( buf, sizeof(buf),				"plugin %d name: %s; "				"vendor: %s; "				"version: %s; "				"description: %s", 				i,				srchdesc->spd_id,				srchdesc->spd_vendor,				srchdesc->spd_version,				srchdesc->spd_description );		ber_str2bv( buf, 0, 0, &bv );		attr_merge_normalize_one( e_database,				mi->mi_ad_monitoredInfo, &bv, NULL );		i++;	} while ( ( slapi_int_pblock_get_next( &pCurrentPB ) == LDAP_SUCCESS )			&& ( pCurrentPB != NULL ) );done:	return rc;}#endif /* defined(LDAP_SLAPI) */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -