1/*
2 * Copyright (c) 2005, PADL Software Pty Ltd.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 *
9 * 1. Redistributions of source code must retain the above copyright
10 *    notice, this list of conditions and the following disclaimer.
11 *
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * 3. Neither the name of PADL Software nor the names of its contributors
17 *    may be used to endorse or promote products derived from this software
18 *    without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY PADL SOFTWARE AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED.  IN NO EVENT SHALL PADL SOFTWARE OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 */
32
33#include "kcm_locl.h"
34
35RCSID("$Id: cursor.c 17447 2006-05-05 10:52:01Z lha $");
36
37krb5_error_code
38kcm_cursor_new(krb5_context context,
39	       pid_t pid,
40	       kcm_ccache ccache,
41	       uint32_t *cursor)
42{
43    kcm_cursor **p;
44    krb5_error_code ret;
45
46    *cursor = 0;
47
48    KCM_ASSERT_VALID(ccache);
49
50    HEIMDAL_MUTEX_lock(&ccache->mutex);
51    for (p = &ccache->cursors; *p != NULL; p = &(*p)->next)
52	;
53
54    *p = (kcm_cursor *)malloc(sizeof(kcm_cursor));
55    if (*p == NULL) {
56	ret = KRB5_CC_NOMEM;
57	goto out;
58    }
59
60    (*p)->pid = pid;
61    (*p)->key = ++ccache->n_cursor;
62    (*p)->credp = ccache->creds;
63    (*p)->next = NULL;
64
65    *cursor = (*p)->key;
66
67    ret = 0;
68
69out:
70    HEIMDAL_MUTEX_unlock(&ccache->mutex);
71
72    return ret;
73}
74
75krb5_error_code
76kcm_cursor_find(krb5_context context,
77		pid_t pid,
78		kcm_ccache ccache,
79		uint32_t key,
80		kcm_cursor **cursor)
81{
82    kcm_cursor *p;
83    krb5_error_code ret;
84
85    KCM_ASSERT_VALID(ccache);
86
87    if (key == 0)
88	return KRB5_CC_NOTFOUND;
89
90    ret = KRB5_CC_END;
91
92    HEIMDAL_MUTEX_lock(&ccache->mutex);
93
94    for (p = ccache->cursors; p != NULL; p = p->next) {
95	if (p->key == key) {
96	    if (p->pid != pid)
97		ret = KRB5_FCC_PERM;
98	    else
99		ret = 0;
100	    break;
101	}
102    }
103
104    if (ret == 0)
105	*cursor = p;
106
107    HEIMDAL_MUTEX_unlock(&ccache->mutex);
108
109    return ret;
110}
111
112krb5_error_code
113kcm_cursor_delete(krb5_context context,
114	     	  pid_t pid,
115		  kcm_ccache ccache,
116		  uint32_t key)
117{
118    kcm_cursor **p;
119    krb5_error_code ret;
120
121    KCM_ASSERT_VALID(ccache);
122
123    if (key == 0)
124	return KRB5_CC_NOTFOUND;
125
126    ret = KRB5_CC_END;
127
128    HEIMDAL_MUTEX_lock(&ccache->mutex);
129
130    for (p = &ccache->cursors; *p != NULL; p = &(*p)->next) {
131	if ((*p)->key == key) {
132	    if ((*p)->pid != pid)
133		ret = KRB5_FCC_PERM;
134	    else
135		ret = 0;
136	    break;
137	}
138    }
139
140    if (ret == 0) {
141	kcm_cursor *x = *p;
142
143	*p = x->next;
144	free(x);
145    }
146
147    HEIMDAL_MUTEX_unlock(&ccache->mutex);
148
149    return ret;
150}
151
152