/* * krb5_rcache_externalize() - Externalize the krb5_rcache. */ static krb5_error_code krb5_rcache_externalize(krb5_context kcontext, krb5_pointer arg, krb5_octet **buffer, size_t *lenremain) { krb5_error_code kret; krb5_rcache rcache; size_t required; krb5_octet *bp; size_t remain; char *rcname; size_t namelen; char *fnamep; required = 0; bp = *buffer; remain = *lenremain; kret = EINVAL; if ((rcache = (krb5_rcache) arg) != NULL) { kret = ENOMEM; if (!krb5_rcache_size(kcontext, arg, &required) && (required <= remain)) { /* Our identifier */ (void) krb5_ser_pack_int32(KV5M_RCACHE, &bp, &remain); /* Calculate the length of the name */ namelen = (rcache->ops && rcache->ops->type) ? strlen(rcache->ops->type)+1 : 0; fnamep = krb5_rc_get_name(kcontext, rcache); namelen += (strlen(fnamep)+1); if ((rcname = (char *) malloc(namelen))) { /* Format the rcache name. */ if (rcache->ops && rcache->ops->type) sprintf(rcname, "%s:%s", rcache->ops->type, fnamep); else strcpy(rcname, fnamep); /* Put the length of the file name */ (void) krb5_ser_pack_int32((krb5_int32) strlen(rcname), &bp, &remain); /* Put the name */ (void) krb5_ser_pack_bytes((krb5_octet *) rcname, strlen(rcname), &bp, &remain); /* Put the trailer */ (void) krb5_ser_pack_int32(KV5M_RCACHE, &bp, &remain); kret = 0; *buffer = bp; *lenremain = remain; free(rcname); } } } return(kret); }
/* * krb5_rcache_externalize() - Externalize the krb5_rcache. */ static krb5_error_code krb5_rcache_externalize(krb5_context kcontext, krb5_pointer arg, krb5_octet **buffer, size_t *lenremain) { krb5_error_code kret; krb5_rcache rcache; size_t required; krb5_octet *bp; size_t remain; char *rcname; char *fnamep; required = 0; bp = *buffer; remain = *lenremain; kret = EINVAL; if ((rcache = (krb5_rcache) arg)) { kret = ENOMEM; if (!krb5_rcache_size(kcontext, arg, &required) && (required <= remain)) { /* Our identifier */ (void) krb5_ser_pack_int32(KV5M_RCACHE, &bp, &remain); fnamep = krb5_rc_get_name(kcontext, rcache); if (rcache->ops->type) { if (asprintf(&rcname, "%s:%s", rcache->ops->type, fnamep) < 0) rcname = NULL; } else rcname = strdup(fnamep); if (rcname) { /* Put the length of the file name */ (void) krb5_ser_pack_int32((krb5_int32) strlen(rcname), &bp, &remain); /* Put the name */ (void) krb5_ser_pack_bytes((krb5_octet *) rcname, strlen(rcname), &bp, &remain); /* Put the trailer */ (void) krb5_ser_pack_int32(KV5M_RCACHE, &bp, &remain); kret = 0; *buffer = bp; *lenremain = remain; free(rcname); } } } return(kret); }