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 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 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 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 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 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 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 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 hidden_def(semanage_ibendport_list_local) 78 79 int hidden semanage_ibendport_validate_local(semanage_handle_t *handle) 80 { 81 semanage_ibendport_t **ibendports = NULL; 82 unsigned int nibendports = 0; 83 unsigned int i = 0, j = 0; 84 char *ibdev_name; 85 char *ibdev_name2; 86 int port; 87 int port2; 88 89 /* List and sort the ibendports */ 90 if (semanage_ibendport_list_local(handle, &ibendports, &nibendports) < 0) 91 goto err; 92 93 qsort(ibendports, nibendports, sizeof(semanage_ibendport_t *), 94 (int (*)(const void *, const void *)) 95 &semanage_ibendport_compare2_qsort); 96 97 /* Test each ibendport */ 98 while (i < nibendports) { 99 int stop = 0; 100 101 if (STATUS_SUCCESS != 102 semanage_ibendport_get_ibdev_name(handle, 103 ibendports[i], 104 &ibdev_name)) { 105 ERR(handle, "Couldn't get IB device name"); 106 goto err; 107 } 108 109 port = semanage_ibendport_get_port(ibendports[i]); 110 111 /* Find the first ibendport with matching 112 * ibdev_name to compare against 113 */ 114 do { 115 if (j == nibendports - 1) 116 goto next; 117 j++; 118 if (STATUS_SUCCESS != 119 semanage_ibendport_get_ibdev_name(handle, 120 ibendports[j], 121 &ibdev_name2)) { 122 ERR(handle, "Couldn't get IB device name."); 123 goto err; 124 } 125 port2 = semanage_ibendport_get_port(ibendports[j]); 126 127 stop = !strcmp(ibdev_name, ibdev_name2); 128 } while (!stop); 129 130 if (port == port2) { 131 ERR(handle, "ibendport %s/%u already exists.", 132 ibdev_name2, port2); 133 goto invalid; 134 } 135 next: 136 i++; 137 j = i; 138 } 139 140 for (i = 0; i < nibendports; i++) 141 semanage_ibendport_free(ibendports[i]); 142 free(ibendports); 143 return STATUS_SUCCESS; 144 145 err: 146 ERR(handle, "could not complete ibendports validity check"); 147 148 invalid: 149 for (i = 0; i < nibendports; i++) 150 semanage_ibendport_free(ibendports[i]); 151 free(ibendports); 152 return STATUS_ERR; 153 } 154