Blame library/adattrs.c

Packit Service 6d40f9
/*
Packit Service 6d40f9
 * adcli
Packit Service 6d40f9
 *
Packit Service 6d40f9
 * Copyright (C) 2013 Red Hat Inc.
Packit Service 6d40f9
 *
Packit Service 6d40f9
 * This program is free software; you can redistribute it and/or modify
Packit Service 6d40f9
 * it under the terms of the GNU Lesser General Public License as
Packit Service 6d40f9
 * published by the Free Software Foundation; either version 2.1 of
Packit Service 6d40f9
 * the License, or (at your option) any later version.
Packit Service 6d40f9
 *
Packit Service 6d40f9
 * This program is distributed in the hope that it will be useful, but
Packit Service 6d40f9
 * WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 6d40f9
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service 6d40f9
 * Lesser General Public License for more details.
Packit Service 6d40f9
 *
Packit Service 6d40f9
 * You should have received a copy of the GNU Lesser General Public
Packit Service 6d40f9
 * License along with this program; if not, write to the Free Software
Packit Service 6d40f9
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
Packit Service 6d40f9
 * MA 02110-1301 USA
Packit Service 6d40f9
 *
Packit Service 6d40f9
 * Author: Stef Walter <stefw@redhat.com>
Packit Service 6d40f9
 */
