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 #pragma ident "%Z%%M% %I% %E% SMI" 28 29 #include <sys/types.h> 30 #include <unistd.h> 31 #include <dlfcn.h> 32 #include "k5-int.h" 33 34 #define KRB5_UID "app_krb5_user_uid" 35 36 /* 37 * mech_krb5 makes various calls to getuid(). When employed by gssd(1M) and 38 * ktkt_warnd(1M), app_krb5_user_uid() is used to select a given user's 39 * credential cache, rather than the id of the process. 40 */ 41 uid_t 42 krb5_getuid() 43 { 44 static uid_t (*gptr)() = NULL; 45 void *handle; 46 47 if (gptr == NULL) { 48 /* 49 * Specifically look for app_krb5_user_uid() in the application, 50 * and don't fall into an exhaustive search through all of the 51 * process dependencies. This interface is suplied from 52 * gssd(1M) and ktkt_warnd(1M). 53 */ 54 if (((handle = dlopen(0, (RTLD_LAZY | RTLD_FIRST))) == NULL) || 55 ((gptr = (uid_t (*)())dlsym(handle, KRB5_UID)) == NULL)) { 56 /* 57 * Fall back to the default getuid(), which is probably 58 * libc. 59 */ 60 gptr = &getuid; 61 } 62 } 63 64 /* 65 * Return the appropriate uid. Note, if a default getuid() couldn't 66 * be found, the getuid assignment would have failed to relocate, and 67 * hence this module would fail to load. 68 */ 69 return ((*gptr)()); 70 } 71