summaryrefslogtreecommitdiff
path: root/utils/open-isns/getnext.c
diff options
context:
space:
mode:
Diffstat (limited to 'utils/open-isns/getnext.c')
-rw-r--r--utils/open-isns/getnext.c257
1 files changed, 0 insertions, 257 deletions
diff --git a/utils/open-isns/getnext.c b/utils/open-isns/getnext.c
deleted file mode 100644
index 916ee80..0000000
--- a/utils/open-isns/getnext.c
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Handle iSNS DevGetNext
- *
- * Copyright (C) 2007 Olaf Kirch <olaf.kirch@oracle.com>
- */
-
-#include <stdlib.h>
-#include <string.h>
-#include "isns.h"
-#include "attrs.h"
-#include "message.h"
-#include "security.h"
-#include "objects.h"
-#include "db.h"
-#include "util.h"
-
-/*
- * Create a GetNext query, and set the source name
- */
-static isns_simple_t *
-__isns_create_getnext(isns_source_t *source,
- const isns_attr_list_t *key,
- const isns_attr_list_t *scope)
-{
- isns_simple_t *simp;
-
- simp = isns_simple_create(ISNS_DEVICE_GET_NEXT, source, key);
- if (simp && scope)
- isns_attr_list_copy(&simp->is_operating_attrs,
- scope);
- return simp;
-}
-
-isns_simple_t *
-isns_create_getnext(isns_client_t *clnt,
- isns_object_template_t *tmpl,
- const isns_attr_list_t *scope)
-{
- isns_simple_t *simp;
- unsigned int i;
-
- simp = __isns_create_getnext(clnt->ic_source, NULL, scope);
- if (simp == NULL)
- return NULL;
-
- for (i = 0; i < tmpl->iot_num_keys; ++i) {
- isns_attr_list_append_nil(&simp->is_message_attrs,
- tmpl->iot_keys[i]);
- }
- return simp;
-}
-
-isns_simple_t *
-isns_create_getnext_followup(isns_client_t *clnt,
- const isns_simple_t *resp,
- const isns_attr_list_t *scope)
-{
- return __isns_create_getnext(clnt->ic_source,
- &resp->is_message_attrs, scope);
-}
-
-/*
- * Get the list of objects matching this query
- */
-static int
-isns_getnext_get_object(isns_simple_t *qry, isns_db_t *db,
- isns_object_t **result)
-{
- isns_scope_t *scope;
- isns_attr_list_t *keys = &qry->is_message_attrs, match;
- isns_object_template_t *tmpl;
- unsigned int i;
-
- /*
- * 5.6.5.3.
- * The Message Key Attribute may be an Entity Identifier (EID),
- * iSCSI Name, iSCSI Index, Portal IP Address and TCP/UDP Port,
- * Portal Index, PG Index, FC Node Name WWNN, or FC Port Name
- * WWPN.
- *
- * Implementer's comment: In other words, it must be the
- * key attr(s) of a specific object type, or an index attribute.
- */
- if ((tmpl = isns_object_template_for_key_attrs(keys)) != NULL) {
- if (keys->ial_count != tmpl->iot_num_keys)
- return ISNS_INVALID_QUERY;
- } else if (keys->ial_count == 1) {
- isns_attr_t *attr = keys->ial_data[0];
-
- tmpl = isns_object_template_for_index_tag(attr->ia_tag_id);
- }
- if (tmpl == NULL)
- return ISNS_INVALID_QUERY;
-
- /* Verify whether the client is permitted to retrieve
- * objects of the given type. */
- if (!isns_policy_validate_object_type(qry->is_policy, tmpl,
- qry->is_function))
- return ISNS_SOURCE_UNAUTHORIZED;
-
- /*
- * 5.6.5.3.
- * The Operating Attributes can be used to specify the scope
- * of the DevGetNext request, and to specify the attributes of
- * the next object, which are to be returned in the DevGetNext
- * response message. All Operating Attributes MUST be attributes
- * of the object type identified by the Message Key.
- */
- match = qry->is_operating_attrs;
- for (i = 0; i < match.ial_count; ++i) {
- isns_attr_t *attr = match.ial_data[i];
-
- if (tmpl != isns_object_template_for_tag(attr->ia_tag_id))
- return ISNS_INVALID_QUERY;
- }
-
- /*
- * 5.6.5.3.
- * Non-zero-length TLV attributes in the Operating Attributes
- * are used to scope the DevGetNext message.
- * [...]
- * Zero-length TLV attributes MUST be listed after non-zero-length
- * attributes in the Operating Attributes of the DevGetNext
- * request message.
- */
- for (i = 0; i < match.ial_count; ++i) {
- if (ISNS_ATTR_IS_NIL(match.ial_data[i])) {
- match.ial_count = i;
- break;
- }
- }
-
- /* Get the scope for the originating node. */
- scope = isns_scope_for_call(db, qry);
-
- *result = isns_scope_get_next(scope, tmpl, keys, &match);
-
- isns_scope_release(scope);
-
- if (*result == NULL)
- return ISNS_NO_SUCH_ENTRY;
- return ISNS_SUCCESS;
-}
-
-/*
- * Create a Query Response
- */
-static isns_simple_t *
-isns_create_getnext_response(isns_source_t *source,
- const isns_simple_t *qry, isns_object_t *obj)
-{
- const isns_attr_list_t *req_attrs = NULL;
- isns_attr_list_t requested;
- isns_simple_t *resp;
- unsigned int i;
-
- resp = __isns_create_getnext(source, NULL, NULL);
-
- /*
- * 5.7.5.3. Device Get Next Response (DevGetNextRsp)
- * The Message Key Attribute field returns the object keys
- * for the next object after the Message Key Attribute in the
- * original DevGetNext message.
- *
- * Implementer's note: slightly convoluted English here.
- * I *think* this means the key attributes of the object
- * we matched.
- */
- if (!isns_object_get_key_attrs(obj, &resp->is_message_attrs))
- return NULL;
-
- /*
- * 5.7.5.3.
- * The Operating Attribute field returns the Operating Attributes
- * of the next object as requested in the original DevGetNext
- * message. The values of the Operating Attributes are those
- * associated with the object identified by the Message Key
- * Attribute field of the DevGetNextRsp message.
- *
- * Implementer's note: the RFC doesn't say clearly what to
- * do when the list of operating attributes does not
- * contain any NIL TLVs. Let's default to the same
- * behavior as elsewhere, and return all attributes
- * in this case.
- */
- req_attrs = &qry->is_operating_attrs;
- for (i = 0; i < req_attrs->ial_count; ++i) {
- if (ISNS_ATTR_IS_NIL(req_attrs->ial_data[i]))
- break;
- }
- requested.ial_count = req_attrs->ial_count - i;
- requested.ial_data = req_attrs->ial_data + i;
- if (requested.ial_count)
- req_attrs = &requested;
- else
- req_attrs = NULL;
-
- isns_object_get_attrlist(obj,
- &resp->is_operating_attrs,
- req_attrs);
- return resp;
-}
-
-/*
- * Process a GetNext request
- */
-int
-isns_process_getnext(isns_server_t *srv, isns_simple_t *call, isns_simple_t **result)
-{
- isns_simple_t *reply = NULL;
- isns_object_t *obj = NULL;
- isns_db_t *db = srv->is_db;
- int status;
-
- /* Get the next object */
- status = isns_getnext_get_object(call, db, &obj);
- if (status != ISNS_SUCCESS)
- goto done;
-
- /* If it's a virtual object, rebuild it */
- if (obj->ie_rebuild)
- obj->ie_rebuild(obj, srv->is_db);
-
- /* Success: create a new simple message, and
- * send it in our reply. */
- reply = isns_create_getnext_response(srv->is_source, call, obj);
- if (reply == NULL)
- status = ISNS_INTERNAL_ERROR;
-
-done:
- if (obj)
- isns_object_release(obj);
- *result = reply;
- return status;
-}
-
-/*
- * Parse the object in a getnext response
- */
-int
-isns_getnext_response_get_object(isns_simple_t *qry,
- isns_object_t **result)
-{
- isns_object_template_t *tmpl;
-
- tmpl = isns_object_template_for_key_attrs(&qry->is_operating_attrs);
- if (tmpl == NULL) {
- isns_error("Cannot determine object type in GetNext response\n");
- return ISNS_ATTRIBUTE_NOT_IMPLEMENTED;
- }
-
- *result = isns_create_object(tmpl,
- &qry->is_operating_attrs,
- NULL);
- return ISNS_SUCCESS;
-}
-