From c20927d4a089f71e58bbff211822aa3312d0335a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Groenvall?= Date: Tue, 12 Sep 1995 19:17:26 +0000 Subject: [PATCH] First we try afs.cell@REALM, if there is no such thing try afs@CELL instead. git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@103 ec53bebd-3082-4978-b11e-865c3cabbd6b --- lib/kafs/afssys.c | 76 +++++++++++++++++++++++++++++++++-------------- 1 file changed, 54 insertions(+), 22 deletions(-) diff --git a/lib/kafs/afssys.c b/lib/kafs/afssys.c index 9b4d2b66b..55afc2ec9 100644 --- a/lib/kafs/afssys.c +++ b/lib/kafs/afssys.c @@ -1,6 +1,7 @@ #include "config.h" #include "protos.h" +#include #include #include #ifdef HAVE_SYS_FILIO_H @@ -22,60 +23,91 @@ * Here only ASCII characters are relevant. */ -#define IsAsciiUpper(c) ('A' <= (c) && (c) <= 'Z') +#define IsAsciiLower(c) ('a' <= (c) && (c) <= 'z') -#define ToAsciiLower(c) ((c) - 'A' + 'a') +#define ToAsciiUpper(c) ((c) - 'a' + 'A') static void -folddown(a, b) +foldup(a, b) char *a, *b; { for (; *b; a++, b++) - if (IsAsciiUpper(*b)) - *a = ToAsciiLower(*b); + if (IsAsciiLower(*b)) + *a = ToAsciiUpper(*b); else *a = *b; *a = '\0'; } +#define _PATH_THISCELL "/usr/vice/etc/ThisCell" + +static char * +k_cell() +{ + static char cell[64]; + FILE *f = fopen(_PATH_THISCELL, "r"); + if (f == 0) + return 0; + fscanf(f, "%s\n", cell); + if (cell[0] != 0) + return cell; + else + return 0; +} + +static int +get_cred(char *princ, char *inst, char *krealm, CREDENTIALS *c, KTEXT_ST *tkt) +{ + int k_errno = krb_get_cred(princ, inst, krealm, c); + if (k_errno != KSUCCESS) + { + k_errno = krb_mk_req(tkt, princ, inst, krealm, 0); + if (k_errno == KSUCCESS) + k_errno = krb_get_cred(princ, inst, krealm, c); + } + return k_errno; +} + int -k_afsklog(char *realm) +k_afsklog(char *cell, char *krealm) { int k_errno; CREDENTIALS c; KTEXT_ST ticket; char username[256]; - char krealm[REALM_SZ]; + char realm[REALM_SZ]; + char CELL[64]; if (!k_hasafs()) return KSUCCESS; - if (realm == 0 || realm[0] == 0) + if (cell == 0 || cell[0] == 0) + cell = k_cell(); + if (cell == 0) + return KSUCCESS; /* Not running AFS */ + foldup(CELL, cell); + + if (krealm == 0 || krealm[0] == 0) { - k_errno = krb_get_lrealm(krealm, 0); + k_errno = krb_get_lrealm(realm, 0); if (k_errno != KSUCCESS) return k_errno; - realm = krealm; - } - - k_errno = krb_get_cred(AUTH_SUPERUSER, "", realm, &c); + krealm = realm; + } + + /* First we try afs.cell@REALM, if there is no such thing try + * afs@CELL instead. */ + k_errno = get_cred(AUTH_SUPERUSER, cell, krealm, &c, &ticket); if (k_errno != KSUCCESS) - { - k_errno = krb_mk_req(&ticket, AUTH_SUPERUSER, "", realm, 0); - if (k_errno == KSUCCESS) - k_errno = krb_get_cred(AUTH_SUPERUSER, "", realm, &c); - } - + k_errno = get_cred(AUTH_SUPERUSER, "", CELL, &c, &ticket); + if (k_errno == KSUCCESS) { - char cell[256]; struct ViceIoctl parms; struct ClearToken ct; int32_t sizeof_x; char buf[2048], *t; - folddown(cell, realm); - /* * Build a struct ClearToken */