Пример #1
0
/*
 * 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);
}
Пример #2
0
/*
 * 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);
}