|
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 */
|