示例#1
0
文件: ser_rc.c 项目: andreiw/polaris
/*
 * 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);
}
示例#2
0
文件: ser_rc.c 项目: Akasurde/krb5
/*
 * 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);
}