Lines Matching full:ap
179 #define AUDIT_PIPE_LOCK(ap) mtx_lock(&(ap)->ap_mtx)
180 #define AUDIT_PIPE_LOCK_ASSERT(ap) mtx_assert(&(ap)->ap_mtx, MA_OWNED)
181 #define AUDIT_PIPE_LOCK_DESTROY(ap) mtx_destroy(&(ap)->ap_mtx)
182 #define AUDIT_PIPE_LOCK_INIT(ap) mtx_init(&(ap)->ap_mtx, \
184 #define AUDIT_PIPE_UNLOCK(ap) mtx_unlock(&(ap)->ap_mtx)
185 #define AUDIT_PIPE_MTX(ap) (&(ap)->ap_mtx)
187 #define AUDIT_PIPE_SX_LOCK_DESTROY(ap) sx_destroy(&(ap)->ap_sx)
188 #define AUDIT_PIPE_SX_LOCK_INIT(ap) sx_init(&(ap)->ap_sx, "audit_pipe_sx")
189 #define AUDIT_PIPE_SX_XLOCK_ASSERT(ap) sx_assert(&(ap)->ap_sx, SA_XLOCKED)
190 #define AUDIT_PIPE_SX_XLOCK_SIG(ap) sx_xlock_sig(&(ap)->ap_sx)
191 #define AUDIT_PIPE_SX_XUNLOCK(ap) sx_xunlock(&(ap)->ap_sx)
271 audit_pipe_preselect_find(struct audit_pipe *ap, au_id_t auid)
275 AUDIT_PIPE_LOCK_ASSERT(ap);
277 TAILQ_FOREACH(app, &ap->ap_preselect_list, app_list) {
288 audit_pipe_preselect_get(struct audit_pipe *ap, au_id_t auid,
294 AUDIT_PIPE_LOCK(ap);
295 app = audit_pipe_preselect_find(ap, auid);
301 AUDIT_PIPE_UNLOCK(ap);
310 audit_pipe_preselect_set(struct audit_pipe *ap, au_id_t auid, au_mask_t mask)
319 AUDIT_PIPE_LOCK(ap);
320 app = audit_pipe_preselect_find(ap, auid);
325 TAILQ_INSERT_TAIL(&ap->ap_preselect_list, app, app_list);
328 AUDIT_PIPE_UNLOCK(ap);
337 audit_pipe_preselect_delete(struct audit_pipe *ap, au_id_t auid)
342 AUDIT_PIPE_LOCK(ap);
343 app = audit_pipe_preselect_find(ap, auid);
345 TAILQ_REMOVE(&ap->ap_preselect_list, app, app_list);
349 AUDIT_PIPE_UNLOCK(ap);
359 audit_pipe_preselect_flush_locked(struct audit_pipe *ap)
363 AUDIT_PIPE_LOCK_ASSERT(ap);
365 while ((app = TAILQ_FIRST(&ap->ap_preselect_list)) != NULL) {
366 TAILQ_REMOVE(&ap->ap_preselect_list, app, app_list);
372 audit_pipe_preselect_flush(struct audit_pipe *ap)
375 AUDIT_PIPE_LOCK(ap);
376 audit_pipe_preselect_flush_locked(ap);
377 AUDIT_PIPE_UNLOCK(ap);
391 audit_pipe_preselect_check(struct audit_pipe *ap, au_id_t auid,
396 AUDIT_PIPE_LOCK_ASSERT(ap);
398 switch (ap->ap_preselect_mode) {
403 app = audit_pipe_preselect_find(ap, auid);
407 &ap->ap_preselect_naflags, sorf));
410 &ap->ap_preselect_flags, sorf));
417 ap->ap_preselect_mode);
431 struct audit_pipe *ap;
438 TAILQ_FOREACH(ap, &audit_pipe_list, ap_list) {
439 AUDIT_PIPE_LOCK(ap);
440 if (audit_pipe_preselect_check(ap, auid, event, class, sorf,
442 AUDIT_PIPE_UNLOCK(ap);
446 AUDIT_PIPE_UNLOCK(ap);
458 audit_pipe_append(struct audit_pipe *ap, void *record, u_int record_len)
462 AUDIT_PIPE_LOCK_ASSERT(ap);
464 if (ap->ap_qlen >= ap->ap_qlimit) {
465 ap->ap_drops++;
472 ap->ap_drops++;
480 ap->ap_drops++;
488 TAILQ_INSERT_TAIL(&ap->ap_queue, ape, ape_queue);
489 ap->ap_inserts++;
490 ap->ap_qlen++;
491 ap->ap_qbyteslen += ape->ape_record_len;
492 selwakeuppri(&ap->ap_selinfo, PSOCK);
493 KNOTE_LOCKED(&ap->ap_selinfo.si_note, 0);
494 if (ap->ap_flags & AUDIT_PIPE_ASYNC)
495 pgsigio(&ap->ap_sigio, SIGIO, 0);
496 cv_broadcast(&ap->ap_cv);
507 struct audit_pipe *ap;
516 TAILQ_FOREACH(ap, &audit_pipe_list, ap_list) {
517 AUDIT_PIPE_LOCK(ap);
518 if (audit_pipe_preselect_check(ap, auid, event, class, sorf,
520 audit_pipe_append(ap, record, record_len);
521 AUDIT_PIPE_UNLOCK(ap);
540 struct audit_pipe *ap;
549 TAILQ_FOREACH(ap, &audit_pipe_list, ap_list) {
550 AUDIT_PIPE_LOCK(ap);
551 audit_pipe_append(ap, record, record_len);
552 AUDIT_PIPE_UNLOCK(ap);
567 struct audit_pipe *ap;
569 ap = malloc(sizeof(*ap), M_AUDIT_PIPE, M_NOWAIT | M_ZERO);
570 if (ap == NULL)
572 ap->ap_qlimit = AUDIT_PIPE_QLIMIT_DEFAULT;
573 TAILQ_INIT(&ap->ap_queue);
574 knlist_init_mtx(&ap->ap_selinfo.si_note, AUDIT_PIPE_MTX(ap));
575 AUDIT_PIPE_LOCK_INIT(ap);
576 AUDIT_PIPE_SX_LOCK_INIT(ap);
577 cv_init(&ap->ap_cv, "audit_pipe");
586 bzero(&ap->ap_preselect_flags, sizeof(ap->ap_preselect_flags));
587 bzero(&ap->ap_preselect_naflags, sizeof(ap->ap_preselect_naflags));
588 TAILQ_INIT(&ap->ap_preselect_list);
589 ap->ap_preselect_mode = AUDITPIPE_PRESELECT_MODE_TRAIL;
595 TAILQ_INSERT_HEAD(&audit_pipe_list, ap, ap_list);
600 return (ap);
607 audit_pipe_flush(struct audit_pipe *ap)
611 AUDIT_PIPE_LOCK_ASSERT(ap);
613 while ((ape = TAILQ_FIRST(&ap->ap_queue)) != NULL) {
614 TAILQ_REMOVE(&ap->ap_queue, ape, ape_queue);
615 ap->ap_qbyteslen -= ape->ape_record_len;
617 ap->ap_qlen--;
619 ap->ap_qoffset = 0;
621 KASSERT(ap->ap_qlen == 0, ("audit_pipe_free: ap_qbyteslen"));
622 KASSERT(ap->ap_qbyteslen == 0, ("audit_pipe_flush: ap_qbyteslen"));
632 audit_pipe_free(struct audit_pipe *ap)
636 AUDIT_PIPE_LOCK_ASSERT(ap);
638 audit_pipe_preselect_flush_locked(ap);
639 audit_pipe_flush(ap);
640 cv_destroy(&ap->ap_cv);
641 AUDIT_PIPE_SX_LOCK_DESTROY(ap);
642 AUDIT_PIPE_LOCK_DESTROY(ap);
643 seldrain(&ap->ap_selinfo);
644 knlist_destroy(&ap->ap_selinfo.si_note);
645 TAILQ_REMOVE(&audit_pipe_list, ap, ap_list);
646 free(ap, M_AUDIT_PIPE);
653 struct audit_pipe *ap;
655 ap = arg;
656 funsetown(&ap->ap_sigio);
658 AUDIT_PIPE_LOCK(ap);
659 audit_pipe_free(ap);
671 struct audit_pipe *ap;
674 ap = audit_pipe_alloc();
675 if (ap == NULL)
677 fsetown(td->td_proc->p_pid, &ap->ap_sigio);
678 error = devfs_set_cdevpriv(ap, audit_pipe_dtor);
680 audit_pipe_dtor(ap);
693 struct audit_pipe *ap;
698 error = devfs_get_cdevpriv((void **)&ap);
709 AUDIT_PIPE_LOCK(ap);
711 ap->ap_flags |= AUDIT_PIPE_NBIO;
713 ap->ap_flags &= ~AUDIT_PIPE_NBIO;
714 AUDIT_PIPE_UNLOCK(ap);
719 AUDIT_PIPE_LOCK(ap);
720 *(int *)data = ap->ap_qbyteslen - ap->ap_qoffset;
721 AUDIT_PIPE_UNLOCK(ap);
726 AUDIT_PIPE_LOCK(ap);
728 ap->ap_flags |= AUDIT_PIPE_ASYNC;
730 ap->ap_flags &= ~AUDIT_PIPE_ASYNC;
731 AUDIT_PIPE_UNLOCK(ap);
736 error = fsetown(*(int *)data, &ap->ap_sigio);
740 *(int *)data = fgetown(&ap->ap_sigio);
745 *(u_int *)data = ap->ap_qlen;
750 *(u_int *)data = ap->ap_qlimit;
758 ap->ap_qlimit = *(u_int *)data;
775 AUDIT_PIPE_LOCK(ap);
777 *maskp = ap->ap_preselect_flags;
778 AUDIT_PIPE_UNLOCK(ap);
783 AUDIT_PIPE_LOCK(ap);
785 ap->ap_preselect_flags = *maskp;
786 AUDIT_PIPE_UNLOCK(ap);
791 AUDIT_PIPE_LOCK(ap);
793 *maskp = ap->ap_preselect_naflags;
794 AUDIT_PIPE_UNLOCK(ap);
799 AUDIT_PIPE_LOCK(ap);
801 ap->ap_preselect_naflags = *maskp;
802 AUDIT_PIPE_UNLOCK(ap);
808 error = audit_pipe_preselect_get(ap, aip->aip_auid,
814 audit_pipe_preselect_set(ap, aip->aip_auid, aip->aip_mask);
820 error = audit_pipe_preselect_delete(ap, auid);
824 audit_pipe_preselect_flush(ap);
829 AUDIT_PIPE_LOCK(ap);
830 *(int *)data = ap->ap_preselect_mode;
831 AUDIT_PIPE_UNLOCK(ap);
840 AUDIT_PIPE_LOCK(ap);
841 ap->ap_preselect_mode = mode;
842 AUDIT_PIPE_UNLOCK(ap);
852 if (AUDIT_PIPE_SX_XLOCK_SIG(ap) != 0)
854 AUDIT_PIPE_LOCK(ap);
855 audit_pipe_flush(ap);
856 AUDIT_PIPE_UNLOCK(ap);
857 AUDIT_PIPE_SX_XUNLOCK(ap);
867 *(u_int *)data = ap->ap_inserts;
872 *(u_int *)data = ap->ap_reads;
877 *(u_int *)data = ap->ap_drops;
900 struct audit_pipe *ap;
904 error = devfs_get_cdevpriv((void **)&ap);
912 if (AUDIT_PIPE_SX_XLOCK_SIG(ap) != 0)
914 AUDIT_PIPE_LOCK(ap);
915 while (TAILQ_EMPTY(&ap->ap_queue)) {
916 if (ap->ap_flags & AUDIT_PIPE_NBIO) {
917 AUDIT_PIPE_UNLOCK(ap);
918 AUDIT_PIPE_SX_XUNLOCK(ap);
921 error = cv_wait_sig(&ap->ap_cv, AUDIT_PIPE_MTX(ap));
923 AUDIT_PIPE_UNLOCK(ap);
924 AUDIT_PIPE_SX_XUNLOCK(ap);
936 ap->ap_reads++;
937 while ((ape = TAILQ_FIRST(&ap->ap_queue)) != NULL &&
939 AUDIT_PIPE_LOCK_ASSERT(ap);
941 KASSERT(ape->ape_record_len > ap->ap_qoffset,
943 toread = MIN(ape->ape_record_len - ap->ap_qoffset,
945 AUDIT_PIPE_UNLOCK(ap);
946 error = uiomove((char *)ape->ape_record + ap->ap_qoffset,
949 AUDIT_PIPE_SX_XUNLOCK(ap);
957 AUDIT_PIPE_LOCK(ap);
958 KASSERT(TAILQ_FIRST(&ap->ap_queue) == ape,
960 ap->ap_qoffset += toread;
961 KASSERT(ape->ape_record_len >= ap->ap_qoffset,
963 if (ap->ap_qoffset == ape->ape_record_len) {
964 TAILQ_REMOVE(&ap->ap_queue, ape, ape_queue);
965 ap->ap_qbyteslen -= ape->ape_record_len;
967 ap->ap_qlen--;
968 ap->ap_qoffset = 0;
971 AUDIT_PIPE_UNLOCK(ap);
972 AUDIT_PIPE_SX_XUNLOCK(ap);
982 struct audit_pipe *ap;
986 error = devfs_get_cdevpriv((void **)&ap);
990 AUDIT_PIPE_LOCK(ap);
991 if (TAILQ_FIRST(&ap->ap_queue) != NULL)
994 selrecord(td, &ap->ap_selinfo);
995 AUDIT_PIPE_UNLOCK(ap);
1006 struct audit_pipe *ap;
1009 error = devfs_get_cdevpriv((void **)&ap);
1016 kn->kn_hook = ap;
1018 AUDIT_PIPE_LOCK(ap);
1019 knlist_add(&ap->ap_selinfo.si_note, kn, 1);
1020 AUDIT_PIPE_UNLOCK(ap);
1030 struct audit_pipe *ap;
1032 ap = (struct audit_pipe *)kn->kn_hook;
1033 AUDIT_PIPE_LOCK_ASSERT(ap);
1035 if (ap->ap_qlen != 0) {
1036 kn->kn_data = ap->ap_qbyteslen - ap->ap_qoffset;
1050 struct audit_pipe *ap;
1052 ap = (struct audit_pipe *)kn->kn_hook;
1053 AUDIT_PIPE_LOCK(ap);
1054 knlist_remove(&ap->ap_selinfo.si_note, kn, 1);
1055 AUDIT_PIPE_UNLOCK(ap);