[Libvirt-cim] [PATCH] [CU][RFC] Correct a few API issues

Dan Smith danms at us.ibm.com
Tue Nov 27 19:20:07 UTC 2007


# HG changeset patch
# User Dan Smith <danms at us.ibm.com>
# Date 1196194806 28800
# Node ID 256b237ba19f9e178719ed657f2b9a8f0d44d433
# Parent  64e4f6355b52e4b7bcc984ec557610a1fa9a9786
[CU][RFC] Correct a few API issues
that I think need to be resolved before we snap a release.

Some of the cu_get_* functions returned values instead of a CMPIrc's
like everything else, so this changes that.  Also, return const char *'s
from the broker memory so that the callers don't need to free the result.

This will require some work in libvirt-cim to make sure the new API is
adhered to properly.  If this is okay with people, I'll follow up with a
patch to libvirt-cim to make those changes.  Any other discussion about
things that should change in the libcmpiutil API is welcomed.

Changes from last time:
 - Fix cu_get_str_prop() to return a const broker string as well

Patch set to make associated changes to libvirt-cim to follow...

Signed-off-by: Dan Smith <danms at us.ibm.com>

diff -r 64e4f6355b52 -r 256b237ba19f args_util.c
--- a/args_util.c	Tue Nov 27 06:33:45 2007 -0800
+++ b/args_util.c	Tue Nov 27 12:20:06 2007 -0800
@@ -32,7 +32,9 @@
 
 #define CU_WEAK_TYPES 1
 
