+/**
+ * Get the value of a Python object's attribute, returned as a newly
+ * allocated char *.
+ *
+ * @param[in] py_obj The object to probe.
+ * @param[in] attr Name of the attribute to retrieve.
+ * @param[out] outstr ptr to char * storage to be filled in.
+ *
+ * @return SRD_OK upon success, a (negative) error code otherwise.
+ * The 'outstr' argument points to a g_malloc()ed string upon success.
+ *
+ * @private
+ */
+SRD_PRIV int py_attr_as_str(PyObject *py_obj, const char *attr, char **outstr)
+{
+ PyObject *py_str;
+ int ret;
+
+ if (!PyObject_HasAttrString(py_obj, attr)) {
+ srd_dbg("Object has no attribute '%s'.", attr);
+ return SRD_ERR_PYTHON;
+ }
+
+ if (!(py_str = PyObject_GetAttrString(py_obj, attr))) {
+ srd_exception_catch("Failed to get attribute '%s'", attr);
+ return SRD_ERR_PYTHON;
+ }
+
+ ret = py_str_as_str(py_str, outstr);
+ Py_DECREF(py_str);
+
+ return ret;
+}