Home | History | Annotate | Download | only in src
      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