+/**
+ * Convert a Python sequence object into a strv (char**), and
+ * None into a NULL pointer.
+ */
+static int strv_converter(PyObject* obj, void *_result) {
+ char ***result = _result;
+ Py_ssize_t i, len;
+
+ assert(result);
+
+ if (!obj)
+ return 0;
+
+ if (obj == Py_None) {
+ *result = NULL;
+ return 1;
+ }
+
+ if (!PySequence_Check(obj))
+ return 0;
+
+ len = PySequence_Length(obj);
+ *result = new0(char*, len + 1);
+ if (!*result) {
+ set_error(-ENOMEM, NULL, NULL);
+ return 0;
+ }
+
+ for (i = 0; i < len; i++) {
+ PyObject *item;
+#if PY_MAJOR_VERSION >=3 && PY_MINOR_VERSION >= 1
+ int r;
+ PyObject *bytes;
+#endif
+ char *s, *s2;
+
+ item = PySequence_ITEM(obj, i);
+#if PY_MAJOR_VERSION >=3 && PY_MINOR_VERSION >= 1
+ r = PyUnicode_FSConverter(item, &bytes);
+ if (r == 0)
+ goto cleanup;
+
+ s = PyBytes_AsString(bytes);
+#else
+ s = PyString_AsString(item);
+#endif
+ if (!s)
+ goto cleanup;
+
+ s2 = strdup(s);
+ if (!s2)
+ log_oom();
+
+ (*result)[i] = s2;
+ }
+
+ return 1;
+
+cleanup:
+ strv_free(*result);
+ *result = NULL;
+
+ return 0;
+}