1184588Sdfr/*-
2184588Sdfr * Copyright (c) 2008 Isilon Inc http://www.isilon.com/
3184588Sdfr * Authors: Doug Rabson <dfr@rabson.org>
4184588Sdfr * Developed with Red Inc: Alfred Perlstein <alfred@freebsd.org>
5184588Sdfr *
6184588Sdfr * Redistribution and use in source and binary forms, with or without
7184588Sdfr * modification, are permitted provided that the following conditions
8184588Sdfr * are met:
9184588Sdfr * 1. Redistributions of source code must retain the above copyright
10184588Sdfr *    notice, this list of conditions and the following disclaimer.
11184588Sdfr * 2. Redistributions in binary form must reproduce the above copyright
12184588Sdfr *    notice, this list of conditions and the following disclaimer in the
13184588Sdfr *    documentation and/or other materials provided with the distribution.
14184588Sdfr *
15184588Sdfr * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16184588Sdfr * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17184588Sdfr * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18184588Sdfr * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19184588Sdfr * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20184588Sdfr * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21184588Sdfr * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22184588Sdfr * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23184588Sdfr * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24184588Sdfr * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25184588Sdfr * SUCH DAMAGE.
26184588Sdfr */
27184588Sdfr
28184588Sdfr#include <sys/cdefs.h>
29184588Sdfr__FBSDID("$FreeBSD: releng/11.0/sys/kgssapi/gss_add_oid_set_member.c 184588 2008-11-03 10:38:00Z dfr $");
30184588Sdfr
31184588Sdfr#include <sys/param.h>
32184588Sdfr#include <sys/kernel.h>
33184588Sdfr#include <sys/kobj.h>
34184588Sdfr#include <sys/malloc.h>
35184588Sdfr
36184588Sdfr#include <kgssapi/gssapi.h>
37184588Sdfr#include <kgssapi/gssapi_impl.h>
38184588Sdfr
39184588SdfrOM_uint32
40184588Sdfrgss_add_oid_set_member(OM_uint32 *minor_status,
41184588Sdfr    const gss_OID member_oid,
42184588Sdfr    gss_OID_set *oid_set)
43184588Sdfr{
44184588Sdfr	OM_uint32 major_status;
45184588Sdfr	gss_OID_set set = *oid_set;
46184588Sdfr	gss_OID new_elements;
47184588Sdfr	gss_OID new_oid;
48184588Sdfr	int t;
49184588Sdfr
50184588Sdfr	*minor_status = 0;
51184588Sdfr
52184588Sdfr	major_status = gss_test_oid_set_member(minor_status,
53184588Sdfr	    member_oid, *oid_set, &t);
54184588Sdfr	if (major_status)
55184588Sdfr		return (major_status);
56184588Sdfr	if (t)
57184588Sdfr		return (GSS_S_COMPLETE);
58184588Sdfr
59184588Sdfr	new_elements = malloc((set->count + 1) * sizeof(gss_OID_desc),
60184588Sdfr	    M_GSSAPI, M_WAITOK);
61184588Sdfr
62184588Sdfr	new_oid = &new_elements[set->count];
63184588Sdfr	new_oid->elements = malloc(member_oid->length, M_GSSAPI, M_WAITOK);
64184588Sdfr	new_oid->length = member_oid->length;
65184588Sdfr	memcpy(new_oid->elements, member_oid->elements, member_oid->length);
66184588Sdfr
67184588Sdfr	if (set->elements) {
68184588Sdfr		memcpy(new_elements, set->elements,
69184588Sdfr		    set->count * sizeof(gss_OID_desc));
70184588Sdfr		free(set->elements, M_GSSAPI);
71184588Sdfr	}
72184588Sdfr	set->elements = new_elements;
73184588Sdfr	set->count++;
74184588Sdfr
75184588Sdfr	return (GSS_S_COMPLETE);
76184588Sdfr}
77