/* * Find the portal for a given portal group */ static isns_object_t * __isns_pg_find_portal(isns_db_t *db, isns_object_t *pg, const isns_object_list_t *extra_objs) { isns_attr_list_t key_attrs = ISNS_ATTR_LIST_INIT; isns_object_t *obj = NULL; /* FIXME: ISNS_TAG_PG_PORTAL_IP_ADDR -> ...ADDRESS */ if (!__isns_object_translate_attr(pg, ISNS_TAG_PG_PORTAL_IP_ADDR, ISNS_TAG_PORTAL_IP_ADDRESS, &key_attrs)) goto out; if (!__isns_object_translate_attr(pg, ISNS_TAG_PG_PORTAL_TCP_UDP_PORT, ISNS_TAG_PORTAL_TCP_UDP_PORT, &key_attrs)) goto out; obj = isns_db_lookup(db, &isns_portal_template, &key_attrs); if (!obj && extra_objs) obj = isns_object_list_lookup(extra_objs, &isns_portal_template, &key_attrs); out: isns_attr_list_destroy(&key_attrs); return obj; }
/* * Callback function which builds an iSNS object from the * list of attr=tag values. */ static int __isns_local_registry_load_object(const char *line, int argc, char **argv, void *user_data) { isns_attr_list_t attrs = ISNS_ATTR_LIST_INIT; struct isns_attr_list_parser state; isns_object_list_t *list = user_data; isns_object_t *obj, *entity = NULL; for (; argc > 0; --argc) { char *attr = argv[argc-1]; if (!strncasecmp(attr, "owner=", 6)) { char *eid = __isns_local_registry_entity_name(attr + 6); ISNS_QUICK_ATTR_LIST_DECLARE(key_attrs, ISNS_TAG_ENTITY_IDENTIFIER, string, eid); if (entity) { isns_error("Duplicate owner entry in registry\n"); continue; } isns_attr_print(&key_attrs.iqa_attr, isns_print_stdout); entity = isns_object_list_lookup(list, &isns_entity_template, &key_attrs.iqa_list); if (entity != NULL) continue; isns_debug_state("Creating fake entity %s\n", eid); entity = isns_create_entity(ISNS_ENTITY_PROTOCOL_ISCSI, eid); isns_object_list_append(list, entity); } else { break; } } isns_attr_list_parser_init(&state, NULL); if (!isns_parse_attrs(argc, argv, &attrs, &state)) { isns_error("Unable to parse attrs\n"); isns_attr_list_destroy(&attrs); return 0; } obj = isns_create_object(isns_attr_list_parser_context(&state), &attrs, entity); isns_attr_list_destroy(&attrs); if (obj == NULL) { isns_error("Unable to create object\n"); return 0; } isns_object_list_append(list, obj); return 1; }
/* * Find the node for a given portal group */ static isns_object_t * __isns_pg_find_node(isns_db_t *db, isns_object_t *pg, const isns_object_list_t *extra_objs) { isns_attr_list_t key_attrs = ISNS_ATTR_LIST_INIT; isns_object_t *obj = NULL; if (!__isns_object_translate_attr(pg, ISNS_TAG_PG_ISCSI_NAME, ISNS_TAG_ISCSI_NAME, &key_attrs)) goto out; obj = isns_db_lookup(db, &isns_iscsi_node_template, &key_attrs); if (!obj && extra_objs) obj = isns_object_list_lookup(extra_objs, &isns_iscsi_node_template, &key_attrs); out: isns_attr_list_destroy(&key_attrs); return obj; }