/* Copyright (C) 2017 Mellanox Technologies Inc */ struct semanage_ibendport; struct semanage_ibendport_key; typedef struct semanage_ibendport_key record_key_t; typedef struct semanage_ibendport record_t; #define DBASE_RECORD_DEFINED #include #include #include #include "ibendport_internal.h" #include "debug.h" #include "handle.h" #include "database.h" int semanage_ibendport_modify_local(semanage_handle_t *handle, const semanage_ibendport_key_t *key, const semanage_ibendport_t *data) { dbase_config_t *dconfig = semanage_ibendport_dbase_local(handle); return dbase_modify(handle, dconfig, key, data); } int semanage_ibendport_del_local(semanage_handle_t *handle, const semanage_ibendport_key_t *key) { dbase_config_t *dconfig = semanage_ibendport_dbase_local(handle); return dbase_del(handle, dconfig, key); } int semanage_ibendport_query_local(semanage_handle_t *handle, const semanage_ibendport_key_t *key, semanage_ibendport_t **response) { dbase_config_t *dconfig = semanage_ibendport_dbase_local(handle); return dbase_query(handle, dconfig, key, response); } int semanage_ibendport_exists_local(semanage_handle_t *handle, const semanage_ibendport_key_t *key, int *response) { dbase_config_t *dconfig = semanage_ibendport_dbase_local(handle); return dbase_exists(handle, dconfig, key, response); } int semanage_ibendport_count_local(semanage_handle_t *handle, unsigned int *response) { dbase_config_t *dconfig = semanage_ibendport_dbase_local(handle); return dbase_count(handle, dconfig, response); } int semanage_ibendport_iterate_local(semanage_handle_t *handle, int (*handler)(const semanage_ibendport_t *record, void *varg), void *handler_arg) { dbase_config_t *dconfig = semanage_ibendport_dbase_local(handle); return dbase_iterate(handle, dconfig, handler, handler_arg); } int semanage_ibendport_list_local(semanage_handle_t *handle, semanage_ibendport_t ***records, unsigned int *count) { dbase_config_t *dconfig = semanage_ibendport_dbase_local(handle); return dbase_list(handle, dconfig, records, count); } hidden_def(semanage_ibendport_list_local) int hidden semanage_ibendport_validate_local(semanage_handle_t *handle) { semanage_ibendport_t **ibendports = NULL; unsigned int nibendports = 0; unsigned int i = 0, j = 0; char *ibdev_name; char *ibdev_name2; int port; int port2; /* List and sort the ibendports */ if (semanage_ibendport_list_local(handle, &ibendports, &nibendports) < 0) goto err; qsort(ibendports, nibendports, sizeof(semanage_ibendport_t *), (int (*)(const void *, const void *)) &semanage_ibendport_compare2_qsort); /* Test each ibendport */ while (i < nibendports) { int stop = 0; if (STATUS_SUCCESS != semanage_ibendport_get_ibdev_name(handle, ibendports[i], &ibdev_name)) { ERR(handle, "Couldn't get IB device name"); goto err; } port = semanage_ibendport_get_port(ibendports[i]); /* Find the first ibendport with matching * ibdev_name to compare against */ do { if (j == nibendports - 1) goto next; j++; if (STATUS_SUCCESS != semanage_ibendport_get_ibdev_name(handle, ibendports[j], &ibdev_name2)) { ERR(handle, "Couldn't get IB device name."); goto err; } port2 = semanage_ibendport_get_port(ibendports[j]); stop = !strcmp(ibdev_name, ibdev_name2); } while (!stop); if (port == port2) { ERR(handle, "ibendport %s/%u already exists.", ibdev_name2, port2); goto invalid; } next: i++; j = i; } for (i = 0; i < nibendports; i++) semanage_ibendport_free(ibendports[i]); free(ibendports); return STATUS_SUCCESS; err: ERR(handle, "could not complete ibendports validity check"); invalid: for (i = 0; i < nibendports; i++) semanage_ibendport_free(ibendports[i]); free(ibendports); return STATUS_ERR; }