Home | History | Annotate | Download | only in src
      1 #include <stdlib.h>
      2 #include <string.h>
      3 
      4 #include "iface_internal.h"
      5 #include "context_internal.h"
      6 #include "debug.h"
      7 
      8 struct sepol_iface {
      9 
     10 	/* Interface name */
     11 	char *name;
     12 
     13 	/* Interface context */
     14 	sepol_context_t *netif_con;
     15 
     16 	/* Message context */
     17 	sepol_context_t *netmsg_con;
     18 };
     19 
     20 struct sepol_iface_key {
     21 
     22 	/* Interface name */
     23 	const char *name;
     24 };
     25 
     26 /* Key */
     27 int sepol_iface_key_create(sepol_handle_t * handle,
     28 			   const char *name, sepol_iface_key_t ** key_ptr)
     29 {
     30 
     31 	sepol_iface_key_t *tmp_key =
     32 	    (sepol_iface_key_t *) malloc(sizeof(sepol_iface_key_t));
     33 
     34 	if (!tmp_key) {
     35 		ERR(handle, "out of memory, could not create interface key");
     36 		return STATUS_ERR;
     37 	}
     38 
     39 	tmp_key->name = name;
     40 
     41 	*key_ptr = tmp_key;
     42 	return STATUS_SUCCESS;
     43 }
     44 
     45 hidden_def(sepol_iface_key_create)
     46 
     47 void sepol_iface_key_unpack(const sepol_iface_key_t * key, const char **name)
     48 {
     49 
     50 	*name = key->name;
     51 }
     52 
     53 hidden_def(sepol_iface_key_unpack)
     54 
     55 int sepol_iface_key_extract(sepol_handle_t * handle,
     56 			    const sepol_iface_t * iface,
     57 			    sepol_iface_key_t ** key_ptr)
     58 {
     59 
     60 	if (sepol_iface_key_create(handle, iface->name, key_ptr) < 0) {
     61 		ERR(handle, "could not extract key from "
     62 		    "interface %s", iface->name);
     63 		return STATUS_ERR;
     64 	}
     65 
     66 	return STATUS_SUCCESS;
     67 }
     68 
     69 void sepol_iface_key_free(sepol_iface_key_t * key)
     70 {
     71 	free(key);
     72 }
     73 
     74 int sepol_iface_compare(const sepol_iface_t * iface,
     75 			const sepol_iface_key_t * key)
     76 {
     77 
     78 	return strcmp(iface->name, key->name);
     79 }
     80 
     81 int sepol_iface_compare2(const sepol_iface_t * iface,
     82 			 const sepol_iface_t * iface2)
     83 {
     84 
     85 	return strcmp(iface->name, iface2->name);
     86 }
     87 
     88 /* Create */
     89 int sepol_iface_create(sepol_handle_t * handle, sepol_iface_t ** iface)
     90 {
     91 
     92 	sepol_iface_t *tmp_iface =
     93 	    (sepol_iface_t *) malloc(sizeof(sepol_iface_t));
     94 
     95 	if (!tmp_iface) {
     96 		ERR(handle, "out of memory, could not create "
     97 		    "interface record");
     98 		return STATUS_ERR;
     99 	}
    100 
    101 	tmp_iface->name = NULL;
    102 	tmp_iface->netif_con = NULL;
    103 	tmp_iface->netmsg_con = NULL;
    104 	*iface = tmp_iface;
    105 
    106 	return STATUS_SUCCESS;
    107 }
    108 
    109 hidden_def(sepol_iface_create)
    110 
    111 /* Name */
    112 const char *sepol_iface_get_name(const sepol_iface_t * iface)
    113 {
    114 
    115 	return iface->name;
    116 }
    117 
    118 hidden_def(sepol_iface_get_name)
    119 
    120 int sepol_iface_set_name(sepol_handle_t * handle,
    121 			 sepol_iface_t * iface, const char *name)
    122 {
    123 
    124 	char *tmp_name = strdup(name);
    125 	if (!tmp_name) {
    126 		ERR(handle, "out of memory, " "could not set interface name");
    127 		return STATUS_ERR;
    128 	}
    129 	free(iface->name);
    130 	iface->name = tmp_name;
    131 	return STATUS_SUCCESS;
    132 }
    133 
    134 hidden_def(sepol_iface_set_name)
    135 
    136 /* Interface Context */
    137 sepol_context_t *sepol_iface_get_ifcon(const sepol_iface_t * iface)
    138 {
    139 
    140 	return iface->netif_con;
    141 }
    142 
    143 hidden_def(sepol_iface_get_ifcon)
    144 
    145 int sepol_iface_set_ifcon(sepol_handle_t * handle,
    146 			  sepol_iface_t * iface, sepol_context_t * con)
    147 {
    148 
    149 	sepol_context_t *newcon;
    150 
    151 	if (sepol_context_clone(handle, con, &newcon) < 0) {
    152 		ERR(handle, "out of memory, could not set interface context");
    153 		return STATUS_ERR;
    154 	}
    155 
    156 	sepol_context_free(iface->netif_con);
    157 	iface->netif_con = newcon;
    158 	return STATUS_SUCCESS;
    159 }
    160 
    161 hidden_def(sepol_iface_set_ifcon)
    162 
    163 /* Message Context */
    164 sepol_context_t *sepol_iface_get_msgcon(const sepol_iface_t * iface)
    165 {
    166 
    167 	return iface->netmsg_con;
    168 }
    169 
    170 hidden_def(sepol_iface_get_msgcon)
    171 
    172 int sepol_iface_set_msgcon(sepol_handle_t * handle,
    173 			   sepol_iface_t * iface, sepol_context_t * con)
    174 {
    175 
    176 	sepol_context_t *newcon;
    177 	if (sepol_context_clone(handle, con, &newcon) < 0) {
    178 		ERR(handle, "out of memory, could not set message context");
    179 		return STATUS_ERR;
    180 	}
    181 
    182 	sepol_context_free(iface->netmsg_con);
    183 	iface->netmsg_con = newcon;
    184 	return STATUS_SUCCESS;
    185 }
    186 
    187 hidden_def(sepol_iface_set_msgcon)
    188 
    189 /* Deep copy clone */
    190 int sepol_iface_clone(sepol_handle_t * handle,
    191 		      const sepol_iface_t * iface, sepol_iface_t ** iface_ptr)
    192 {
    193 
    194 	sepol_iface_t *new_iface = NULL;
    195 	if (sepol_iface_create(handle, &new_iface) < 0)
    196 		goto err;
    197 
    198 	if (sepol_iface_set_name(handle, new_iface, iface->name) < 0)
    199 		goto err;
    200 
    201 	if (iface->netif_con &&
    202 	    (sepol_context_clone
    203 	     (handle, iface->netif_con, &new_iface->netif_con) < 0))
    204 		goto err;
    205 
    206 	if (iface->netmsg_con &&
    207 	    (sepol_context_clone
    208 	     (handle, iface->netmsg_con, &new_iface->netmsg_con) < 0))
    209 		goto err;
    210 
    211 	*iface_ptr = new_iface;
    212 	return STATUS_SUCCESS;
    213 
    214       err:
    215 	ERR(handle, "could not clone interface record");
    216 	sepol_iface_free(new_iface);
    217 	return STATUS_ERR;
    218 }
    219 
    220 /* Destroy */
    221 void sepol_iface_free(sepol_iface_t * iface)
    222 {
    223 
    224 	if (!iface)
    225 		return;
    226 
    227 	free(iface->name);
    228 	sepol_context_free(iface->netif_con);
    229 	sepol_context_free(iface->netmsg_con);
    230 	free(iface);
    231 }
    232 
    233 hidden_def(sepol_iface_free)
    234