2 * Copyright (c) 2001-2002 Kungliga Tekniska Högskolan
3 * (Royal Institute of Technology, Stockholm, Sweden).
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the Institute nor the names of its contributors
18 * may be used to endorse or promote products derived from this software
19 * without specific prior written permission.
21 * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24 * ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34 #include "krb5_locl.h"
39 struct any_data
*next
;
43 free_list (krb5_context context
, struct any_data
*a
)
45 struct any_data
*next
;
47 for (; a
!= NULL
; a
= next
) {
51 krb5_kt_close(context
, a
->kt
);
56 static krb5_error_code KRB5_CALLCONV
57 any_resolve(krb5_context context
, const char *name
, krb5_keytab id
)
59 struct any_data
*a
, *a0
= NULL
, *prev
= NULL
;
63 while (strsep_copy(&name
, ",", buf
, sizeof(buf
)) != -1) {
64 a
= calloc(1, sizeof(*a
));
71 a
->name
= strdup(buf
);
72 if (a
->name
== NULL
) {
74 krb5_set_error_message(context
, ret
, N_("malloc: out of memory", ""));
82 ret
= krb5_kt_resolve (context
, buf
, &a
->kt
);
88 krb5_set_error_message(context
, ENOENT
, N_("empty ANY: keytab", ""));
94 free_list (context
, a0
);
98 static krb5_error_code KRB5_CALLCONV
99 any_get_name (krb5_context context
,
104 struct any_data
*a
= id
->data
;
105 strlcpy(name
, a
->name
, namesize
);
109 static krb5_error_code KRB5_CALLCONV
110 any_close (krb5_context context
,
113 struct any_data
*a
= id
->data
;
115 free_list (context
, a
);
119 struct any_cursor_extra_data
{
121 krb5_kt_cursor cursor
;
124 static krb5_error_code KRB5_CALLCONV
125 any_start_seq_get(krb5_context context
,
129 struct any_data
*a
= id
->data
;
130 struct any_cursor_extra_data
*ed
;
133 c
->data
= malloc (sizeof(struct any_cursor_extra_data
));
135 krb5_set_error_message(context
, ENOMEM
, N_("malloc: out of memory", ""));
138 ed
= (struct any_cursor_extra_data
*)c
->data
;
139 for (ed
->a
= a
; ed
->a
!= NULL
; ed
->a
= ed
->a
->next
) {
140 ret
= krb5_kt_start_seq_get(context
, ed
->a
->kt
, &ed
->cursor
);
147 krb5_clear_error_message (context
);
153 static krb5_error_code KRB5_CALLCONV
154 any_next_entry (krb5_context context
,
156 krb5_keytab_entry
*entry
,
157 krb5_kt_cursor
*cursor
)
159 krb5_error_code ret
, ret2
;
160 struct any_cursor_extra_data
*ed
;
162 ed
= (struct any_cursor_extra_data
*)cursor
->data
;
164 ret
= krb5_kt_next_entry(context
, ed
->a
->kt
, entry
, &ed
->cursor
);
167 else if (ret
!= KRB5_KT_END
)
170 ret2
= krb5_kt_end_seq_get (context
, ed
->a
->kt
, &ed
->cursor
);
173 while ((ed
->a
= ed
->a
->next
) != NULL
) {
174 ret2
= krb5_kt_start_seq_get(context
, ed
->a
->kt
, &ed
->cursor
);
179 krb5_clear_error_message (context
);
185 static krb5_error_code KRB5_CALLCONV
186 any_end_seq_get(krb5_context context
,
188 krb5_kt_cursor
*cursor
)
190 krb5_error_code ret
= 0;
191 struct any_cursor_extra_data
*ed
;
193 ed
= (struct any_cursor_extra_data
*)cursor
->data
;
195 ret
= krb5_kt_end_seq_get(context
, ed
->a
->kt
, &ed
->cursor
);
201 static krb5_error_code KRB5_CALLCONV
202 any_add_entry(krb5_context context
,
204 krb5_keytab_entry
*entry
)
206 struct any_data
*a
= id
->data
;
209 ret
= krb5_kt_add_entry(context
, a
->kt
, entry
);
210 if(ret
!= 0 && ret
!= KRB5_KT_NOWRITE
) {
211 krb5_set_error_message(context
, ret
,
212 N_("failed to add entry to %s", ""),
221 static krb5_error_code KRB5_CALLCONV
222 any_remove_entry(krb5_context context
,
224 krb5_keytab_entry
*entry
)
226 struct any_data
*a
= id
->data
;
230 ret
= krb5_kt_remove_entry(context
, a
->kt
, entry
);
234 if(ret
!= KRB5_KT_NOWRITE
&& ret
!= KRB5_KT_NOTFOUND
) {
235 krb5_set_error_message(context
, ret
,
236 N_("Failed to remove keytab "
237 "entry from %s", "keytab name"),
245 return KRB5_KT_NOTFOUND
;
249 const krb5_kt_ops krb5_any_ops
= {