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