Пример #1
0
void
audit_activity(Rt_map * clmp, uint_t flags)
{
	int	appl = 0;

	/*
	 * We want to trigger the first addition or deletion only.  Ignore any
	 * consistent calls unless a previous addition or deletion occurred.
	 */
	if ((flags == LA_ACT_ADD) || (flags == LA_ACT_DELETE)) {
		if (rtld_flags & RT_FL_AUNOTIF)
			return;
		rtld_flags |= RT_FL_AUNOTIF;
	} else {
		if ((rtld_flags & RT_FL_AUNOTIF) == 0)
			return;
		rtld_flags &= ~RT_FL_AUNOTIF;
	}

	if ((rtld_flags & RT_FL_APPLIC) == 0)
		appl = rtld_flags |= RT_FL_APPLIC;

	if (auditors && (auditors->ad_flags & LML_TFLG_AUD_ACTIVITY))
		_audit_activity(&(auditors->ad_list), clmp, flags);
	if (AUDITORS(clmp) &&
	    (AUDITORS(clmp)->ad_flags & LML_TFLG_AUD_ACTIVITY))
		_audit_activity(&(AUDITORS(clmp)->ad_list), clmp, flags);

	if (appl)
		rtld_flags &= ~RT_FL_APPLIC;
}
Пример #2
0
void
audit_activity(Rt_map *clmp, uint_t flags)
{
	Rt_map	*lmp;
	Aliste	idx;
	uint_t	rtldflags;

	if (rt_critical())
		return;

	APPLICATION_ENTER(rtldflags);

	if (auditors && (auditors->ad_flags & LML_TFLG_AUD_ACTIVITY))
		_audit_activity(auditors->ad_list, clmp, flags, TRUE);
	if (AUDITORS(clmp) &&
	    (AUDITORS(clmp)->ad_flags & LML_TFLG_AUD_ACTIVITY))
		_audit_activity(AUDITORS(clmp)->ad_list, clmp, flags, TRUE);

	for (APLIST_TRAVERSE(aud_activity, idx, lmp)) {
		if ((clmp != lmp) && AUDITORS(lmp) &&
		    (AUDITORS(lmp)->ad_flags & LML_TFLG_AUD_ACTIVITY)) {
			_audit_activity(AUDITORS(lmp)->ad_list, lmp, flags,
			    FALSE);
		}
	}

	APPLICATION_RETURN(rtldflags);
}