1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2007 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 #include <sys/types.h> 28 #include <unistd.h> 29 #include <dlfcn.h> 30 #include "k5-int.h" 31 32 #define KRB5_UID "app_krb5_user_uid" 33 34 /* 35 * mech_krb5 makes various calls to getuid(). When employed by gssd(8) and 36 * ktkt_warnd(8), app_krb5_user_uid() is used to select a given user's 37 * credential cache, rather than the id of the process. 38 */ 39 uid_t 40 krb5_getuid() 41 { 42 static uid_t (*gptr)() = NULL; 43 void *handle; 44 45 if (gptr == NULL) { 46 /* 47 * Specifically look for app_krb5_user_uid() in the application, 48 * and don't fall into an exhaustive search through all of the 49 * process dependencies. This interface is suplied from 50 * gssd(8) and ktkt_warnd(8). 51 */ 52 if (((handle = dlopen(0, (RTLD_LAZY | RTLD_FIRST))) == NULL) || 53 ((gptr = (uid_t (*)())dlsym(handle, KRB5_UID)) == NULL)) { 54 /* 55 * Fall back to the default getuid(), which is probably 56 * libc. 57 */ 58 gptr = &getuid; 59 } 60 } 61 62 /* 63 * Return the appropriate uid. Note, if a default getuid() couldn't 64 * be found, the getuid assignment would have failed to relocate, and 65 * hence this module would fail to load. 66 */ 67 return ((*gptr)()); 68 } 69