1*2d543d20SAndroid Build Coastguard Worker /* Copyright (C) 2005 Red Hat, Inc. */
2*2d543d20SAndroid Build Coastguard Worker
3*2d543d20SAndroid Build Coastguard Worker struct semanage_port;
4*2d543d20SAndroid Build Coastguard Worker struct semanage_port_key;
5*2d543d20SAndroid Build Coastguard Worker typedef struct semanage_port_key record_key_t;
6*2d543d20SAndroid Build Coastguard Worker typedef struct semanage_port record_t;
7*2d543d20SAndroid Build Coastguard Worker #define DBASE_RECORD_DEFINED
8*2d543d20SAndroid Build Coastguard Worker
9*2d543d20SAndroid Build Coastguard Worker #include <stdlib.h>
10*2d543d20SAndroid Build Coastguard Worker #include "port_internal.h"
11*2d543d20SAndroid Build Coastguard Worker #include "debug.h"
12*2d543d20SAndroid Build Coastguard Worker #include "handle.h"
13*2d543d20SAndroid Build Coastguard Worker #include "database.h"
14*2d543d20SAndroid Build Coastguard Worker
semanage_port_modify_local(semanage_handle_t * handle,const semanage_port_key_t * key,const semanage_port_t * data)15*2d543d20SAndroid Build Coastguard Worker int semanage_port_modify_local(semanage_handle_t * handle,
16*2d543d20SAndroid Build Coastguard Worker const semanage_port_key_t * key,
17*2d543d20SAndroid Build Coastguard Worker const semanage_port_t * data)
18*2d543d20SAndroid Build Coastguard Worker {
19*2d543d20SAndroid Build Coastguard Worker
20*2d543d20SAndroid Build Coastguard Worker dbase_config_t *dconfig = semanage_port_dbase_local(handle);
21*2d543d20SAndroid Build Coastguard Worker return dbase_modify(handle, dconfig, key, data);
22*2d543d20SAndroid Build Coastguard Worker }
23*2d543d20SAndroid Build Coastguard Worker
semanage_port_del_local(semanage_handle_t * handle,const semanage_port_key_t * key)24*2d543d20SAndroid Build Coastguard Worker int semanage_port_del_local(semanage_handle_t * handle,
25*2d543d20SAndroid Build Coastguard Worker const semanage_port_key_t * key)
26*2d543d20SAndroid Build Coastguard Worker {
27*2d543d20SAndroid Build Coastguard Worker
28*2d543d20SAndroid Build Coastguard Worker dbase_config_t *dconfig = semanage_port_dbase_local(handle);
29*2d543d20SAndroid Build Coastguard Worker return dbase_del(handle, dconfig, key);
30*2d543d20SAndroid Build Coastguard Worker }
31*2d543d20SAndroid Build Coastguard Worker
semanage_port_query_local(semanage_handle_t * handle,const semanage_port_key_t * key,semanage_port_t ** response)32*2d543d20SAndroid Build Coastguard Worker int semanage_port_query_local(semanage_handle_t * handle,
33*2d543d20SAndroid Build Coastguard Worker const semanage_port_key_t * key,
34*2d543d20SAndroid Build Coastguard Worker semanage_port_t ** response)
35*2d543d20SAndroid Build Coastguard Worker {
36*2d543d20SAndroid Build Coastguard Worker
37*2d543d20SAndroid Build Coastguard Worker dbase_config_t *dconfig = semanage_port_dbase_local(handle);
38*2d543d20SAndroid Build Coastguard Worker return dbase_query(handle, dconfig, key, response);
39*2d543d20SAndroid Build Coastguard Worker }
40*2d543d20SAndroid Build Coastguard Worker
semanage_port_exists_local(semanage_handle_t * handle,const semanage_port_key_t * key,int * response)41*2d543d20SAndroid Build Coastguard Worker int semanage_port_exists_local(semanage_handle_t * handle,
42*2d543d20SAndroid Build Coastguard Worker const semanage_port_key_t * key, int *response)
43*2d543d20SAndroid Build Coastguard Worker {
44*2d543d20SAndroid Build Coastguard Worker
45*2d543d20SAndroid Build Coastguard Worker dbase_config_t *dconfig = semanage_port_dbase_local(handle);
46*2d543d20SAndroid Build Coastguard Worker return dbase_exists(handle, dconfig, key, response);
47*2d543d20SAndroid Build Coastguard Worker }
48*2d543d20SAndroid Build Coastguard Worker
semanage_port_count_local(semanage_handle_t * handle,unsigned int * response)49*2d543d20SAndroid Build Coastguard Worker int semanage_port_count_local(semanage_handle_t * handle,
50*2d543d20SAndroid Build Coastguard Worker unsigned int *response)
51*2d543d20SAndroid Build Coastguard Worker {
52*2d543d20SAndroid Build Coastguard Worker
53*2d543d20SAndroid Build Coastguard Worker dbase_config_t *dconfig = semanage_port_dbase_local(handle);
54*2d543d20SAndroid Build Coastguard Worker return dbase_count(handle, dconfig, response);
55*2d543d20SAndroid Build Coastguard Worker }
56*2d543d20SAndroid Build Coastguard Worker
semanage_port_iterate_local(semanage_handle_t * handle,int (* handler)(const semanage_port_t * record,void * varg),void * handler_arg)57*2d543d20SAndroid Build Coastguard Worker int semanage_port_iterate_local(semanage_handle_t * handle,
58*2d543d20SAndroid Build Coastguard Worker int (*handler) (const semanage_port_t * record,
59*2d543d20SAndroid Build Coastguard Worker void *varg), void *handler_arg)
60*2d543d20SAndroid Build Coastguard Worker {
61*2d543d20SAndroid Build Coastguard Worker
62*2d543d20SAndroid Build Coastguard Worker dbase_config_t *dconfig = semanage_port_dbase_local(handle);
63*2d543d20SAndroid Build Coastguard Worker return dbase_iterate(handle, dconfig, handler, handler_arg);
64*2d543d20SAndroid Build Coastguard Worker }
65*2d543d20SAndroid Build Coastguard Worker
semanage_port_list_local(semanage_handle_t * handle,semanage_port_t *** records,unsigned int * count)66*2d543d20SAndroid Build Coastguard Worker int semanage_port_list_local(semanage_handle_t * handle,
67*2d543d20SAndroid Build Coastguard Worker semanage_port_t *** records, unsigned int *count)
68*2d543d20SAndroid Build Coastguard Worker {
69*2d543d20SAndroid Build Coastguard Worker
70*2d543d20SAndroid Build Coastguard Worker dbase_config_t *dconfig = semanage_port_dbase_local(handle);
71*2d543d20SAndroid Build Coastguard Worker return dbase_list(handle, dconfig, records, count);
72*2d543d20SAndroid Build Coastguard Worker }
73*2d543d20SAndroid Build Coastguard Worker
74*2d543d20SAndroid Build Coastguard Worker
semanage_port_validate_local(semanage_handle_t * handle)75*2d543d20SAndroid Build Coastguard Worker int semanage_port_validate_local(semanage_handle_t * handle)
76*2d543d20SAndroid Build Coastguard Worker {
77*2d543d20SAndroid Build Coastguard Worker
78*2d543d20SAndroid Build Coastguard Worker semanage_port_t **ports = NULL;
79*2d543d20SAndroid Build Coastguard Worker unsigned int nports = 0;
80*2d543d20SAndroid Build Coastguard Worker unsigned int i = 0, j = 0;
81*2d543d20SAndroid Build Coastguard Worker
82*2d543d20SAndroid Build Coastguard Worker /* List and sort the ports */
83*2d543d20SAndroid Build Coastguard Worker if (semanage_port_list_local(handle, &ports, &nports) < 0)
84*2d543d20SAndroid Build Coastguard Worker goto err;
85*2d543d20SAndroid Build Coastguard Worker qsort(ports, nports, sizeof(semanage_port_t *),
86*2d543d20SAndroid Build Coastguard Worker (int (*)(const void *, const void *))
87*2d543d20SAndroid Build Coastguard Worker &semanage_port_compare2_qsort);
88*2d543d20SAndroid Build Coastguard Worker
89*2d543d20SAndroid Build Coastguard Worker /* Test each port for overlap */
90*2d543d20SAndroid Build Coastguard Worker while (i < nports) {
91*2d543d20SAndroid Build Coastguard Worker
92*2d543d20SAndroid Build Coastguard Worker int proto = semanage_port_get_proto(ports[i]);
93*2d543d20SAndroid Build Coastguard Worker int low = semanage_port_get_low(ports[i]);
94*2d543d20SAndroid Build Coastguard Worker int high = semanage_port_get_high(ports[i]);
95*2d543d20SAndroid Build Coastguard Worker const char *proto_str = semanage_port_get_proto_str(proto);
96*2d543d20SAndroid Build Coastguard Worker
97*2d543d20SAndroid Build Coastguard Worker const char *proto_str2;
98*2d543d20SAndroid Build Coastguard Worker int proto2, low2, high2;
99*2d543d20SAndroid Build Coastguard Worker
100*2d543d20SAndroid Build Coastguard Worker /* Find the first port with matching
101*2d543d20SAndroid Build Coastguard Worker protocol to compare against */
102*2d543d20SAndroid Build Coastguard Worker do {
103*2d543d20SAndroid Build Coastguard Worker if (j == nports - 1)
104*2d543d20SAndroid Build Coastguard Worker goto next;
105*2d543d20SAndroid Build Coastguard Worker j++;
106*2d543d20SAndroid Build Coastguard Worker proto2 = semanage_port_get_proto(ports[j]);
107*2d543d20SAndroid Build Coastguard Worker low2 = semanage_port_get_low(ports[j]);
108*2d543d20SAndroid Build Coastguard Worker high2 = semanage_port_get_high(ports[j]);
109*2d543d20SAndroid Build Coastguard Worker proto_str2 = semanage_port_get_proto_str(proto2);
110*2d543d20SAndroid Build Coastguard Worker
111*2d543d20SAndroid Build Coastguard Worker } while (proto != proto2);
112*2d543d20SAndroid Build Coastguard Worker
113*2d543d20SAndroid Build Coastguard Worker /* Overlap detected */
114*2d543d20SAndroid Build Coastguard Worker if (low2 <= high) {
115*2d543d20SAndroid Build Coastguard Worker ERR(handle, "port overlap between ranges "
116*2d543d20SAndroid Build Coastguard Worker "%u - %u (%s) <--> %u - %u (%s).",
117*2d543d20SAndroid Build Coastguard Worker low, high, proto_str, low2, high2, proto_str2);
118*2d543d20SAndroid Build Coastguard Worker goto invalid;
119*2d543d20SAndroid Build Coastguard Worker }
120*2d543d20SAndroid Build Coastguard Worker
121*2d543d20SAndroid Build Coastguard Worker /* If closest port of matching protocol doesn't overlap with
122*2d543d20SAndroid Build Coastguard Worker * test port, neither do the rest of them, because that's
123*2d543d20SAndroid Build Coastguard Worker * how the sort function works on ports - lower bound
124*2d543d20SAndroid Build Coastguard Worker * ports come first */
125*2d543d20SAndroid Build Coastguard Worker next:
126*2d543d20SAndroid Build Coastguard Worker i++;
127*2d543d20SAndroid Build Coastguard Worker j = i;
128*2d543d20SAndroid Build Coastguard Worker }
129*2d543d20SAndroid Build Coastguard Worker
130*2d543d20SAndroid Build Coastguard Worker for (i = 0; i < nports; i++)
131*2d543d20SAndroid Build Coastguard Worker semanage_port_free(ports[i]);
132*2d543d20SAndroid Build Coastguard Worker free(ports);
133*2d543d20SAndroid Build Coastguard Worker return STATUS_SUCCESS;
134*2d543d20SAndroid Build Coastguard Worker
135*2d543d20SAndroid Build Coastguard Worker err:
136*2d543d20SAndroid Build Coastguard Worker ERR(handle, "could not complete ports validity check");
137*2d543d20SAndroid Build Coastguard Worker
138*2d543d20SAndroid Build Coastguard Worker invalid:
139*2d543d20SAndroid Build Coastguard Worker for (i = 0; i < nports; i++)
140*2d543d20SAndroid Build Coastguard Worker semanage_port_free(ports[i]);
141*2d543d20SAndroid Build Coastguard Worker free(ports);
142*2d543d20SAndroid Build Coastguard Worker return STATUS_ERR;
143*2d543d20SAndroid Build Coastguard Worker }
144