120 lines
2.9 KiB
C
120 lines
2.9 KiB
C
/* See http://www.python-ldap.org/ for details.
|
|
* $Id: berval.c,v 1.1 2009/08/17 01:49:47 leonard Exp $ */
|
|
|
|
#include "common.h"
|
|
#include "berval.h"
|
|
|
|
/*
|
|
* Converts a Python object into a data for a berval structure.
|
|
*
|
|
* New memory is allocated, and the content of the object is copied into it.
|
|
* Then the (pre-existing) berval structure's field are filled in with pointer
|
|
* and length data.
|
|
*
|
|
* The source object must implement the buffer interface, or be None.
|
|
* If the source object is None, bv->bv_val will be set to NULL and bv_len to 0.
|
|
* Otherwise, bv->bv_val will be non-NULL (even for zero-length data).
|
|
* This allows the caller to distinguish a None argument as something special.
|
|
*
|
|
* Returns 0 on failure, leaving *bv unchanged, and setting an error.
|
|
* Returns 1 on success: the berval must be freed with LDAPberval_release().
|
|
*/
|
|
int
|
|
LDAPberval_from_object(PyObject *obj, struct berval *bv)
|
|
{
|
|
const void *data;
|
|
char *datacp;
|
|
Py_ssize_t len;
|
|
|
|
if (PyNone_Check(obj)) {
|
|
bv->bv_len = 0;
|
|
bv->bv_val = NULL;
|
|
return 1;
|
|
}
|
|
|
|
if (!PyObject_AsReadBuffer(obj, &data, &len))
|
|
return 0;
|
|
|
|
datacp = PyMem_MALLOC(len ? len : 1);
|
|
if (!datacp) {
|
|
PyErr_NoMemory();
|
|
return 0;
|
|
}
|
|
memcpy(datacp, data, len);
|
|
|
|
bv->bv_len = len;
|
|
bv->bv_val = datacp;
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
* Returns true if the object could be used to initialize a berval structure
|
|
* with LDAPberval_from_object()
|
|
*/
|
|
int
|
|
LDAPberval_from_object_check(PyObject *obj)
|
|
{
|
|
return PyNone_Check(obj) ||
|
|
PyObject_CheckReadBuffer(obj);
|
|
}
|
|
|
|
/*
|
|
* Releases memory allocated by LDAPberval_from_object().
|
|
* Has no effect if the berval pointer is NULL or the berval data is NULL.
|
|
*/
|
|
void
|
|
LDAPberval_release(struct berval *bv) {
|
|
if (bv && bv->bv_val) {
|
|
PyMem_FREE(bv->bv_val);
|
|
bv->bv_len = 0;
|
|
bv->bv_val = NULL;
|
|
}
|
|
}
|
|
|
|
/*
|
|
* Copies out the data from a berval, and returns it as a new Python object,
|
|
* Returns None if the berval pointer is NULL.
|
|
*
|
|
* Note that this function is not the exact inverse of LDAPberval_from_object
|
|
* with regards to the NULL/None conversion.
|
|
*
|
|
* Returns a new Python object on success, or NULL on failure.
|
|
*/
|
|
PyObject *
|
|
LDAPberval_to_object(const struct berval *bv)
|
|
{
|
|
PyObject *ret = NULL;
|
|
|
|
if (!bv) {
|
|
ret = Py_None;
|
|
Py_INCREF(ret);
|
|
}
|
|
else {
|
|
ret = PyBytes_FromStringAndSize(bv->bv_val, bv->bv_len);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
/*
|
|
* Same as LDAPberval_to_object, but returns a Unicode PyObject.
|
|
* Use when the value is known to be text (for instance a distinguishedName).
|
|
*
|
|
* Returns a new Python object on success, or NULL on failure.
|
|
*/
|
|
PyObject *
|
|
LDAPberval_to_unicode_object(const struct berval *bv)
|
|
{
|
|
PyObject *ret = NULL;
|
|
|
|
if (!bv) {
|
|
ret = Py_None;
|
|
Py_INCREF(ret);
|
|
}
|
|
else {
|
|
ret = PyUnicode_FromStringAndSize(bv->bv_val, bv->bv_len);
|
|
}
|
|
|
|
return ret;
|
|
}
|