]> CyberLeo.Net >> Repos - FreeBSD/releng/9.2.git/blob - crypto/heimdal/kcm/cursor.c
- Copy stable/9 to releng/9.2 as part of the 9.2-RELEASE cycle.
[FreeBSD/releng/9.2.git] / crypto / heimdal / kcm / cursor.c
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
35 RCSID("$Id: cursor.c 17447 2006-05-05 10:52:01Z lha $");
36
37 krb5_error_code
38 kcm_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
69 out:
70     HEIMDAL_MUTEX_unlock(&ccache->mutex);
71
72     return ret;
73 }
74
75 krb5_error_code
76 kcm_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
112 krb5_error_code
113 kcm_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