1*2d543d20SAndroid Build Coastguard Worker /* Copyright (C) 2017 Mellanox Technologies Inc */
2*2d543d20SAndroid Build Coastguard Worker
3*2d543d20SAndroid Build Coastguard Worker struct semanage_ibendport;
4*2d543d20SAndroid Build Coastguard Worker struct semanage_ibendport_key;
5*2d543d20SAndroid Build Coastguard Worker typedef struct semanage_ibendport_key record_key_t;
6*2d543d20SAndroid Build Coastguard Worker typedef struct semanage_ibendport 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 <string.h>
11*2d543d20SAndroid Build Coastguard Worker #include <sepol/policydb.h>
12*2d543d20SAndroid Build Coastguard Worker #include "ibendport_internal.h"
13*2d543d20SAndroid Build Coastguard Worker #include "debug.h"
14*2d543d20SAndroid Build Coastguard Worker #include "handle.h"
15*2d543d20SAndroid Build Coastguard Worker #include "database.h"
16*2d543d20SAndroid Build Coastguard Worker
semanage_ibendport_modify_local(semanage_handle_t * handle,const semanage_ibendport_key_t * key,const semanage_ibendport_t * data)17*2d543d20SAndroid Build Coastguard Worker int semanage_ibendport_modify_local(semanage_handle_t *handle,
18*2d543d20SAndroid Build Coastguard Worker const semanage_ibendport_key_t *key,
19*2d543d20SAndroid Build Coastguard Worker const semanage_ibendport_t *data)
20*2d543d20SAndroid Build Coastguard Worker {
21*2d543d20SAndroid Build Coastguard Worker dbase_config_t *dconfig = semanage_ibendport_dbase_local(handle);
22*2d543d20SAndroid Build Coastguard Worker
23*2d543d20SAndroid Build Coastguard Worker return dbase_modify(handle, dconfig, key, data);
24*2d543d20SAndroid Build Coastguard Worker }
25*2d543d20SAndroid Build Coastguard Worker
semanage_ibendport_del_local(semanage_handle_t * handle,const semanage_ibendport_key_t * key)26*2d543d20SAndroid Build Coastguard Worker int semanage_ibendport_del_local(semanage_handle_t *handle,
27*2d543d20SAndroid Build Coastguard Worker const semanage_ibendport_key_t *key)
28*2d543d20SAndroid Build Coastguard Worker {
29*2d543d20SAndroid Build Coastguard Worker dbase_config_t *dconfig = semanage_ibendport_dbase_local(handle);
30*2d543d20SAndroid Build Coastguard Worker
31*2d543d20SAndroid Build Coastguard Worker return dbase_del(handle, dconfig, key);
32*2d543d20SAndroid Build Coastguard Worker }
33*2d543d20SAndroid Build Coastguard Worker
semanage_ibendport_query_local(semanage_handle_t * handle,const semanage_ibendport_key_t * key,semanage_ibendport_t ** response)34*2d543d20SAndroid Build Coastguard Worker int semanage_ibendport_query_local(semanage_handle_t *handle,
35*2d543d20SAndroid Build Coastguard Worker const semanage_ibendport_key_t *key,
36*2d543d20SAndroid Build Coastguard Worker semanage_ibendport_t **response)
37*2d543d20SAndroid Build Coastguard Worker {
38*2d543d20SAndroid Build Coastguard Worker dbase_config_t *dconfig = semanage_ibendport_dbase_local(handle);
39*2d543d20SAndroid Build Coastguard Worker
40*2d543d20SAndroid Build Coastguard Worker return dbase_query(handle, dconfig, key, response);
41*2d543d20SAndroid Build Coastguard Worker }
42*2d543d20SAndroid Build Coastguard Worker
semanage_ibendport_exists_local(semanage_handle_t * handle,const semanage_ibendport_key_t * key,int * response)43*2d543d20SAndroid Build Coastguard Worker int semanage_ibendport_exists_local(semanage_handle_t *handle,
44*2d543d20SAndroid Build Coastguard Worker const semanage_ibendport_key_t *key,
45*2d543d20SAndroid Build Coastguard Worker int *response)
46*2d543d20SAndroid Build Coastguard Worker {
47*2d543d20SAndroid Build Coastguard Worker dbase_config_t *dconfig = semanage_ibendport_dbase_local(handle);
48*2d543d20SAndroid Build Coastguard Worker
49*2d543d20SAndroid Build Coastguard Worker return dbase_exists(handle, dconfig, key, response);
50*2d543d20SAndroid Build Coastguard Worker }
51*2d543d20SAndroid Build Coastguard Worker
semanage_ibendport_count_local(semanage_handle_t * handle,unsigned int * response)52*2d543d20SAndroid Build Coastguard Worker int semanage_ibendport_count_local(semanage_handle_t *handle,
53*2d543d20SAndroid Build Coastguard Worker unsigned int *response)
54*2d543d20SAndroid Build Coastguard Worker {
55*2d543d20SAndroid Build Coastguard Worker dbase_config_t *dconfig = semanage_ibendport_dbase_local(handle);
56*2d543d20SAndroid Build Coastguard Worker
57*2d543d20SAndroid Build Coastguard Worker return dbase_count(handle, dconfig, response);
58*2d543d20SAndroid Build Coastguard Worker }
59*2d543d20SAndroid Build Coastguard Worker
semanage_ibendport_iterate_local(semanage_handle_t * handle,int (* handler)(const semanage_ibendport_t * record,void * varg),void * handler_arg)60*2d543d20SAndroid Build Coastguard Worker int semanage_ibendport_iterate_local(semanage_handle_t *handle,
61*2d543d20SAndroid Build Coastguard Worker int (*handler)(const semanage_ibendport_t *record,
62*2d543d20SAndroid Build Coastguard Worker void *varg), void *handler_arg)
63*2d543d20SAndroid Build Coastguard Worker {
64*2d543d20SAndroid Build Coastguard Worker dbase_config_t *dconfig = semanage_ibendport_dbase_local(handle);
65*2d543d20SAndroid Build Coastguard Worker return dbase_iterate(handle, dconfig, handler, handler_arg);
66*2d543d20SAndroid Build Coastguard Worker }
67*2d543d20SAndroid Build Coastguard Worker
semanage_ibendport_list_local(semanage_handle_t * handle,semanage_ibendport_t *** records,unsigned int * count)68*2d543d20SAndroid Build Coastguard Worker int semanage_ibendport_list_local(semanage_handle_t *handle,
69*2d543d20SAndroid Build Coastguard Worker semanage_ibendport_t ***records,
70*2d543d20SAndroid Build Coastguard Worker unsigned int *count)
71*2d543d20SAndroid Build Coastguard Worker {
72*2d543d20SAndroid Build Coastguard Worker dbase_config_t *dconfig = semanage_ibendport_dbase_local(handle);
73*2d543d20SAndroid Build Coastguard Worker
74*2d543d20SAndroid Build Coastguard Worker return dbase_list(handle, dconfig, records, count);
75*2d543d20SAndroid Build Coastguard Worker }
76*2d543d20SAndroid Build Coastguard Worker
77*2d543d20SAndroid Build Coastguard Worker
semanage_ibendport_validate_local(semanage_handle_t * handle)78*2d543d20SAndroid Build Coastguard Worker int semanage_ibendport_validate_local(semanage_handle_t *handle)
79*2d543d20SAndroid Build Coastguard Worker {
80*2d543d20SAndroid Build Coastguard Worker semanage_ibendport_t **ibendports = NULL;
81*2d543d20SAndroid Build Coastguard Worker unsigned int nibendports = 0;
82*2d543d20SAndroid Build Coastguard Worker unsigned int i = 0, j = 0;
83*2d543d20SAndroid Build Coastguard Worker char *ibdev_name;
84*2d543d20SAndroid Build Coastguard Worker char *ibdev_name2;
85*2d543d20SAndroid Build Coastguard Worker int port;
86*2d543d20SAndroid Build Coastguard Worker int port2;
87*2d543d20SAndroid Build Coastguard Worker
88*2d543d20SAndroid Build Coastguard Worker /* List and sort the ibendports */
89*2d543d20SAndroid Build Coastguard Worker if (semanage_ibendport_list_local(handle, &ibendports, &nibendports) < 0)
90*2d543d20SAndroid Build Coastguard Worker goto err;
91*2d543d20SAndroid Build Coastguard Worker
92*2d543d20SAndroid Build Coastguard Worker qsort(ibendports, nibendports, sizeof(semanage_ibendport_t *),
93*2d543d20SAndroid Build Coastguard Worker (int (*)(const void *, const void *))
94*2d543d20SAndroid Build Coastguard Worker &semanage_ibendport_compare2_qsort);
95*2d543d20SAndroid Build Coastguard Worker
96*2d543d20SAndroid Build Coastguard Worker /* Test each ibendport */
97*2d543d20SAndroid Build Coastguard Worker while (i < nibendports) {
98*2d543d20SAndroid Build Coastguard Worker int stop = 0;
99*2d543d20SAndroid Build Coastguard Worker
100*2d543d20SAndroid Build Coastguard Worker if (STATUS_SUCCESS !=
101*2d543d20SAndroid Build Coastguard Worker semanage_ibendport_get_ibdev_name(handle,
102*2d543d20SAndroid Build Coastguard Worker ibendports[i],
103*2d543d20SAndroid Build Coastguard Worker &ibdev_name)) {
104*2d543d20SAndroid Build Coastguard Worker ERR(handle, "Couldn't get IB device name");
105*2d543d20SAndroid Build Coastguard Worker goto err;
106*2d543d20SAndroid Build Coastguard Worker }
107*2d543d20SAndroid Build Coastguard Worker
108*2d543d20SAndroid Build Coastguard Worker port = semanage_ibendport_get_port(ibendports[i]);
109*2d543d20SAndroid Build Coastguard Worker
110*2d543d20SAndroid Build Coastguard Worker /* Find the first ibendport with matching
111*2d543d20SAndroid Build Coastguard Worker * ibdev_name to compare against
112*2d543d20SAndroid Build Coastguard Worker */
113*2d543d20SAndroid Build Coastguard Worker do {
114*2d543d20SAndroid Build Coastguard Worker if (j == nibendports - 1)
115*2d543d20SAndroid Build Coastguard Worker goto next;
116*2d543d20SAndroid Build Coastguard Worker j++;
117*2d543d20SAndroid Build Coastguard Worker if (STATUS_SUCCESS !=
118*2d543d20SAndroid Build Coastguard Worker semanage_ibendport_get_ibdev_name(handle,
119*2d543d20SAndroid Build Coastguard Worker ibendports[j],
120*2d543d20SAndroid Build Coastguard Worker &ibdev_name2)) {
121*2d543d20SAndroid Build Coastguard Worker ERR(handle, "Couldn't get IB device name.");
122*2d543d20SAndroid Build Coastguard Worker goto err;
123*2d543d20SAndroid Build Coastguard Worker }
124*2d543d20SAndroid Build Coastguard Worker port2 = semanage_ibendport_get_port(ibendports[j]);
125*2d543d20SAndroid Build Coastguard Worker
126*2d543d20SAndroid Build Coastguard Worker stop = !strcmp(ibdev_name, ibdev_name2);
127*2d543d20SAndroid Build Coastguard Worker } while (!stop);
128*2d543d20SAndroid Build Coastguard Worker
129*2d543d20SAndroid Build Coastguard Worker if (port == port2) {
130*2d543d20SAndroid Build Coastguard Worker ERR(handle, "ibendport %s/%u already exists.",
131*2d543d20SAndroid Build Coastguard Worker ibdev_name2, port2);
132*2d543d20SAndroid Build Coastguard Worker goto invalid;
133*2d543d20SAndroid Build Coastguard Worker }
134*2d543d20SAndroid Build Coastguard Worker next:
135*2d543d20SAndroid Build Coastguard Worker i++;
136*2d543d20SAndroid Build Coastguard Worker j = i;
137*2d543d20SAndroid Build Coastguard Worker }
138*2d543d20SAndroid Build Coastguard Worker
139*2d543d20SAndroid Build Coastguard Worker for (i = 0; i < nibendports; i++)
140*2d543d20SAndroid Build Coastguard Worker semanage_ibendport_free(ibendports[i]);
141*2d543d20SAndroid Build Coastguard Worker free(ibendports);
142*2d543d20SAndroid Build Coastguard Worker return STATUS_SUCCESS;
143*2d543d20SAndroid Build Coastguard Worker
144*2d543d20SAndroid Build Coastguard Worker err:
145*2d543d20SAndroid Build Coastguard Worker ERR(handle, "could not complete ibendports validity check");
146*2d543d20SAndroid Build Coastguard Worker
147*2d543d20SAndroid Build Coastguard Worker invalid:
148*2d543d20SAndroid Build Coastguard Worker for (i = 0; i < nibendports; i++)
149*2d543d20SAndroid Build Coastguard Worker semanage_ibendport_free(ibendports[i]);
150*2d543d20SAndroid Build Coastguard Worker free(ibendports);
151*2d543d20SAndroid Build Coastguard Worker return STATUS_ERR;
152*2d543d20SAndroid Build Coastguard Worker }
153