diff options
Diffstat (limited to 'server/kopt.c')
-rw-r--r-- | server/kopt.c | 440 |
1 files changed, 230 insertions, 210 deletions
diff --git a/server/kopt.c b/server/kopt.c index 5d62688..3bcaa57 100644 --- a/server/kopt.c +++ b/server/kopt.c @@ -16,24 +16,22 @@ * Kerberos: krb_conf.h,v 4.0 89/01/23 09:59:27 jtkohl Exp */ +#include <zephyr/mit-copyright.h> +#include "zserver.h" + #ifndef lint #ifndef SABER -static char *rcsid_rd_req_c = +static const char *rcsid_rd_req_c = "$Id$"; #endif /* lint */ #endif /* SABER */ -#ifdef KERBEROS +#ifdef ZEPHYR_USES_KERBEROS #ifndef NOENCRYPTION -#include <zephyr/mit-copyright.h> -#include <zephyr/zephyr.h> -#include <stdio.h> -#include <krb.h> -#include "zserver.h" - /* Byte ordering */ -static int krbONE; +#undef HOST_BYTE_ORDER +static int krbONE = 1; #define HOST_BYTE_ORDER (* (char *) &krbONE) #define KRB_PROT_VERSION 4 @@ -64,9 +62,6 @@ static int krbONE; #define KERB_ERR_PRINCIPAL_NOT_UNIQUE 9 #define KERB_ERR_NULL_KEY 10 -#include <sys/time.h> -#include <string.h> - extern int krb_ap_req_debug; extern struct timeval t_local; @@ -97,34 +92,26 @@ typedef struct { } KeySchedRec; static KeySchedRec scheds[HASH_SIZE_1][HASH_SIZE_2]; -#ifdef __STDC__ -Sched* check_key_sched_cache (des_cblock key) -#else -Sched* check_key_sched_cache (key) - des_cblock key; -#endif +Sched *check_key_sched_cache(key) + des_cblock key; { unsigned int hash_value = key[0] + key[1] * 256; KeySchedRec *rec = scheds[hash_value % HASH_SIZE_1]; int i; - for (i = HASH_SIZE_2 - 1; i >= 0; i--) - if (rec[i].last_time_used - && key[0] == rec[i].key[0] - && !memcmp (key, rec[i].key, sizeof (des_cblock))) { + for (i = HASH_SIZE_2 - 1; i >= 0; i--) { + if (rec[i].last_time_used && key[0] == rec[i].key[0] + && !memcmp(key, rec[i].key, sizeof(des_cblock))) { rec[i].last_time_used = last_use++; return &rec[i].schedule; } + } return 0; } -#ifdef __STDC__ -void add_to_key_sched_cache (des_cblock key, Sched* sched) -#else -void add_to_key_sched_cache (key, sched) - des_cblock key; - Sched* sched; -#endif +void add_to_key_sched_cache(key, sched) + des_cblock key; + Sched *sched; { unsigned int hash_value = key[0] + key[1] * 256; KeySchedRec *rec = scheds[hash_value % HASH_SIZE_1]; @@ -138,7 +125,7 @@ void add_to_key_sched_cache (key, sched) if (rec[i].last_time_used < rec[oldest].last_time_used) oldest = i; } - (void) memcpy (rec[oldest].key, key, sizeof (des_cblock)); + memcpy (rec[oldest].key, key, sizeof(des_cblock)); rec[oldest].schedule = *sched; rec[oldest].last_time_used = last_use++; } @@ -178,7 +165,7 @@ krb_set_key(key,cvt) int cvt; { #ifdef NOENCRYPTION - (void) memset(serv_key, 0, sizeof(serv_key)); + memset(serv_key, 0, sizeof(serv_key)); return KSUCCESS; #else /* Encrypt */ Sched *s; @@ -187,15 +174,15 @@ krb_set_key(key,cvt) if (cvt) string_to_key(key,serv_key); else - (void) memcpy((char *)serv_key,key,8); + memcpy((char *)serv_key,key,8); s = check_key_sched_cache (serv_key); if (s) { serv_ksched = *s; return 0; } - ret = des_key_sched (serv_key, serv_ksched.s); - add_to_key_sched_cache (serv_key, &serv_ksched); + ret = des_key_sched(serv_key, serv_ksched.s); + add_to_key_sched_cache(serv_key, &serv_ksched); return ret; #endif /* NOENCRYPTION */ } @@ -242,18 +229,19 @@ krb_set_key(key,cvt) * Mutual authentication is not implemented. */ +int krb_rd_req(authent,service,instance,from_addr,ad,fn) - register KTEXT authent; /* The received message */ - char *service; /* Service name */ - char *instance; /* Service instance */ - long from_addr; /* Net address of originating host */ - AUTH_DAT *ad; /* Structure to be filled in */ - char *fn; /* Filename to get keys from */ + KTEXT authent; /* The received message */ + char *service; /* Service name */ + char *instance; /* Service instance */ + unsigned KRB_INT32 from_addr; /* Net address of originating host */ + AUTH_DAT *ad; /* Structure to be filled in */ + char *fn; /* Filename to get keys from */ { KTEXT_ST ticket; /* Temp storage for ticket */ KTEXT tkt = &ticket; KTEXT_ST req_id_st; /* Temp storage for authenticator */ - register KTEXT req_id = &req_id_st; + KTEXT req_id = &req_id_st; char realm[REALM_SZ]; /* Realm of issuing kerberos */ Sched seskey_sched, *sched; /* Key sched for session key */ @@ -265,7 +253,7 @@ krb_rd_req(authent,service,instance,from_addr,ad,fn) char r_realm[REALM_SZ]; /* Client realm from authenticator */ unsigned int r_time_ms; /* Fine time from authenticator */ unsigned long r_time_sec; /* Coarse time from authenticator */ - register char *ptr; /* For stepping through */ + char *ptr; /* For stepping through */ unsigned long delta_t; /* Time in authenticator - local time */ long tkt_age; /* Age of ticket */ int swap_bytes; /* Need to swap bytes? */ @@ -283,7 +271,7 @@ krb_rd_req(authent,service,instance,from_addr,ad,fn) /* check version */ if (KRB_PROT_VERSION != (unsigned int) *ptr++) - return(RD_AP_VERSION); + return RD_AP_VERSION; /* byte order */ swap_bytes = 0; @@ -293,12 +281,12 @@ krb_rd_req(authent,service,instance,from_addr,ad,fn) /* check msg type */ mutual = 0; switch (*ptr++ & ~1) { - case AUTH_MSG_APPL_REQUEST: + case AUTH_MSG_APPL_REQUEST: break; - case AUTH_MSG_APPL_REQUEST_MUTUAL: + case AUTH_MSG_APPL_REQUEST_MUTUAL: mutual++; break; - default: + default: return(RD_AP_MSG_TYPE); } @@ -309,7 +297,7 @@ krb_rd_req(authent,service,instance,from_addr,ad,fn) mutual = 0; #endif /* lint */ s_kvno = *ptr++; /* get server key version */ - (void) strcpy(realm,ptr); /* And the realm of the issuing KDC */ + strcpy(realm,ptr); /* And the realm of the issuing KDC */ ptr += strlen(ptr) + 1; /* skip the realm "hint" */ /* @@ -320,85 +308,90 @@ krb_rd_req(authent,service,instance,from_addr,ad,fn) * from the ticket file. If "fn" is the null string, use the * default ticket file. */ - if (fn && (strcmp(st_nam,service) || strcmp(st_inst,instance) || - strcmp(st_rlm,realm) || (st_kvno != s_kvno))) { - if (*fn == 0) fn = KEYFILE; + if (fn && (strcmp(st_nam,service) != 0 || strcmp(st_inst,instance) != 0 || + strcmp(st_rlm,realm) != 0 || (st_kvno != s_kvno))) { + if (*fn == 0) + fn = KEYFILE; st_kvno = s_kvno; #ifndef NOENCRYPTION - if (read_service_key(service,instance,realm,(int) s_kvno, - fn,(char *)skey)) + if (read_service_key(service,instance,realm, (int) s_kvno, + fn, (char *) skey)) return(RD_AP_UNDEC); - if ((status = krb_set_key((char *)skey,0)) != 0) + status = krb_set_key((char *) skey, 0); + if (status != 0) return(status); #endif /* !NOENCRYPTION */ - (void) strcpy(st_rlm,realm); - (void) strcpy(st_nam,service); - (void) strcpy(st_inst,instance); + strcpy(st_rlm,realm); + strcpy(st_nam,service); + strcpy(st_inst,instance); } /* Get ticket from authenticator */ tkt->length = (int) *ptr++; if ((tkt->length + (ptr+1 - (char *) authent->dat)) > authent->length) - return(RD_AP_MODIFIED); - (void) memcpy((char *)(tkt->dat),ptr+1,tkt->length); + return RD_AP_MODIFIED; + memcpy(tkt->dat, ptr + 1, tkt->length); if (krb_ap_req_debug) - log("ticket->length: %d",tkt->length); + krb_log("ticket->length: %d", tkt->length); #ifndef NOENCRYPTION /* Decrypt and take apart ticket */ #endif - if (decomp_ticket(tkt,&ad->k_flags,ad->pname,ad->pinst,ad->prealm, - &(ad->address),ad->session, &(ad->life), - &(ad->time_sec),sname,iname,serv_key,serv_ksched.s)) - return(RD_AP_UNDEC); + if (decomp_ticket(tkt, &ad->k_flags, ad->pname, ad->pinst, ad->prealm, + &(ad->address), ad->session, &(ad->life), + &(ad->time_sec), sname, iname, serv_key, serv_ksched.s)) + return RD_AP_UNDEC; if (krb_ap_req_debug) { - log("Ticket Contents."); - log(" Aname: %s.%s",ad->pname, - ((int)*(ad->prealm) ? ad->prealm : "Athena")); - log(" Service: %s%s%s",sname,((int)*iname ? "." : ""),iname); + krb_log("Ticket Contents."); + krb_log(" Aname: %s.%s",ad->pname, + ((int)*(ad->prealm) ? ad->prealm : "Athena")); + krb_log(" Service: %s%s%s", sname, ((int)*iname ? "." : ""), iname); } /* Extract the authenticator */ req_id->length = (int) *(ptr++); if ((req_id->length + (ptr + tkt->length - (char *) authent->dat)) > authent->length) - return(RD_AP_MODIFIED); - (void) memcpy((char *)(req_id->dat),ptr + tkt->length, req_id->length); + return RD_AP_MODIFIED; + memcpy(req_id->dat, ptr + tkt->length, req_id->length); #ifndef NOENCRYPTION /* And decrypt it with the session key from the ticket */ - if (krb_ap_req_debug) log("About to decrypt authenticator"); - sched = check_key_sched_cache (ad->session); + if (krb_ap_req_debug) + krb_log("About to decrypt authenticator"); + sched = check_key_sched_cache(ad->session); if (!sched) { sched = &seskey_sched; - key_sched (ad->session, seskey_sched.s); - add_to_key_sched_cache (ad->session, &seskey_sched); + key_sched(ad->session, seskey_sched.s); + add_to_key_sched_cache(ad->session, &seskey_sched); } /* can't do much to optimize this... */ - pcbc_encrypt((C_Block *)req_id->dat,(C_Block *)req_id->dat, - (long) req_id->length, sched->s, ad->session,DES_DECRYPT); - if (krb_ap_req_debug) log("Done."); + pcbc_encrypt((C_Block *) req_id->dat, (C_Block *) req_id->dat, + (long) req_id->length, sched->s, ad->session, DES_DECRYPT); + if (krb_ap_req_debug) + krb_log("Done."); #endif /* NOENCRYPTION */ #define check_ptr() if ((ptr - (char *) req_id->dat) > req_id->length) return(RD_AP_MODIFIED); ptr = (char *) req_id->dat; - (void) strcpy(r_aname,ptr); /* Authentication name */ - ptr += strlen(r_aname)+1; + strcpy(r_aname,ptr); /* Authentication name */ + ptr += strlen(r_aname) + 1; check_ptr(); - (void) strcpy(r_inst,ptr); /* Authentication instance */ - ptr += strlen(r_inst)+1; + strcpy(r_inst,ptr); /* Authentication instance */ + ptr += strlen(r_inst) + 1; check_ptr(); - (void) strcpy(r_realm,ptr); /* Authentication name */ - ptr += strlen(r_realm)+1; + strcpy(r_realm,ptr); /* Authentication name */ + ptr += strlen(r_realm) + 1; check_ptr(); - (void) memcpy((char *)&ad->checksum,ptr,4); /* Checksum */ + memcpy(&ad->checksum, ptr, 4); /* Checksum */ ptr += 4; check_ptr(); - if (swap_bytes) swap_u_long(ad->checksum); + if (swap_bytes) + swap_u_long(ad->checksum); r_time_ms = *(ptr++); /* Time (fine) */ #ifdef lint /* XXX r_time_ms is set but not used. why??? */ @@ -408,61 +401,102 @@ krb_rd_req(authent,service,instance,from_addr,ad,fn) #endif /* lint */ check_ptr(); /* assume sizeof(r_time_sec) == 4 ?? */ - (void) memcpy((char *)&r_time_sec,ptr,4); /* Time (coarse) */ - if (swap_bytes) swap_u_long(r_time_sec); + memcpy(&r_time_sec,ptr,4); /* Time (coarse) */ + if (swap_bytes) + swap_u_long(r_time_sec); /* Check for authenticity of the request */ if (krb_ap_req_debug) - log("Pname: %s %s",ad->pname,r_aname); + krb_log("Pname: %s %s",ad->pname,r_aname); if (strcmp(ad->pname,r_aname) != 0) - return(RD_AP_INCON); + return RD_AP_INCON; if (strcmp(ad->pinst,r_inst) != 0) - return(RD_AP_INCON); + return RD_AP_INCON; if (krb_ap_req_debug) - log("Realm: %s %s",ad->prealm,r_realm); - if ((strcmp(ad->prealm,r_realm) != 0)) - return(RD_AP_INCON); + krb_log("Realm: %s %s", ad->prealm, r_realm); + if (strcmp(ad->prealm,r_realm) != 0) + return RD_AP_INCON; if (krb_ap_req_debug) - log("Address: %d %d",ad->address,from_addr); + krb_log("Address: %d %d", ad->address, from_addr); if (from_addr && (ad->address != from_addr)) - return(RD_AP_BADD); + return RD_AP_BADD; delta_t = abs((int)(t_local.tv_sec - r_time_sec)); if (delta_t > CLOCK_SKEW) { - (void) gettimeofday(&t_local, (struct timezone *)0); + gettimeofday(&t_local, NULL); delta_t = abs((int)(t_local.tv_sec - r_time_sec)); if (delta_t > CLOCK_SKEW) { - if (krb_ap_req_debug) - log("Time out of range: %d - %d = %d", - t_local.tv_sec,r_time_sec,delta_t); - return(RD_AP_TIME); + if (krb_ap_req_debug) { + krb_log("Time out of range: %d - %d = %d", + t_local.tv_sec, r_time_sec, delta_t); + } + return RD_AP_TIME; } } /* Now check for expiration of ticket */ tkt_age = t_local.tv_sec - ad->time_sec; - if (krb_ap_req_debug) - log("Time: %d Issue Date: %d Diff: %d Life %x", - t_local.tv_sec,ad->time_sec,tkt_age,ad->life); + if (krb_ap_req_debug) { + krb_log("Time: %d Issue Date: %d Diff: %d Life %x", + t_local.tv_sec, ad->time_sec, tkt_age, ad->life); + } if (t_local.tv_sec < ad->time_sec) { - if ((ad->time_sec - t_local.tv_sec) > CLOCK_SKEW) - return(RD_AP_NYV); + if (ad->time_sec - t_local.tv_sec > CLOCK_SKEW) + return RD_AP_NYV; + } else if (t_local.tv_sec - ad->time_sec > 5 * 60 * ad->life) { + return RD_AP_EXP; } - else if ((t_local.tv_sec - ad->time_sec) > 5 * 60 * ad->life) - return(RD_AP_EXP); /* All seems OK */ ad->reply.length = 0; - return(RD_AP_OK); + return RD_AP_OK; } #endif /* NOENCRYPTION */ +int +krb_find_ticket(authent, ticket) + KTEXT authent, ticket; +{ + char *ptr; /* For stepping through */ + + /* Check for bogus length. */ + if (authent->length <= 0) + return RD_AP_MODIFIED; + + ptr = (char *) authent->dat; + + /* check version */ + if (KRB_PROT_VERSION != (unsigned int) *ptr++) + return RD_AP_VERSION; + + /* Make sure msg type is ok. */ + switch (*ptr++ & ~1) { + case AUTH_MSG_APPL_REQUEST: + case AUTH_MSG_APPL_REQUEST_MUTUAL: + break; + default: + return RD_AP_MSG_TYPE; + } + + *ptr++; /* skip server key version */ + ptr += strlen(ptr) + 1; /* skip the realm "hint" */ + + /* Get ticket from authenticator */ + ticket->length = (int) *ptr++; + if ((ticket->length + (ptr + 1 - (char *) authent->dat)) > authent->length) + return RD_AP_MODIFIED; + memcpy((char *)(ticket->dat),ptr+1,ticket->length); + + return RD_AP_OK; +} + static char local_realm_buffer[REALM_SZ+1]; +int krb_get_lrealm(r,n) char *r; int n; @@ -470,125 +504,111 @@ krb_get_lrealm(r,n) FILE *cnffile, *fopen(); if (n > 1) - return(KFAILURE); /* Temporary restriction */ + return KFAILURE; /* Temporary restriction */ + + if (my_realm[0]) { + strcpy(r, my_realm); + return KSUCCESS; + } if (local_realm_buffer[0]) { - strcpy (r, local_realm_buffer); + strcpy(r, local_realm_buffer); return KSUCCESS; } - if ((cnffile = fopen(KRB_CONF, "r")) == NULL) { + cnffile = fopen(KRB_CONF, "r"); + if (cnffile == NULL) { if (n == 1) { - (void) strcpy(r, KRB_REALM); - return(KSUCCESS); + strcpy(r, KRB_REALM); + return KSUCCESS; + } else { + return KFAILURE; } - else - return(KFAILURE); } if (fscanf(cnffile,"%s",r) != 1) { - (void) fclose(cnffile); - return(KFAILURE); + fclose(cnffile); + return KFAILURE; } - (void) fclose(cnffile); - return(KSUCCESS); + fclose(cnffile); + return KSUCCESS; } -#endif /* KERBEROS */ +int +decomp_ticket(tkt, flags, pname, pinstance, prealm, paddress, session, + life, time_sec, sname, sinstance, key, key_s) + KTEXT tkt; /* The ticket to be decoded */ + unsigned char *flags; /* Kerberos ticket flags */ + char *pname; /* Authentication name */ + char *pinstance; /* Principal's instance */ + char *prealm; /* Principal's authentication domain */ + unsigned long *paddress; /* Net address of entity + * requesting ticket */ + C_Block session; /* Session key inserted in ticket */ + int *life; /* Lifetime of the ticket */ + unsigned long *time_sec; /* Issue time and date */ + char *sname; /* Service name */ + char *sinstance; /* Service instance */ + C_Block key; /* Service's secret key + * (to decrypt the ticket) */ + des_key_sched key_s; /* The precomputed key schedule */ +{ + static int tkt_swap_bytes; + unsigned char *uptr; + char *ptr = (char *)tkt->dat; -#ifdef ibm032 +#ifndef NOENCRYPTION + /* Do the decryption */ + pcbc_encrypt((C_Block *)tkt->dat,(C_Block *)tkt->dat, + (long) tkt->length,key_s,(C_Block *) key,0); +#endif /* ! NOENCRYPTION */ + + *flags = *ptr; /* get flags byte */ + ptr += sizeof(*flags); + tkt_swap_bytes = 0; + if (HOST_BYTE_ORDER != ((*flags >> K_FLAG_ORDER)& 1)) + tkt_swap_bytes++; + + if (strlen(ptr) > ANAME_SZ) + return(KFAILURE); + strcpy(pname,ptr); /* pname */ + ptr += strlen(pname) + 1; -#if defined (__GNUC__) || defined (__HIGHC__) -#ifdef __HIGHC__ -#define asm _ASM -#endif + if (strlen(ptr) > INST_SZ) + return(KFAILURE); + strcpy(pinstance,ptr); /* instance */ + ptr += strlen(pinstance) + 1; -/* - * Copyright (C) 1990 by the Massachusetts Institute of Technology - * - * Permission to use, copy, modify, and distribute this software and its - * documentation for any purpose and without fee is hereby granted. - */ + if (strlen(ptr) > REALM_SZ) + return(KFAILURE); + strcpy(prealm,ptr); /* realm */ + ptr += strlen(prealm) + 1; + /* temporary hack until realms are dealt with properly */ + if (*prealm == 0) + strcpy(prealm, ZGetRealm()); -void asm_wrapper_kopt_c () { - /* - * Multiply routine. The C library routine tries to optimize around - * the multiply-step instruction, which was slower in earlier versions - * of the processor; this is no longer useful. Derived from assembly - * code written by John Carr. - */ - - /* data section */ - asm(".data\n.align 2"); - asm(".globl _ulmul$$ \n _ulmul$$:"); - asm(".globl _lmul$$ \n _lmul$$: .long lmul$$"); - /* text section */ - asm(".text \n .align 1"); - asm(".globl lmul$$ \n lmul$$:"); - asm(".globl ulmul$$ \n ulmul$$:"); - asm(".globl _.lmul$$ \n _.lmul$$:"); - asm(".globl _.ulmul$$ \n _.ulmul$$:"); - asm(" s r0,r0 \n mts r10,r2"); /* set up multiply, and go: */ - asm(" m r0,r3 \n m r0,r3 \n m r0,r3 \n m r0,r3"); /* execute 4 steps */ - asm(" m r0,r3 \n m r0,r3 \n m r0,r3 \n m r0,r3"); /* execute 4 steps */ - asm(" m r0,r3 \n m r0,r3 \n m r0,r3 \n m r0,r3"); /* execute 4 steps */ - asm(" m r0,r3 \n m r0,r3 \n m r0,r3 \n m r0,r3"); /* execute 4 steps */ - asm(" brx r15 \n mfs r10,r2"); /* return result */ - asm(" .long 0xdf02df00"); /* for debugging */ - -#ifdef USE_LIBC_STRLEN - } -#else - /* Note- do not use this version of strlen when compiling with -g; -g */ - /* causes extra no-ops to be inserted between instructions, which cause */ - /* the delayed branch instructions to fail. */ + memcpy((char *)paddress, ptr, 4); /* net address */ + ptr += 4; - /* - * Fast strlen, with optional trapping of null pointers. Also from - * John Carr. - */ - /* data */ - asm(".data\n.align 2"); - asm(".globl _strlen \n _strlen: .long _.strlen"); - /* text */ - asm(".text\n.align 1"); - asm(".globl _.strlen \n _.strlen:"); -#if 1 - asm(" ti 2,r2,0"); /* trap if r2 is NULL */ -#endif - asm(" ls r4,0(r2)"); - asm(" mr r0,r2"); - asm(" nilz r3,r2,3"); - asm(" beqx 0f"); - asm(" nilo r2,r2,0xfffc"); /* clear low bits */ - asm(" sis r3,2"); /* test appropriate bytes of 1st word */ - asm(" jeq 2f"); /* s & 3 == 2 */ - asm(" jm 1f"); /* s & 3 == 1 */ - asm(" j 3f"); /* s & 3 == 3 */ - asm("0: srpi16 r4,8"); /* byte 0 */ - asm(" jeq 4f"); - asm("1: niuz r5,r4,0xff"); /* byte 1 */ - asm(" jeq 5f"); - asm("2: nilz r5,r4,0xff00"); /* byte 2 */ - asm(" jeq 6f"); - asm("3: sli16 r4,8"); /* byte 3 */ - asm(" jeq 7f"); - asm(" ls r4,4(r2)"); /* get next word and continue */ - asm(" bx 0b"); - asm(" inc r2,4"); - asm("4: brx r15"); /* byte 0 is zero */ - asm(" s r2,r0"); - asm("5: s r2,r0"); /* byte 1 is zero */ - asm(" brx r15"); - asm(" inc r2,1"); - asm("6: s r2,r0"); /* byte 2 is zero */ - asm(" brx r15"); - asm(" inc r2,2"); - asm("7: s r2,r0"); /* byte 3 is zero */ - asm(" brx r15"); - asm(" inc r2,3"); - asm(" .long 0xdf02df00"); /* trace table */ + memcpy((char *)session, ptr, 8); /* session key */ + ptr+= 8; + + /* get lifetime, being certain we don't get negative lifetimes */ + uptr = (unsigned char *) ptr++; + *life = (int) *uptr; + + memcpy((char *) time_sec, ptr, 4); /* issue time */ + ptr += 4; + if (tkt_swap_bytes) + swap_u_long(*time_sec); + + strcpy(sname,ptr); /* service name */ + ptr += 1 + strlen(sname); + + strcpy(sinstance,ptr); /* instance */ + ptr += 1 + strlen(sinstance); + + return(KSUCCESS); } -#endif /* USE_LIBC_STRLEN */ -#endif /* __GNUC__ || __HIGHC__ */ -#endif /* ibm032 */ +#endif /* ZEPHYR_USES_KERBEROS */ + |