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; }
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); }