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