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