Blame library/adattrs.c

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