| 765 | } |
| 766 | |
| 767 | static int |
| 768 | rctl_rule_matches(const struct rctl_rule *rule, const struct rctl_rule *filter) |
| 769 | { |
| 770 | |
| 771 | ASSERT_RACCT_ENABLED(); |
| 772 | |
| 773 | if (filter->rr_subject_type != RCTL_SUBJECT_TYPE_UNDEFINED) { |
| 774 | if (rule->rr_subject_type != filter->rr_subject_type) |
| 775 | return (0); |
| 776 | |
| 777 | switch (filter->rr_subject_type) { |
| 778 | case RCTL_SUBJECT_TYPE_PROCESS: |
| 779 | if (filter->rr_subject.rs_proc != NULL && |
| 780 | rule->rr_subject.rs_proc != |
| 781 | filter->rr_subject.rs_proc) |
| 782 | return (0); |
| 783 | break; |
| 784 | case RCTL_SUBJECT_TYPE_USER: |
| 785 | if (filter->rr_subject.rs_uip != NULL && |
| 786 | rule->rr_subject.rs_uip != |
| 787 | filter->rr_subject.rs_uip) |
| 788 | return (0); |
| 789 | break; |
| 790 | case RCTL_SUBJECT_TYPE_LOGINCLASS: |
| 791 | if (filter->rr_subject.rs_loginclass != NULL && |
| 792 | rule->rr_subject.rs_loginclass != |
| 793 | filter->rr_subject.rs_loginclass) |
| 794 | return (0); |
| 795 | break; |
| 796 | case RCTL_SUBJECT_TYPE_JAIL: |
| 797 | if (filter->rr_subject.rs_prison_racct != NULL && |
| 798 | rule->rr_subject.rs_prison_racct != |
| 799 | filter->rr_subject.rs_prison_racct) |
| 800 | return (0); |
| 801 | break; |
| 802 | default: |
| 803 | panic("rctl_rule_matches: unknown subject type %d", |
| 804 | filter->rr_subject_type); |
| 805 | } |
| 806 | } |
| 807 | |
| 808 | if (filter->rr_resource != RACCT_UNDEFINED) { |
| 809 | if (rule->rr_resource != filter->rr_resource) |
| 810 | return (0); |
| 811 | } |
| 812 | |
| 813 | if (filter->rr_action != RCTL_ACTION_UNDEFINED) { |
| 814 | if (rule->rr_action != filter->rr_action) |
| 815 | return (0); |
| 816 | } |
| 817 | |
| 818 | if (filter->rr_amount != RCTL_AMOUNT_UNDEFINED) { |
| 819 | if (rule->rr_amount != filter->rr_amount) |
| 820 | return (0); |
| 821 | } |
| 822 | |
| 823 | if (filter->rr_per != RCTL_SUBJECT_TYPE_UNDEFINED) { |
| 824 | if (rule->rr_per != filter->rr_per) |
no test coverage detected