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