Some cleanup.

git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@2869 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
Johan Danielsson
1997-08-10 03:13:08 +00:00
parent ca08900b50
commit 620586ab0b

View File

@@ -42,8 +42,11 @@ RCSID("$Id$");
/* Public principal handling functions */ /* Public principal handling functions */
#define num_components(P) ((P)->name.name_string.len) #define princ_num_comp(P) ((P)->name.name_string.len)
#define princ_type(P) ((P)->name.name_type) #define princ_type(P) ((P)->name.name_type)
#define princ_comp(P) ((P)->name.name_string.val)
#define princ_ncomp(P, N) ((P)->name.name_string.val[(N)])
#define princ_realm(P) ((P)->realm)
void void
krb5_free_principal(krb5_context context, krb5_free_principal(krb5_context context,
@@ -139,39 +142,53 @@ krb5_parse_name(krb5_context context,
*principal = malloc(sizeof(**principal)); *principal = malloc(sizeof(**principal));
(*principal)->name.name_type = KRB5_NT_PRINCIPAL; (*principal)->name.name_type = KRB5_NT_PRINCIPAL;
(*principal)->name.name_string.val = comp; (*principal)->name.name_string.val = comp;
num_components(*principal) = n; princ_num_comp(*principal) = n;
(*principal)->realm = realm; (*principal)->realm = realm;
free(s); free(s);
return 0; return 0;
} }
static void quote_string(char *s, int len, char **out) static size_t
quote_string(char *s, char **out)
{ {
char *q; size_t len;
char *p = *out; char *p;
int c=0; char *tmp;
len = strlen(s); char c = 0;
for(q = s; q < s + len; q++){ tmp = *out;
if(*q == '\n') if(tmp)
len = strlen(tmp);
else
len = 0;
for(p = s; *p; p++){
if(*p == '\n')
c = 'n'; c = 'n';
else if(*q == '\t') else if(*p == '\t')
c = 't'; c = 't';
else if(*q == '\b') else if(*p == '\b')
c = 'b'; c = 'b';
else if(*q == '\0') else if(*p == '\0')
c = '0'; c = '0';
else if(*q == '/') else if(*p == '/')
c='/'; c='/';
else if(*q == '@') else if(*p == '@')
c = '@'; c = '@';
if(c){ if(c){
*p++ = '\\'; tmp = realloc(tmp, len + 2);
*p++ = c; tmp[len] = '\\';
tmp[len + 1] = c;
len += 2;
c = 0; c = 0;
}else }else{
*p++ = *q; tmp = realloc(tmp, len + 1);
tmp[len] = *p;
len++;
}
} }
*out = p; tmp = realloc(tmp, len + 1);
tmp[len] = 0;
*out = tmp;
return len;
} }
@@ -180,25 +197,23 @@ krb5_unparse_name(krb5_context context,
krb5_principal principal, krb5_principal principal,
char **name) char **name)
{ {
int size; size_t len;
char *p;
char *s; char *s;
int i; int i;
int ncomp = num_components(principal); int ncomp = princ_num_comp(principal);
size = 2 * strlen(principal->realm) + 1; s = NULL;
for (i = 0; i < ncomp; i++) for (i = 0; i < ncomp; i++){
size += 2 * strlen(principal->name.name_string.val[i]) + 1; if(i){
s = malloc(size); s = realloc(s, len + 1);
p = s; s[len] = '/';
for(i = 0; i < ncomp; i++){ s[len + 1] = 0;
if(i) *p++ = '/'; }
quote_string( len = quote_string(princ_ncomp(principal, i), &s);
principal->name.name_string.val[i], 0,
&p);
} }
*p++ = '@'; s = realloc(s, len + 1);
quote_string(principal->realm, 0, &p); s[len] = '@';
*p = 0; s[len + 1] = 0;
len = quote_string(princ_realm(principal), &s);
*name = s; *name = s;
return 0; return 0;
} }
@@ -219,7 +234,7 @@ krb5_realm*
krb5_princ_realm(krb5_context context, krb5_princ_realm(krb5_context context,
krb5_principal principal) krb5_principal principal)
{ {
return &principal->realm; return &princ_realm(principal);
} }
@@ -228,7 +243,7 @@ krb5_princ_set_realm(krb5_context context,
krb5_principal principal, krb5_principal principal,
krb5_realm *realm) krb5_realm *realm)
{ {
principal->realm = *realm; princ_realm(principal) = *realm;
} }
@@ -247,61 +262,45 @@ krb5_build_principal(krb5_context context,
return ret; return ret;
} }
krb5_error_code static krb5_error_code
krb5_principal_set_component(krb5_context context, krb5_principal p, append_component(krb5_context context, krb5_principal p,
int n, void *data, size_t len) general_string comp)
{ {
general_string *tmp = p->name.name_string.val; general_string *tmp;
if(num_components(p) <= n){ size_t len = princ_num_comp(p);
int s = n + 10; tmp = realloc(princ_comp(p), (len + 1) * sizeof(*tmp));
tmp = realloc(tmp, s * sizeof(*tmp)); if(tmp == NULL)
if(!tmp) return ENOMEM;
return ENOMEM; princ_comp(p) = tmp;
memset(tmp + num_components(p), 0, princ_ncomp(p, len) = strdup(comp);
(s - num_components(p)) * sizeof(*tmp)); princ_num_comp(p)++;
p->name.name_string.val = tmp;
num_components(p)= s;
}
if(p->name.name_string.val[n])
free(p->name.name_string.val[n]);
p->name.name_string.val[n] = malloc(len + 1);
strncpy(p->name.name_string.val[n], data, len);
p->name.name_string.val[n][len] = 0;
return 0; return 0;
} }
static void static void
va_ext_princ(krb5_context context, krb5_principal p, va_list ap) va_ext_princ(krb5_context context, krb5_principal p, va_list ap)
{ {
int n = 0;
while(1){ while(1){
char *s; char *s;
int len; int len;
len = va_arg(ap, int); len = va_arg(ap, int);
if(len == 0) if(len == 0)
break; break;
s = va_arg(ap, char*); s = va_arg(ap, char*);
krb5_principal_set_component(context, p, n, s, len); append_component(context, p, s);
n++;
} }
num_components(p) = n;
} }
static void static void
va_princ(krb5_context context, krb5_principal p, va_list ap) va_princ(krb5_context context, krb5_principal p, va_list ap)
{ {
int n = 0;
while(1){ while(1){
char *s; char *s;
int len;
s = va_arg(ap, char*); s = va_arg(ap, char*);
if(s == NULL) if(s == NULL)
break; break;
len = strlen(s); append_component(context, p, s);
krb5_principal_set_component(context, p, n, s, len);
n++;
} }
num_components(p) = n;
} }
@@ -321,7 +320,7 @@ build_principal(krb5_context context,
return ENOMEM; return ENOMEM;
princ_type(p) = KRB5_NT_PRINCIPAL; princ_type(p) = KRB5_NT_PRINCIPAL;
p->realm = strdup(realm); princ_realm(p) = strdup(realm);
if(p->realm == NULL){ if(p->realm == NULL){
free(p); free(p);
return ENOMEM; return ENOMEM;
@@ -365,7 +364,6 @@ krb5_build_principal_va(krb5_context context,
return build_principal(context, principal, rlen, realm, va_princ, ap); return build_principal(context, principal, rlen, realm, va_princ, ap);
} }
/* Not part of MIT K5 API */
krb5_error_code krb5_error_code
krb5_build_principal_va_ext(krb5_context context, krb5_build_principal_va_ext(krb5_context context,
krb5_principal *principal, krb5_principal *principal,
@@ -398,13 +396,10 @@ krb5_copy_principal(krb5_context context,
krb5_const_principal inprinc, krb5_const_principal inprinc,
krb5_principal *outprinc) krb5_principal *outprinc)
{ {
krb5_principal p; krb5_principal p = malloc(sizeof(*p));
int i;
p = calloc(1, sizeof(*p));
if (p == NULL) if (p == NULL)
return ENOMEM; return ENOMEM;
copy_PrincipalName(&inprinc->name, &p->name); copy_Principal(inprinc, p);
copy_Realm(&inprinc->realm, &p->realm);
*outprinc = p; *outprinc = p;
return 0; return 0;
} }
@@ -418,11 +413,10 @@ krb5_principal_compare(krb5_context context,
int i; int i;
if(!krb5_realm_compare(context, princ1, princ2)) if(!krb5_realm_compare(context, princ1, princ2))
return FALSE; return FALSE;
if(num_components(princ1) != num_components(princ2)) if(princ_num_comp(princ1) != princ_num_comp(princ2))
return FALSE; return FALSE;
for(i = 0; i < num_components(princ1); i++){ for(i = 0; i < princ_num_comp(princ1); i++){
if(strcmp(princ1->name.name_string.val[i], if(strcmp(princ_ncomp(princ1, i), princ_ncomp(princ2, i)) != 0)
princ2->name.name_string.val[i]) != 0)
return FALSE; return FALSE;
} }
return TRUE; return TRUE;
@@ -434,7 +428,7 @@ krb5_realm_compare(krb5_context context,
krb5_const_principal princ1, krb5_const_principal princ1,
krb5_const_principal princ2) krb5_const_principal princ2)
{ {
return strcmp(princ1->realm, princ2->realm) == 0; return strcmp(princ_realm(princ1), princ_realm(princ2)) == 0;
} }