-char *cu_get_str_path(const CMPIObjectPath *reference, const char *key)
+CMPIrc cu_get_str_path(const CMPIObjectPath *reference,
+                       const char *key,
+                       const char **val)
 {
         CMPIData data;
         CMPIStatus s;
@@ -42,18 +44,20 @@ char *cu_get_str_path(const CMPIObjectPa
         if ((s.rc != CMPI_RC_OK) || 
             CMIsNullValue(data) || 
             CMIsNullObject(data.value.string))
-                return NULL;
+                return CMPI_RC_ERR_FAILED;
 
         value = CMGetCharPtr(data.value.string);
         if ((value == NULL) || (*value == '\0'))
-                return NULL;
-
-        return strdup(value);
-}
-
-int cu_get_u16_path(const CMPIObjectPath *reference,
-                    const char *key,
-                    uint16_t *target)
+                return CMPI_RC_ERR_TYPE_MISMATCH;
+
+        *val = value;
+
+        return CMPI_RC_OK;
+}
+
+CMPIrc cu_get_u16_path(const CMPIObjectPath *reference,
+                       const char *key,
+                       uint16_t *target)
 {
         CMPIData data;
         CMPIStatus s;
@@ -61,11 +65,11 @@ int cu_get_u16_path(const CMPIObjectPath
         data = CMGetKey(reference, key, &s);
         if ((s.rc != CMPI_RC_OK) ||
             CMIsNullValue(data))
-                return 0;
+                return CMPI_RC_ERR_FAILED;
 
         *target = data.value.uint16;
 
-        return 1;
+        return CMPI_RC_OK;
 }
 
 const char *cu_check_args(const CMPIArgs *args, const char **names)
@@ -85,92 +89,101 @@ const char *cu_check_args(const CMPIArgs
         return NULL;
 }
 
-char *cu_get_str_arg(const CMPIArgs *args, const char *name)
-{
-        CMPIData argdata;
-        char *argval;
+CMPIrc cu_get_str_arg(const CMPIArgs *args, const char *name, const char **val)
+{
+        CMPIData argdata;
         CMPIStatus s;
 
         argdata = CMGetArg(args, name, &s);
         if ((s.rc != CMPI_RC_OK) || (CMIsNullValue(argdata)))
-                return NULL;
+                return CMPI_RC_ERR_INVALID_PARAMETER;
 
         if ((argdata.type != CMPI_string) || 
             CMIsNullObject(argdata.value.string))
-                return NULL;
-
-        argval = strdup(CMGetCharPtr(argdata.value.string));
-
-        return argval;
-}
-
-CMPIObjectPath *cu_get_ref_arg(const CMPIArgs *args, const char *name)
+                return CMPI_RC_ERR_TYPE_MISMATCH;
+
+        *val = CMGetCharPtr(argdata.value.string);
+
+        return CMPI_RC_OK;
+}
+
+CMPIrc cu_get_ref_arg(const CMPIArgs *args,
+                      const char *name,
+                      CMPIObjectPath **op)
 {
         CMPIData argdata;
         CMPIStatus s;
 
         argdata = CMGetArg(args, name, &s);
         if ((s.rc != CMPI_RC_OK) || (CMIsNullValue(argdata)))
-                return NULL;
+                return CMPI_RC_ERR_INVALID_PARAMETER;
 
         if ((argdata.type != CMPI_ref) || CMIsNullObject(argdata.value.ref))
-                return NULL;
-
-        return argdata.value.ref;
-}
-
-CMPIInstance *cu_get_inst_arg(const CMPIArgs *args, const char *name)
-{
-        CMPIData argdata;
-        CMPIStatus s;
-
-        argdata = CMGetArg(args, name, &s);
-        if ((s.rc != CMPI_RC_OK) || (CMIsNullValue(argdata))) {
-                return NULL;
-        }
+                return CMPI_RC_ERR_TYPE_MISMATCH;
+
+        *op = argdata.value.ref;
+
+        return CMPI_RC_OK;
+}
+
+CMPIrc cu_get_inst_arg(const CMPIArgs *args,
+                       const char *name,
+                       CMPIInstance **inst)
+{
+        CMPIData argdata;
+        CMPIStatus s;
+
+        argdata = CMGetArg(args, name, &s);
+        if ((s.rc != CMPI_RC_OK) || (CMIsNullValue(argdata)))
+                return CMPI_RC_ERR_INVALID_PARAMETER;
 
         if ((argdata.type != CMPI_instance) ||
-            CMIsNullObject(argdata.value.inst)) {
-                return NULL;
-        }
-
-        return argdata.value.inst;
-}
-
-CMPIArray *cu_get_array_arg(const CMPIArgs *args, const char *name)
+            CMIsNullObject(argdata.value.inst))
+                CMPI_RC_ERR_TYPE_MISMATCH;
+
+        *inst = argdata.value.inst;
+
+        return CMPI_RC_OK;
+}
+
+CMPIrc cu_get_array_arg(const CMPIArgs *args,
+                        const char *name,
+                        CMPIArray **array)
 {
         CMPIData argdata;
         CMPIStatus s;
         
         argdata = CMGetArg(args, name, &s);
         if ((s.rc != CMPI_RC_OK) || CMIsNullValue(argdata))
-                return NULL;
+                return CMPI_RC_ERR_INVALID_PARAMETER;
 
         if (!CMIsArray(argdata) || CMIsNullObject(argdata.value.array))
-                return NULL;
-
-        return argdata.value.array;
-}
-
-int cu_get_u16_arg(const CMPIArgs *args, const char *name, uint16_t *target)
+                return CMPI_RC_ERR_TYPE_MISMATCH;
+
+        *array = argdata.value.array;
+
+        return CMPI_RC_OK;
+}
+
+CMPIrc cu_get_u16_arg(const CMPIArgs *args, const char *name, uint16_t *target)
 {
         CMPIData argdata;
         CMPIStatus s;
 
         argdata = CMGetArg(args, name, &s);
         if ((s.rc != CMPI_RC_OK) || CMIsNullValue(argdata))
-                return 0;
+                return CMPI_RC_ERR_INVALID_PARAMETER;
 
 #ifdef CU_WEAK_TYPES
         if (!(argdata.type & CMPI_INTEGER))
 #else
         if (argdata.type != CMPI_uint16)
 #endif
-                return 0;
+                return CMPI_RC_ERR_TYPE_MISMATCH;
 
         *target = argdata.value.uint16;
 
-        return 1;
+        return CMPI_RC_OK;
 }
 
 #define REQUIRE_PROPERTY_DEFINED(i, p, pv, s)                           \
