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