113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlestruct semanage_fcontext;
213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlestruct semanage_fcontext_key;
313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindletypedef struct semanage_fcontext record_t;
413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindletypedef struct semanage_fcontext_key record_key_t;
513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#define DBASE_RECORD_DEFINED
613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <stdlib.h>
813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include <string.h>
913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include "fcontext_internal.h"
1013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include "context_internal.h"
1113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle#include "debug.h"
1213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
1313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlestruct semanage_fcontext {
1413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
1513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Matching expression */
1613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	char *expr;
1713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
1813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Type of object */
1913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int type;
2013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
2113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Context */
2213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	semanage_context_t *con;
2313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle};
2413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
2513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlestruct semanage_fcontext_key {
2613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
2713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Matching expression */
28c4f415c2444874488e9a9ae2e02a7cbeea583ba2Sven Vermeulen	char *expr;
2913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
3013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	/* Type of object */
3113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int type;
3213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle};
3313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
3413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* Key */
3513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleint semanage_fcontext_key_create(semanage_handle_t * handle,
3613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				 const char *expr,
3713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				 int type, semanage_fcontext_key_t ** key_ptr)
3813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
3913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
4013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	semanage_fcontext_key_t *tmp_key =
4113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	    (semanage_fcontext_key_t *) malloc(sizeof(semanage_fcontext_key_t));
4213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
4313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	if (!tmp_key) {
4413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		ERR(handle, "out of memory, could not "
4513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		    "create file context key");
4613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		return STATUS_ERR;
4713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	}
48c4f415c2444874488e9a9ae2e02a7cbeea583ba2Sven Vermeulen	tmp_key->expr = strdup(expr);
49c4f415c2444874488e9a9ae2e02a7cbeea583ba2Sven Vermeulen	if (!tmp_key->expr) {
50c4f415c2444874488e9a9ae2e02a7cbeea583ba2Sven Vermeulen		ERR(handle, "out of memory, could not create file context key.");
51d0c7f6ea4f4c5bf9e1e21b67231e5b1a88020501Eric Paris		free(tmp_key);
52c4f415c2444874488e9a9ae2e02a7cbeea583ba2Sven Vermeulen		return STATUS_ERR;
53c4f415c2444874488e9a9ae2e02a7cbeea583ba2Sven Vermeulen	}
5413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	tmp_key->type = type;
5513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
5613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	*key_ptr = tmp_key;
5713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	return STATUS_SUCCESS;
5813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
5913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
6013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlehidden_def(semanage_fcontext_key_create)
6113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
6213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleint semanage_fcontext_key_extract(semanage_handle_t * handle,
6313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				  const semanage_fcontext_t * fcontext,
6413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle				  semanage_fcontext_key_t ** key_ptr)
6513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
6613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
6713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	if (semanage_fcontext_key_create(handle, fcontext->expr,
6813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle					 fcontext->type, key_ptr) < 0) {
6913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		ERR(handle, "could not extract key from "
7013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		    "file context %s (%s)", fcontext->expr,
7113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		    semanage_fcontext_get_type_str(fcontext->type));
7213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		return STATUS_ERR;
7313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	}
7413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
7513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	return STATUS_SUCCESS;
7613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
7713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
7813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlehidden_def(semanage_fcontext_key_extract)
7913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
8013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlevoid semanage_fcontext_key_free(semanage_fcontext_key_t * key)
8113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
82c4f415c2444874488e9a9ae2e02a7cbeea583ba2Sven Vermeulen	free(key->expr);
8313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	free(key);
8413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
8513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
8613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlehidden_def(semanage_fcontext_key_free)
8713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
8813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleint semanage_fcontext_compare(const semanage_fcontext_t * fcontext,
8913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			      const semanage_fcontext_key_t * key)
9013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
9113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
9213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int rv = strcmp(fcontext->expr, key->expr);
9313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	if (rv != 0)
9413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		return rv;
9513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	else {
9613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		if (fcontext->type < key->type)
9713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			return -1;
9813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
9913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		else if (key->type < fcontext->type)
10013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			return 1;
10113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
10213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		else
10313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			return 0;
10413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	}
10513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
10613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
10713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlehidden_def(semanage_fcontext_compare)
10813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
10913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleint semanage_fcontext_compare2(const semanage_fcontext_t * fcontext,
11013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			       const semanage_fcontext_t * fcontext2)
11113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
11213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
11313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	int rv = strcmp(fcontext->expr, fcontext2->expr);
11413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	if (rv != 0)
11513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		return rv;
11613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	else {
11713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		if (fcontext->type < fcontext2->type)
11813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			return -1;
11913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
12013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		else if (fcontext2->type < fcontext->type)
12113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			return 1;
12213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
12313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		else
12413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			return 0;
12513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	}
12613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
12713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
12813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlehidden_def(semanage_fcontext_compare2)
12913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
13013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlestatic int semanage_fcontext_compare2_qsort(const semanage_fcontext_t **
13113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle					    fcontext,
13213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle					    const semanage_fcontext_t **
13313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle					    fcontext2)
13413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
13513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
13613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	return semanage_fcontext_compare2(*fcontext, *fcontext2);
13713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
13813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
13913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* Create */
14013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleint semanage_fcontext_create(semanage_handle_t * handle,
14113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			     semanage_fcontext_t ** fcontext)
14213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
14313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
14413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	semanage_fcontext_t *tmp_fcontext =
14513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	    (semanage_fcontext_t *) malloc(sizeof(semanage_fcontext_t));
14613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
14713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	if (!tmp_fcontext) {
14813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		ERR(handle, "out of memory, could not create "
14913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		    "file context record");
15013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		return STATUS_ERR;
15113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	}
15213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
15313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	tmp_fcontext->expr = NULL;
15413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	tmp_fcontext->type = SEMANAGE_FCONTEXT_ALL;
15513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	tmp_fcontext->con = NULL;
15613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	*fcontext = tmp_fcontext;
15713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
15813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	return STATUS_SUCCESS;
15913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
16013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
16113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlehidden_def(semanage_fcontext_create)
16213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
16313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* Regexp */
16413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleconst char *semanage_fcontext_get_expr(const semanage_fcontext_t * fcontext)
16513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
16613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
16713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	return fcontext->expr;
16813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
16913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
17013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlehidden_def(semanage_fcontext_get_expr)
17113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
17213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleint semanage_fcontext_set_expr(semanage_handle_t * handle,
17313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			       semanage_fcontext_t * fcontext, const char *expr)
17413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
17513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
17613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	char *tmp_expr = strdup(expr);
17713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	if (!tmp_expr) {
17813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		ERR(handle, "out of memory, " "could not set regexp string");
17913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		return STATUS_ERR;
18013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	}
18113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	free(fcontext->expr);
18213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	fcontext->expr = tmp_expr;
18313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	return STATUS_SUCCESS;
18413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
18513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
18613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlehidden_def(semanage_fcontext_set_expr)
18713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
18813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* Type */
18913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleint semanage_fcontext_get_type(const semanage_fcontext_t * fcontext)
19013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
19113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
19213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	return fcontext->type;
19313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
19413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
19513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlehidden_def(semanage_fcontext_get_type)
19613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
19713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleconst char *semanage_fcontext_get_type_str(int type)
19813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
19913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
20013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	switch (type) {
20113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	case SEMANAGE_FCONTEXT_ALL:
20213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		return "all files";
20313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	case SEMANAGE_FCONTEXT_REG:
20413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		return "regular file";
20513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	case SEMANAGE_FCONTEXT_DIR:
20613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		return "directory";
20713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	case SEMANAGE_FCONTEXT_CHAR:
20813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		return "character device";
20913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	case SEMANAGE_FCONTEXT_BLOCK:
21013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		return "block device";
21113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	case SEMANAGE_FCONTEXT_SOCK:
21213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		return "socket";
21313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	case SEMANAGE_FCONTEXT_LINK:
21413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		return "symbolic link";
21513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	case SEMANAGE_FCONTEXT_PIPE:
21613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		return "named pipe";
21713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	default:
21813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		return "????";
21913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	}
22013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
22113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
22213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlehidden_def(semanage_fcontext_get_type_str)
22313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
22413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlevoid semanage_fcontext_set_type(semanage_fcontext_t * fcontext, int type)
22513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
22613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
22713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	fcontext->type = type;
22813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
22913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
23013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlehidden_def(semanage_fcontext_set_type)
23113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
23213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* Context */
23313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlesemanage_context_t *semanage_fcontext_get_con(const semanage_fcontext_t *
23413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle					      fcontext)
23513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
23613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
23713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	return fcontext->con;
23813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
23913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
24013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlehidden_def(semanage_fcontext_get_con)
24113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
24213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleint semanage_fcontext_set_con(semanage_handle_t * handle,
24313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			      semanage_fcontext_t * fcontext,
24413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			      semanage_context_t * con)
24513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
24613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
24713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	semanage_context_t *newcon;
24813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
24913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	if (semanage_context_clone(handle, con, &newcon) < 0) {
25013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		ERR(handle, "out of memory, could not set file context");
25113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		return STATUS_ERR;
25213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	}
25313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
25413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	semanage_context_free(fcontext->con);
25513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	fcontext->con = newcon;
25613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	return STATUS_SUCCESS;
25713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
25813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
25913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlehidden_def(semanage_fcontext_set_con)
26013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
26113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* Deep copy clone */
26213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindleint semanage_fcontext_clone(semanage_handle_t * handle,
26313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			    const semanage_fcontext_t * fcontext,
26413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle			    semanage_fcontext_t ** fcontext_ptr)
26513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
26613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
26713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	semanage_fcontext_t *new_fcontext = NULL;
26813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	if (semanage_fcontext_create(handle, &new_fcontext) < 0)
26913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		goto err;
27013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
27113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	if (semanage_fcontext_set_expr(handle, new_fcontext, fcontext->expr) <
27213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	    0)
27313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		goto err;
27413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
27513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	new_fcontext->type = fcontext->type;
27613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
27713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	if (fcontext->con &&
27813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	    (semanage_context_clone(handle, fcontext->con, &new_fcontext->con) <
27913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	     0))
28013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		goto err;
28113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
28213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	*fcontext_ptr = new_fcontext;
28313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	return STATUS_SUCCESS;
28413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
28513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle      err:
28613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	ERR(handle, "could not clone file context record");
28713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	semanage_fcontext_free(new_fcontext);
28813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	return STATUS_ERR;
28913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
29013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
29113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlehidden_def(semanage_fcontext_clone)
29213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
29313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* Destroy */
29413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlevoid semanage_fcontext_free(semanage_fcontext_t * fcontext)
29513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle{
29613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
29713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	if (!fcontext)
29813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle		return;
29913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
30013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	free(fcontext->expr);
30113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	semanage_context_free(fcontext->con);
30213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	free(fcontext);
30313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle}
30413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
30513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlehidden_def(semanage_fcontext_free)
30613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle
30713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle/* Record base functions */
30813cd4c8960688af11ad23b4c946149015c80d54Joshua Brindlerecord_table_t SEMANAGE_FCONTEXT_RTABLE = {
30913cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	.create = semanage_fcontext_create,
31013cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	.key_extract = semanage_fcontext_key_extract,
31113cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	.key_free = semanage_fcontext_key_free,
31213cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	.clone = semanage_fcontext_clone,
31313cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	.compare = semanage_fcontext_compare,
31413cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	.compare2 = semanage_fcontext_compare2,
31513cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	.compare2_qsort = semanage_fcontext_compare2_qsort,
31613cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle	.free = semanage_fcontext_free,
31713cd4c8960688af11ad23b4c946149015c80d54Joshua Brindle};
318