@@ -182,7 +195,7 @@ int cu_get_u16_arg(const CMPIArgs *args,
 
 CMPIrc cu_get_str_prop(const CMPIInstance *inst,
                        const char *prop,
-                       char **target)
+                       const char **target)
 {
         CMPIData value;
         CMPIStatus s;
@@ -198,8 +211,7 @@ CMPIrc cu_get_str_prop(const CMPIInstanc
         if ((prop_val = CMGetCharPtr(value.value.string)) == NULL)
                 return CMPI_RC_ERROR;
 
-        if ((*target = strdup(prop_val)) == NULL)
-                return CMPI_RC_ERROR;
+        *target = prop_val;
 
         return CMPI_RC_OK;
 }
diff -r 64e4f6355b52 -r 256b237ba19f libcmpiutil.h
--- a/libcmpiutil.h	Tue Nov 27 06:33:45 2007 -0800
+++ b/libcmpiutil.h	Tue Nov 27 12:20:06 2007 -0800
@@ -91,18 +91,22 @@ const char *cu_check_args(const CMPIArgs
  *
  * @param args The argument list to search
  * @param name The name of the argument
- * @returns The string argument's value, or NULL if error (must be free()'d)
- */
-char *cu_get_str_arg(const CMPIArgs *args, const char *name);
+ * @param val The value of the argument (must be free()'d)
+ * @returns CMPI_RC_OK if successful
+ */
+CMPIrc cu_get_str_arg(const CMPIArgs *args, const char *name, const char **val);
 
 /**
  * Get a reference argument
  *
  * @param args The argument list to search
  * @param name The name of the argument
- * @returns The reference argument's value, or NULL if error
- */
-CMPIObjectPath *cu_get_ref_arg(const CMPIArgs *args, const char *name);
+ * @param op The reference argument's value
+ * @returns CMPI_RC_OK if successful
+ */
+CMPIrc cu_get_ref_arg(const CMPIArgs *args,
+                      const char *name,
+                      CMPIObjectPath **op);
 
 /**
  * Get an instance argument
@@ -111,7 +115,9 @@ CMPIObjectPath *cu_get_ref_arg(const CMP
  * @param name The name of the argument
  * @returns The instance argument's value, or NULL if error
  */
-CMPIInstance *cu_get_inst_arg(const CMPIArgs *args, const char *name);
+CMPIrc cu_get_inst_arg(const CMPIArgs *args,
+                       const char *name,
+                       CMPIInstance **inst);
 
 /**
  * Get an array argument
@@ -120,7 +126,9 @@ CMPIInstance *cu_get_inst_arg(const CMPI
  * @param name The name of the argument
  * @returns The array argument's value, or NULL if error
  */
-CMPIArray *cu_get_array_arg(const CMPIArgs *args, const char *name);
+CMPIrc cu_get_array_arg(const CMPIArgs *args,
+                        const char *name,
+                        CMPIArray **array);
 
 /**
  * Get a uint16 argument
@@ -128,18 +136,22 @@ CMPIArray *cu_get_array_arg(const CMPIAr
  * @param args The argument list to search
  * @param name The name of the argument
  * @param target The uint16_t to reflect the argument value
- * @returns nonzero on success, zero otherwise
- */
-int cu_get_u16_arg(const CMPIArgs *args, const char *name, uint16_t *target);
+ * @returns CMPI_RC_OK if successful
+ */
+CMPIrc cu_get_u16_arg(const CMPIArgs *args, const char *name, uint16_t *target);
 
 /**
  * Get a string component of an object path
  *
- * @param reference The object path
+ * @param ref The object path
  * @param key The name of the component to return
- * @returns The value of the component, or NULL if error (must be free()'d)
- */
-char *cu_get_str_path(const CMPIObjectPath *reference, const char *key);
+ * @param val The value of the component, or NULL if error (must be
+ *            free()'d)
+ * @returns CMPI_RC_OK on success
+ */
+CMPIrc cu_get_str_path(const CMPIObjectPath *ref,
+                       const char *key,
+                       const char **val);
 
 /**
  * Get a uint16 component of an object path
@@ -147,11 +159,11 @@ char *cu_get_str_path(const CMPIObjectPa
  * @param reference The object path
  * @param key The name of the component to return
  * @param target A pointer to the uint16 to set
- * @returns nonzero on success, zero otherwise
- */
-int cu_get_u16_path(const CMPIObjectPath *reference,
-                    const char *key,
-                    uint16_t *target);
+ * @returns CMPI_RC_OK if successful
+ */
+CMPIrc cu_get_u16_path(const CMPIObjectPath *reference,
+                       const char *key,
+                       uint16_t *target);
 
 /* Forward declaration */
 struct inst_list;
@@ -202,7 +214,7 @@ unsigned int cu_return_instance_names(co
  */
 CMPIrc cu_get_str_prop(const CMPIInstance *inst,
                        const char *prop,
-                       char **target);
+                       const char **target);
 
 /**
  * Get a boolean property of an instance
diff -r 64e4f6355b52 -r 256b237ba19f std_indication.c
--- a/std_indication.c	Tue Nov 27 06:33:45 2007 -0800
+++ b/std_indication.c	Tue Nov 27 12:20:06 2007 -0800
@@ -49,7 +49,8 @@ static CMPIStatus raise(struct std_indic
         if (ctx->handler->raise_fn == NULL)
                 return (CMPIStatus){CMPI_RC_OK, NULL};
 
-        inst = cu_get_inst_arg(argsin, "Indication");
+        if (cu_get_inst_arg(argsin, "Indication", &inst) != CMPI_RC_OK)
+                return (CMPIStatus){CMPI_RC_ERR_FAILED, NULL};
 
         return ctx->handler->raise_fn(context, inst);
 }




More information about the Libvirt-cim mailing list