From d5c71ea58ea4d7322d8fc2509d4de7c440322045 Mon Sep 17 00:00:00 2001 From: Assar Westerlund Date: Fri, 4 Sep 1998 16:25:46 +0000 Subject: [PATCH] new support for specifying homedir git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@5143 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/kafs/afskrb.c | 22 ++++++++++++++++++---- lib/kafs/afskrb5.c | 38 ++++++++++++++++++++++++++++++++------ lib/kafs/common.c | 17 +++++++++-------- lib/kafs/kafs.h | 30 ++++++++++++++++++++++++++---- lib/kafs/kafs_locl.h | 5 +++-- 5 files changed, 88 insertions(+), 24 deletions(-) diff --git a/lib/kafs/afskrb.c b/lib/kafs/afskrb.c index 1b3e53ea8..ed6be98b2 100644 --- a/lib/kafs/afskrb.c +++ b/lib/kafs/afskrb.c @@ -60,7 +60,8 @@ get_cred(kafs_data *data, const char *name, const char *inst, } static int -afslog_uid_int(kafs_data *data, const char *cell, uid_t uid) +afslog_uid_int(kafs_data *data, const char *cell, uid_t uid, + const char *homedir) { int ret; CREDENTIALS c; @@ -68,7 +69,7 @@ afslog_uid_int(kafs_data *data, const char *cell, uid_t uid) char realm[REALM_SZ], *lrealm; if (cell == 0 || cell[0] == 0) - return _kafs_afslog_all_local_cells (data, uid); + return _kafs_afslog_all_local_cells (data, uid, homedir); ret = krb_get_lrealm(realm , 0); if(ret == KSUCCESS && (d->realm == NULL || strcmp(d->realm, realm))) @@ -94,7 +95,8 @@ get_realm(kafs_data *data, const char *host) } int -krb_afslog_uid(const char *cell, const char *realm, uid_t uid) +krb_afslog_uid_home(const char *cell, const char *realm, uid_t uid, + const char *homedir) { kafs_data kd; struct krb_kafs_data d; @@ -104,7 +106,13 @@ krb_afslog_uid(const char *cell, const char *realm, uid_t uid) kd.get_realm = get_realm; kd.data = &d; d.realm = realm; - return afslog_uid_int(&kd, cell, uid); + return afslog_uid_int(&kd, cell, uid, homedir); +} + +int +krb_afslog_uid(const char *cell, const char *realm, uid_t uid) +{ + return krb_afslog_uid_home (cell, realm, uid, NULL); } int @@ -112,3 +120,9 @@ krb_afslog(const char *cell, const char *realm) { return krb_afslog_uid (cell, realm, getuid()); } + +int +krb_afslog_home(const char *cell, const char *realm, const char *homedir) +{ + return krb_afslog_uid_home (cell, realm, getuid(), homedir); +} diff --git a/lib/kafs/afskrb5.c b/lib/kafs/afskrb5.c index 66d8ae530..2f9aa0c73 100644 --- a/lib/kafs/afskrb5.c +++ b/lib/kafs/afskrb5.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 1995, 1996, 1997 Kungliga Tekniska Högskolan + * Copyright (c) 1995, 1996, 1997, 1998 Kungliga Tekniska Högskolan * (Royal Institute of Technology, Stockholm, Sweden). * All rights reserved. * @@ -114,8 +114,12 @@ get_realm(kafs_data *data, const char *host) } krb5_error_code -krb5_afslog_uid(krb5_context context, krb5_ccache id, - const char *cell, krb5_const_realm realm, uid_t uid) +krb5_afslog_uid_home(krb5_context context, + krb5_ccache id, + const char *cell, + krb5_const_realm realm, + uid_t uid, + const char *homedir) { kafs_data kd; struct krb5_kafs_data d; @@ -126,12 +130,34 @@ krb5_afslog_uid(krb5_context context, krb5_ccache id, d.context = context; d.id = id; d.realm = realm; - return afslog_uid_int(&kd, cell, uid); + return afslog_uid_int(&kd, cell, uid, homedir); } krb5_error_code -krb5_afslog(krb5_context context, krb5_ccache id, - const char *cell, krb5_const_realm realm) +krb5_afslog_uid(krb5_context context, + krb5_ccache id, + const char *cell, + krb5_const_realm realm, + uid_t uid) +{ + return krb5_afslog_uid_home (context, id, cell, realm, uid, NULL); +} + +krb5_error_code +krb5_afslog(krb5_context context, + krb5_ccache id, + const char *cell, + krb5_const_realm realm) { return krb5_afslog_uid (context, id, cell, realm, getuid()); } + +krb5_error_code +krb5_afslog_home(krb5_context context, + krb5_ccache id, + const char *cell, + krb5_const_realm realm, + const char *homedir) +{ + return krb5_afslog_uid_home (context, id, cell, realm, getuid(), homedir); +} diff --git a/lib/kafs/common.c b/lib/kafs/common.c index 444ecc691..fcd058966 100644 --- a/lib/kafs/common.c +++ b/lib/kafs/common.c @@ -213,27 +213,28 @@ find_cells(char *file, char ***cells, int *index) * Get tokens for all cells[] */ static int -afslog_cells(kafs_data *data, char **cells, int max, uid_t uid) +afslog_cells(kafs_data *data, char **cells, int max, uid_t uid, + const char *homedir) { int ret = 0; int i; for(i = 0; i < max; i++) - ret = (*data->afslog_uid)(data, cells[i], uid); + ret = (*data->afslog_uid)(data, cells[i], uid, homedir); return ret; } int -_kafs_afslog_all_local_cells(kafs_data *data, uid_t uid) +_kafs_afslog_all_local_cells(kafs_data *data, uid_t uid, const char *homedir) { int ret; char **cells = NULL; int index = 0; - char *p; - - if ((p = getenv("HOME"))) { + if (homedir == NULL) + homedir = getenv("HOME"); + if (homedir != NULL) { char home[MaxPathLen]; - snprintf(home, sizeof(home), "%s/.TheseCells", p); + snprintf(home, sizeof(home), "%s/.TheseCells", homedir); find_cells(home, &cells, &index); } find_cells(_PATH_THESECELLS, &cells, &index); @@ -241,7 +242,7 @@ _kafs_afslog_all_local_cells(kafs_data *data, uid_t uid) find_cells(_PATH_ARLA_THESECELLS, &cells, &index); find_cells(_PATH_ARLA_THISCELL, &cells, &index); - ret = afslog_cells(data, cells, index, uid); + ret = afslog_cells(data, cells, index, uid, homedir); while(index > 0) free(cells[--index]); free(cells); diff --git a/lib/kafs/kafs.h b/lib/kafs/kafs.h index 348a118bb..bedcb095a 100644 --- a/lib/kafs/kafs.h +++ b/lib/kafs/kafs.h @@ -118,6 +118,11 @@ int k_hasafs __P((void)); int krb_afslog __P((const char *cell, const char *realm)); int krb_afslog_uid __P((const char *cell, const char *realm, uid_t uid)); +int krb_afslog_home __P((const char *cell, const char *realm, + const char *homedir)); +int krb_afslog_uid_home __P((const char *cell, const char *realm, uid_t uid, + const char *homedir)); + /* compat */ #define k_afsklog krb_afslog #define k_afsklog_uid krb_afslog_uid @@ -144,10 +149,27 @@ int kafs_settoken __P((const char*, uid_t, CREDENTIALS*)); #endif #ifdef KRB5_H_INCLUDED -krb5_error_code krb5_afslog_uid __P((krb5_context, krb5_ccache, - const char*, krb5_const_realm, uid_t)); -krb5_error_code krb5_afslog __P((krb5_context, krb5_ccache, - const char*, krb5_const_realm)); +krb5_error_code krb5_afslog_uid __P((krb5_context context, + krb5_ccache id, + const char *cell, + krb5_const_realm realm, + uid_t uid)); +krb5_error_code krb5_afslog __P((krb5_context context, + krb5_ccache id, + const char *cell, + krb5_const_realm realm)); +krb5_error_code krb5_afslog_uid_home __P((krb5_context context, + krb5_ccache id, + const char *cell, + krb5_const_realm realm, + uid_t uid, + const char *homedir)); + +krb5_error_code krb5_afslog_home __P((krb5_context context, + krb5_ccache id, + const char *cell, + krb5_const_realm realm, + const char *homedir)); #endif diff --git a/lib/kafs/kafs_locl.h b/lib/kafs/kafs_locl.h index 06bdc7db4..21606a8c4 100644 --- a/lib/kafs/kafs_locl.h +++ b/lib/kafs/kafs_locl.h @@ -106,7 +106,8 @@ #include "afssysdefs.h" struct kafs_data; -typedef int (*afslog_uid_func_t)(struct kafs_data*, const char*, uid_t); +typedef int (*afslog_uid_func_t)(struct kafs_data*, const char*, uid_t, + const char *); typedef int (*get_cred_func_t)(struct kafs_data*, const char*, const char*, const char*, CREDENTIALS*); @@ -120,7 +121,7 @@ typedef struct kafs_data { void *data; } kafs_data; -int _kafs_afslog_all_local_cells(kafs_data*, uid_t); +int _kafs_afslog_all_local_cells(kafs_data*, uid_t, const char*); int _kafs_get_cred(kafs_data*, const char*, const char*, const char *, CREDENTIALS*);