147173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner/*
247173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner * This file describes the internal interface used by the labeler
347173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner * for calling the user-supplied memory allocation, validation,
447173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner * and locking routine.
547173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner *
647173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner * Author : Eamon Walsh <ewalsh@epoch.ncsc.mil>
747173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner */
847173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner#ifndef _SELABEL_INTERNAL_H_
947173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner#define _SELABEL_INTERNAL_H_
1047173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner
1147173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner#include <stdlib.h>
1247173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner#include <stdarg.h>
1347173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner#include <selinux/selinux.h>
1447173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner#include <selinux/label.h>
1547173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner#include "dso.h"
1647173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner
1747173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner/*
1847173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner * Installed backends
1947173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner */
2047173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerint selabel_file_init(struct selabel_handle *rec, const struct selinux_opt *opts,
2147173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner		      unsigned nopts) hidden;
2247173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerint selabel_media_init(struct selabel_handle *rec, const struct selinux_opt *opts,
2347173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner		      unsigned nopts) hidden;
2447173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerint selabel_x_init(struct selabel_handle *rec, const struct selinux_opt *opts,
2547173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner		   unsigned nopts) hidden;
2647173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerint selabel_db_init(struct selabel_handle *rec,
2747173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner		    const struct selinux_opt *opts, unsigned nopts) hidden;
2847173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerint selabel_property_init(struct selabel_handle *rec,
2947173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner			  const struct selinux_opt *opts, unsigned nopts) hidden;
3047173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner
3147173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner/*
3247173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner * Labeling internal structures
3347173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner */
3447173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerstruct selabel_sub {
3547173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner	char *src;
3647173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner	int slen;
3747173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner	char *dst;
3847173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner	struct selabel_sub *next;
3947173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner};
4047173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner
4147173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerstruct selabel_lookup_rec {
4247173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner	char * ctx_raw;
4347173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner	char * ctx_trans;
4447173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner	int validated;
4547173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner};
4647173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner
4747173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerstruct selabel_handle {
4847173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner	/* arguments that were passed to selabel_open */
4947173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner	unsigned int backend;
5047173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner	int validating;
5147173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner
5247173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner	/* labeling operations */
5347173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner	struct selabel_lookup_rec *(*func_lookup) (struct selabel_handle *h,
5447173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner						   const char *key, int type);
5547173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner	void (*func_close) (struct selabel_handle *h);
5647173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner	void (*func_stats) (struct selabel_handle *h);
5747173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner	bool (*func_partial_match) (struct selabel_handle *h, const char *key);
5847173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner
5947173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner	/* supports backend-specific state information */
6047173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner	void *data;
6147173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner
6247173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner	/* substitution support */
6347173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner	struct selabel_sub *subs;
6447173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner};
6547173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner
6647173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner/*
6747173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner * Validation function
6847173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner */
6947173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerextern int
7047173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turnerselabel_validate(struct selabel_handle *rec,
7147173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner		 struct selabel_lookup_rec *contexts) hidden;
7247173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner
7347173c7d6704f1258b2d85537caa09185f6920c8David 'Digit' Turner#endif				/* _SELABEL_INTERNAL_H_ */
74