Packit Service 6d40f9
Packit Service 6d40f9
#include "config.h"
Packit Service 6d40f9
Packit Service 6d40f9
#include "adattrs.h"
Packit Service 6d40f9
#include "adprivate.h"
Packit Service 6d40f9
#include "seq.h"
Packit Service 6d40f9
Packit Service 6d40f9
#include <assert.h>
Packit Service 6d40f9
#include <stdlib.h>
Packit Service 6d40f9
Packit Service 6d40f9
adcli_attrs *
Packit Service 6d40f9
adcli_attrs_new (void)
Packit Service 6d40f9
{
Packit Service 6d40f9
	adcli_attrs *attrs;
Packit Service 6d40f9
Packit Service 6d40f9
	attrs = calloc (1, sizeof (adcli_attrs));
Packit Service 6d40f9
	return_val_if_fail (attrs != NULL, NULL);
Packit Service 6d40f9
Packit Service 6d40f9
	return attrs;
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
int
Packit Service 6d40f9
adcli_attrs_have (adcli_attrs *attrs,
Packit Service 6d40f9
                  const char *name)
Packit Service 6d40f9
{
Packit Service 6d40f9
	LDAPMod match = { -1, (char *)name, };
Packit Service 6d40f9
	LDAPMod *mod;
Packit Service 6d40f9
Packit Service 6d40f9
	return_val_if_fail (attrs != NULL, 0);
Packit Service 6d40f9
	return_val_if_fail (name != NULL, 0);
Packit Service 6d40f9
Packit Service 6d40f9
	mod = seq_lookup ((void **)attrs->mods, &attrs->len,
Packit Service 6d40f9
	                  &match, _adcli_ldap_mod_compar);
Packit Service 6d40f9
Packit Service 6d40f9
	return mod ? 1 : 0;
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
static void
Packit Service 6d40f9
attrs_insert1 (adcli_attrs *attrs,
Packit Service 6d40f9
               int mod_op,
Packit Service 6d40f9
               const char *name,
Packit Service 6d40f9
               const char *value)
Packit Service 6d40f9
{
Packit Service 6d40f9
	LDAPMod match = { 0, (char *)name, };
Packit Service 6d40f9
	LDAPMod *mod;
Packit Service 6d40f9
Packit Service 6d40f9
	mod = seq_lookup ((void **)attrs->mods, &attrs->len,
Packit Service 6d40f9
	                  &match, _adcli_ldap_mod_compar);
Packit Service 6d40f9
Packit Service 6d40f9
	/* A new attribute */
Packit Service 6d40f9
	if (mod == NULL) {
Packit Service 6d40f9
		const char *values[] = { value, NULL };
Packit Service 6d40f9
		mod = _adcli_ldap_mod_new (mod_op, name, values);
Packit Service 6d40f9
		return_if_fail (mod != NULL);
Packit Service 6d40f9
Packit Service 6d40f9
		attrs->mods = (LDAPMod **)seq_insert ((void **)attrs->mods,
Packit Service 6d40f9
		                                      &attrs->len, mod,
Packit Service 6d40f9
		                                      _adcli_ldap_mod_compar,
Packit Service 6d40f9
		                                      _adcli_ldap_mod_free);
Packit Service 6d40f9
Packit Service 6d40f9
	/* Add a value */
Packit Service 6d40f9
	} else {
Packit Service 6d40f9
		return_if_fail (mod->mod_op == mod_op);
Packit Service 6d40f9
		mod->mod_vals.modv_strvals =
Packit Service 6d40f9
		     _adcli_strv_add (mod->mod_vals.modv_strvals,
Packit Service 6d40f9
		                      strdup (value), NULL);
Packit Service 6d40f9
	}
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
static void
Packit Service 6d40f9
attrs_insert (adcli_attrs *attrs,
Packit Service 6d40f9
              int mod_type,
Packit Service 6d40f9
              const char *name,
Packit Service 6d40f9
              const char **values)
Packit Service 6d40f9
{
Packit Service 6d40f9
	LDAPMod *mod;
Packit Service 6d40f9
Packit Service 6d40f9
	mod = _adcli_ldap_mod_new (mod_type, name, values);
Packit Service 6d40f9
	return_if_fail (mod != NULL);
Packit Service 6d40f9
Packit Service 6d40f9
	attrs->mods = (LDAPMod **)seq_insert ((void **)attrs->mods,
Packit Service 6d40f9
	                                      &attrs->len, mod,
Packit Service 6d40f9
	                                      _adcli_ldap_mod_compar,
Packit Service 6d40f9
	                                      _adcli_ldap_mod_free);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
static void
Packit Service 6d40f9
attrs_insertv (adcli_attrs *attrs,
Packit Service 6d40f9
                   int mod_type,
Packit Service 6d40f9
                   const char *name,
Packit Service 6d40f9
                   const char *value,
Packit Service 6d40f9
                   va_list va)
Packit Service 6d40f9
{
Packit Service 6d40f9
	const char *fast[] = { value, NULL };
Packit Service 6d40f9
	char **values = NULL;
Packit Service 6d40f9
	int num = 0;
Packit Service 6d40f9
Packit Service 6d40f9
	fast[1] = va_arg(va, const char *);
Packit Service 6d40f9
	if (fast[1] == NULL) {
Packit Service 6d40f9
		attrs_insert (attrs, mod_type, name, fast);
Packit Service 6d40f9
		return;
Packit Service 6d40f9
	}
Packit Service 6d40f9
Packit Service 6d40f9
	values = seq_push (values, &num, (void *)fast[0]);
Packit Service 6d40f9
	values = seq_push (values, &num, (void *)fast[1]);
Packit Service 6d40f9
Packit Service 6d40f9
	while ((value = va_arg (va, const char *)) != NULL)
Packit Service 6d40f9
		values = seq_push (values, &num, (void *)value);
Packit Service 6d40f9
Packit Service 6d40f9
	attrs_insert (attrs, mod_type, name, (const char **)values);
Packit Service 6d40f9
	seq_free (values, NULL);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
void
Packit Service 6d40f9
adcli_attrs_add1 (adcli_attrs *attrs,
Packit Service 6d40f9
                  const char *name,
Packit Service 6d40f9
                  const char *value)
Packit Service 6d40f9
{
Packit Service 6d40f9
	return_if_fail (attrs != NULL);
Packit Service 6d40f9
	return_if_fail (name != NULL);
Packit Service 6d40f9
	return_if_fail (value != NULL);
Packit Service 6d40f9
Packit Service 6d40f9
	attrs_insert1 (attrs, LDAP_MOD_ADD, name, value);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
void
Packit Service 6d40f9
adcli_attrs_add (adcli_attrs *attrs,
Packit Service 6d40f9
                 const char *name,
Packit Service 6d40f9
                 const char *value,
Packit Service 6d40f9
                 ...)
Packit Service 6d40f9
{
Packit Service 6d40f9
	va_list va;
Packit Service 6d40f9
Packit Service 6d40f9
	return_if_fail (attrs != NULL);
Packit Service 6d40f9
	return_if_fail (name != NULL);
Packit Service 6d40f9
	return_if_fail (value != NULL);
Packit Service 6d40f9
Packit Service 6d40f9
	va_start (va, value);
Packit Service 6d40f9
	attrs_insertv (attrs, LDAP_MOD_ADD, name, value, va);
Packit Service 6d40f9
	va_end (va);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
Packit Service 6d40f9
void
Packit Service 6d40f9
adcli_attrs_replace (adcli_attrs *attrs,
Packit Service 6d40f9
                     const char *name,
Packit Service 6d40f9
                     const char *value,
Packit Service 6d40f9
                     ...)
Packit Service 6d40f9
{
Packit Service 6d40f9
	va_list va;
Packit Service 6d40f9
Packit Service 6d40f9
	return_if_fail (attrs != NULL);
Packit Service 6d40f9
	return_if_fail (name != NULL);
Packit Service 6d40f9
	return_if_fail (value != NULL);
Packit Service 6d40f9
Packit Service 6d40f9
	va_start (va, value);
Packit Service 6d40f9
	attrs_insertv (attrs, LDAP_MOD_REPLACE, name, value, va);
Packit Service 6d40f9
	va_end (va);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
void
Packit Service 6d40f9
adcli_attrs_delete1 (adcli_attrs *attrs,
Packit Service 6d40f9
                     const char *name,
Packit Service 6d40f9
                     const char *value)
Packit Service 6d40f9
{
Packit Service 6d40f9
	return_if_fail (attrs != NULL);
Packit Service 6d40f9
	return_if_fail (name != NULL);
Packit Service 6d40f9
	return_if_fail (value != NULL);
Packit Service 6d40f9
Packit Service 6d40f9
	attrs_insert1 (attrs, LDAP_MOD_DELETE, name, value);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
void
Packit Service 6d40f9
adcli_attrs_delete (adcli_attrs *attrs,
Packit Service 6d40f9
                    const char *name,
Packit Service 6d40f9
                    const char *value,
Packit Service 6d40f9
                    ...)
Packit Service 6d40f9
{
Packit Service 6d40f9
	va_list va;
Packit Service 6d40f9
Packit Service 6d40f9
	return_if_fail (attrs != NULL);
Packit Service 6d40f9
	return_if_fail (name != NULL);
Packit Service 6d40f9
	return_if_fail (value != NULL);
Packit Service 6d40f9
Packit Service 6d40f9
	va_start (va, value);
Packit Service 6d40f9
	attrs_insertv (attrs, LDAP_MOD_DELETE, name, value, va);
Packit Service 6d40f9
	va_end (va);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
void
Packit Service 6d40f9
adcli_attrs_free (adcli_attrs *attrs)
Packit Service 6d40f9
{
Packit Service 6d40f9
	if (!attrs)
Packit Service 6d40f9
		return;
Packit Service 6d40f9
Packit Service 6d40f9
	seq_free (attrs->mods, _adcli_ldap_mod_free);
Packit Service 6d40f9
	free (attrs);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
#ifdef ATTRS_TESTS
Packit Service 6d40f9
Packit Service 6d40f9
#include "test.h"
Packit Service 6d40f9
Packit Service 6d40f9
static void
Packit Service 6d40f9
test_new_free (void)
Packit Service 6d40f9
{
Packit Service 6d40f9
	adcli_attrs *attrs;
Packit Service 6d40f9
Packit Service 6d40f9
	attrs = adcli_attrs_new ();
Packit Service 6d40f9
	assert (attrs != NULL);
Packit Service 6d40f9
Packit Service 6d40f9
	adcli_attrs_free (attrs);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
static void
Packit Service 6d40f9
test_free_null (void)
Packit Service 6d40f9
{
Packit Service 6d40f9
	adcli_attrs_free (NULL);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
static void
Packit Service 6d40f9
test_adda (void)
Packit Service 6d40f9
{
Packit Service 6d40f9
	adcli_attrs *attrs;
Packit Service 6d40f9
Packit Service 6d40f9
	attrs = adcli_attrs_new ();
Packit Service 6d40f9
Packit Service 6d40f9
	adcli_attrs_add (attrs, "blah", "value", "two", NULL);
Packit Service 6d40f9
	adcli_attrs_add1 (attrs, "blah", "three");
Packit Service 6d40f9
Packit Service 6d40f9
	adcli_attrs_add (attrs, "other", "wheee", NULL);
Packit Service 6d40f9
Packit Service 6d40f9
	assert_num_eq (attrs->len, 2);
Packit Service 6d40f9
Packit Service 6d40f9
	assert (attrs->mods[0]->mod_op == LDAP_MOD_ADD);
Packit Service 6d40f9
	assert_str_eq (attrs->mods[0]->mod_type, "blah");
Packit Service 6d40f9
	assert_num_eq (seq_count (attrs->mods[0]->mod_vals.modv_strvals), 3);
Packit Service 6d40f9
	assert_str_eq (attrs->mods[0]->mod_vals.modv_strvals[0], "value");
Packit Service 6d40f9
	assert_str_eq (attrs->mods[0]->mod_vals.modv_strvals[1], "two");
Packit Service 6d40f9
	assert_str_eq (attrs->mods[0]->mod_vals.modv_strvals[2], "three");
Packit Service 6d40f9
	assert (attrs->mods[0]->mod_vals.modv_strvals[3] == NULL);
Packit Service 6d40f9
Packit Service 6d40f9
	assert (attrs->mods[1]->mod_op == LDAP_MOD_ADD);
Packit Service 6d40f9
	assert_str_eq (attrs->mods[1]->mod_type, "other");
Packit Service 6d40f9
	assert_num_eq (seq_count (attrs->mods[1]->mod_vals.modv_strvals), 1);
Packit Service 6d40f9
	assert_str_eq (attrs->mods[1]->mod_vals.modv_strvals[0], "wheee");
Packit Service 6d40f9
	assert (attrs->mods[1]->mod_vals.modv_strvals[1] == NULL);
Packit Service 6d40f9
Packit Service 6d40f9
	adcli_attrs_free (attrs);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
static void
Packit Service 6d40f9
test_replace (void)
Packit Service 6d40f9
{
Packit Service 6d40f9
	adcli_attrs *attrs;
Packit Service 6d40f9
Packit Service 6d40f9
	attrs = adcli_attrs_new ();
Packit Service 6d40f9
Packit Service 6d40f9
	adcli_attrs_add1 (attrs, "blah", "value");
Packit Service 6d40f9
	adcli_attrs_add1 (attrs, "blah", "two");
Packit Service 6d40f9
Packit Service 6d40f9
	adcli_attrs_replace (attrs, "blah", "new", NULL);
Packit Service 6d40f9
Packit Service 6d40f9
	adcli_attrs_add (attrs, "other", "wheee", NULL);
Packit Service 6d40f9
Packit Service 6d40f9
	assert_num_eq (attrs->len, 2);
Packit Service 6d40f9
Packit Service 6d40f9
	assert (attrs->mods[0]->mod_op == LDAP_MOD_REPLACE);
Packit Service 6d40f9
	assert_str_eq (attrs->mods[0]->mod_type, "blah");
Packit Service 6d40f9
	assert_num_eq (seq_count (attrs->mods[0]->mod_vals.modv_strvals), 1);
Packit Service 6d40f9
	assert_str_eq (attrs->mods[0]->mod_vals.modv_strvals[0], "new");
Packit Service 6d40f9
	assert (attrs->mods[0]->mod_vals.modv_strvals[1] == NULL);
Packit Service 6d40f9
Packit Service 6d40f9
	assert (attrs->mods[1]->mod_op == LDAP_MOD_ADD);
Packit Service 6d40f9
	assert_str_eq (attrs->mods[1]->mod_type, "other");
Packit Service 6d40f9
	assert_num_eq (seq_count (attrs->mods[1]->mod_vals.modv_strvals), 1);
Packit Service 6d40f9
	assert_str_eq (attrs->mods[1]->mod_vals.modv_strvals[0], "wheee");
Packit Service 6d40f9
	assert (attrs->mods[1]->mod_vals.modv_strvals[1] == NULL);
Packit Service 6d40f9
Packit Service 6d40f9
	adcli_attrs_free (attrs);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
int
Packit Service 6d40f9
main (int argc,
Packit Service 6d40f9
      char *argv[])
Packit Service 6d40f9
{
Packit Service 6d40f9
	test_func (test_new_free, "/attrs/new_free");
Packit Service 6d40f9
	test_func (test_free_null, "/attrs/free_null");
Packit Service 6d40f9
	test_func (test_adda, "/attrs/add");
Packit Service 6d40f9
	test_func (test_replace, "/attrs/replace");
Packit Service 6d40f9
	return test_run (argc, argv);
Packit Service 6d40f9
}
Packit Service 6d40f9
Packit Service 6d40f9
#endif /* ATTRS_TESTS */