/* $Id$ * * Copyright (C) 1988-1998 by the Massachusetts Institute of Technology. * For copying and distribution information, please see the file * . */ #include #include #include #include #include #include #include RCSID("$Header$"); extern char *whoami; /* too bad we can't set the pathname easily */ static char *srvtab = KEYFILE; /* default == /etc/srvtab */ static char realm[REALM_SZ]; static char master[INST_SZ] = "sms"; static char service[ANAME_SZ] = "rcmd"; C_Block session; int get_mr_tgt(void); static void init(void) { static int initialized = 0; if (!initialized) { if (krb_get_lrealm(realm, 1)) strcpy(realm, KRB_REALM); initialize_krb_error_table(); initialized = 1; } } int get_mr_update_ticket(char *host, KTEXT ticket) { int code; int pass; char phost[BUFSIZ]; CREDENTIALS cr; pass = 1; init(); strcpy(phost, (char *)krb_get_phost(host)); try_it: code = krb_mk_req(ticket, service, phost, realm, (long)0); if (code) { if (pass == 1) { /* maybe we're taking too long? */ if ((code = get_mr_tgt())) { com_err(whoami, code, "can't get Kerberos TGT"); return code; } pass++; goto try_it; } code += ERROR_TABLE_BASE_krb; com_err(whoami, code, "in krb_mk_req"); } else { code = krb_get_cred(service, phost, realm, &cr); if (code) code += ERROR_TABLE_BASE_krb; memcpy(session, cr.session, sizeof(session)); } return code; } int get_mr_tgt(void) { int code; char linst[INST_SZ], kinst[INST_SZ]; init(); linst[0] = '\0'; strcpy(kinst, "krbtgt"); code = krb_get_svc_in_tkt(master, linst, realm, kinst, realm, DEFAULT_TKT_LIFE, srvtab); if (!code) return 0; else return code + ERROR_TABLE_BASE_krb; }