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