147173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner/* 247173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner * User-supplied callbacks and default implementations. 347173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner * Class and permission mappings. 447173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner */ 547173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner 647173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner#include <stdio.h> 747173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner#include <stdlib.h> 847173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner#include <stdarg.h> 947173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner#include <errno.h> 1047173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner#include <selinux/selinux.h> 1147173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner#include "callbacks.h" 1247173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner 1347173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner/* default implementations */ 1447173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerstatic int __attribute__ ((format(printf, 2, 3))) 1547173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerdefault_selinux_log(int type __attribute__((unused)), const char *fmt, ...) 1647173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner{ 1747173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner int rc; 1847173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner va_list ap; 1947173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner va_start(ap, fmt); 2047173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner rc = vfprintf(stderr, fmt, ap); 2147173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner va_end(ap); 2247173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner return rc; 2347173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner} 2447173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner 2547173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerstatic int 2647173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerdefault_selinux_audit(void *ptr __attribute__((unused)), 2747173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner security_class_t cls __attribute__((unused)), 2847173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner char *buf __attribute__((unused)), 2947173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner size_t len __attribute__((unused))) 3047173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner{ 3147173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner return 0; 3247173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner} 3347173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner 3447173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerstatic int 3547173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerdefault_selinux_validate(char **ctx) 3647173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner{ 3747173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner return security_check_context(*ctx); 3847173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner} 3947173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner 4047173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerstatic int 4147173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerdefault_selinux_setenforce(int enforcing __attribute__((unused))) 4247173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner{ 4347173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner return 0; 4447173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner} 4547173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner 4647173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerstatic int 4747173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerdefault_selinux_policyload(int seqno __attribute__((unused))) 4847173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner{ 4947173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner return 0; 5047173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner} 5147173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner 5247173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner/* callback pointers */ 5347173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerint __attribute__ ((format(printf, 2, 3))) 5447173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner(*selinux_log)(int, const char *, ...) = 5547173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner default_selinux_log; 5647173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner 5747173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerint 5847173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner(*selinux_audit) (void *, security_class_t, char *, size_t) = 5947173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner default_selinux_audit; 6047173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner 6147173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerint 6247173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner(*selinux_validate)(char **ctx) = 6347173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner default_selinux_validate; 6447173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner 6547173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerint 6647173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner(*selinux_netlink_setenforce) (int enforcing) = 6747173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner default_selinux_setenforce; 6847173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner 6947173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerint 7047173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner(*selinux_netlink_policyload) (int seqno) = 7147173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner default_selinux_policyload; 7247173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner 7347173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner/* callback setting function */ 7447173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnervoid 7547173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerselinux_set_callback(int type, union selinux_callback cb) 7647173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner{ 7747173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner switch (type) { 7847173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner case SELINUX_CB_LOG: 7947173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner selinux_log = cb.func_log; 8047173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner break; 8147173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner case SELINUX_CB_AUDIT: 8247173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner selinux_audit = cb.func_audit; 8347173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner break; 8447173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner case SELINUX_CB_VALIDATE: 8547173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner selinux_validate = cb.func_validate; 8647173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner break; 8747173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner case SELINUX_CB_SETENFORCE: 8847173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner selinux_netlink_setenforce = cb.func_setenforce; 8947173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner break; 9047173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner case SELINUX_CB_POLICYLOAD: 9147173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner selinux_netlink_policyload = cb.func_policyload; 9247173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner break; 9347173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner } 9447173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner} 9547173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner 9647173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner/* callback getting function */ 9747173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerunion selinux_callback 9847173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerselinux_get_callback(int type) 9947173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner{ 10047173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner union selinux_callback cb; 10147173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner 10247173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner switch (type) { 10347173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner case SELINUX_CB_LOG: 10447173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner cb.func_log = selinux_log; 10547173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner break; 10647173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner case SELINUX_CB_AUDIT: 10747173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner cb.func_audit = selinux_audit; 10847173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner break; 10947173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner case SELINUX_CB_VALIDATE: 11047173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner cb.func_validate = selinux_validate; 11147173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner break; 11247173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner case SELINUX_CB_SETENFORCE: 11347173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner cb.func_setenforce = selinux_netlink_setenforce; 11447173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner break; 11547173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner case SELINUX_CB_POLICYLOAD: 11647173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner cb.func_policyload = selinux_netlink_policyload; 11747173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner break; 11847173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner default: 11947173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner memset(&cb, 0, sizeof(cb)); 12047173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner errno = EINVAL; 12147173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner break; 12247173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner } 12347173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner return cb; 12447173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner} 125