#include "krb5_locl.h" /* XXX shouldn't be here */ void krb5_free_ccache(krb5_context context, krb5_ccache val) { free(((krb5_fcache*)(val->data.data))->filename); krb5_data_free (&val->data); free(val); } krb5_error_code krb5_cc_resolve(krb5_context context, const char *residual, krb5_ccache *id) { krb5_ccache p; krb5_fcache *f; if(strncmp(residual, "FILE:", 5)){ return -1; } p = ALLOC(1, krb5_ccache_data); if(!p) return ENOMEM; f = ALLOC(1, krb5_fcache); if(!f){ free(p); return ENOMEM; } f->filename = strdup(residual + 5); if(!f->filename){ free(f); free(p); return ENOMEM; } p->data.data = f; p->data.length = sizeof(*f); p->type = 1; *id = p; return 0; } #if 0 krb5_error_code krb5_cc_gen_new(krb5_context context, krb5_cc_ops *ops, krb5_ccache *id) { } krb5_error_code krb5_cc_register(krb5_context context, krb5_cc_ops *ops, krb5_boolean override) { } #endif char* krb5_cc_get_name(krb5_context context, krb5_ccache id) { return ((krb5_fcache*)(id->data.data))->filename; } char* krb5_cc_default_name(krb5_context context) { static char name[1024]; char *p; p = getenv("KRB5CCNAME"); if(p) strcpy(name, p); else sprintf(name, "FILE:/tmp/krb5cc_%d", getuid()); return name; } krb5_error_code krb5_cc_default(krb5_context context, krb5_ccache *id) { return krb5_cc_resolve(context, krb5_cc_default_name(context), id); } static krb5_error_code store_int32(int fd, int32_t value) { int ret; value = htonl(value); ret = write(fd, &value, sizeof(value)); if (ret != sizeof(value)) return (ret<0)?errno:-1; return 0; } static krb5_error_code ret_int32(int fd, int32_t *value) { int32_t v; int ret; ret = read(fd, &v, sizeof(v)); if(ret != sizeof(v)) return (ret<0)?errno:-1; /* XXX */ *value = ntohl(v); return 0; } static krb5_error_code store_int16(int fd, int16_t value) { int ret; value = htons(value); ret = write(fd, &value, sizeof(value)); if (ret != sizeof(value)) return (ret<0)?errno:-1; return 0; } static krb5_error_code ret_int16(int fd, int16_t *value) { int16_t v; int ret; ret = read(fd, &v, sizeof(v)); if(ret != sizeof(v)) return (ret<0)?errno:-1; /* XXX */ *value = ntohs(v); return 0; } static krb5_error_code store_int8(int fd, int8_t value) { int ret; ret = write(fd, &value, sizeof(value)); if (ret != sizeof(value)) return (ret<0)?errno:-1; return 0; } static krb5_error_code ret_int8(int fd, int8_t *value) { int ret; ret = read (fd, value, sizeof(*value)); if (ret != sizeof(*value)) return (ret<0)?errno:-1; return 0; } static krb5_error_code store_data(int fd, krb5_data data) { int ret; ret = store_int32(fd, data.length); if(ret < 0) return ret; return write(fd, data.data, data.length); } static krb5_error_code ret_data(int fd, krb5_data *data) { int ret; int size; ret = ret_int32(fd, &size); data->length = size; data->data = malloc(size); ret = read(fd, data->data, size); if(ret != size) return (ret < 0)? errno : -1; /* XXX */ return 0; } static krb5_error_code store_principal(int fd, krb5_principal p) { int i; store_int32(fd, p->type); store_int32(fd, p->ncomp); store_data(fd, p->realm); for(i = 0; i < p->ncomp; i++) store_data(fd, p->comp[i]); return 0; } static krb5_error_code ret_principal(int fd, krb5_principal *princ) { int i; krb5_principal p; p = ALLOC(1, krb5_principal_data); if(ret_int32(fd, &p->type)) return -1; ret_int32(fd, &p->ncomp); ret_data(fd, &p->realm); p->comp = ALLOC(p->ncomp, krb5_data); for(i = 0; i < p->ncomp; i++) ret_data(fd, &p->comp[i]); *princ = p; return 0; } static krb5_error_code store_keyblock(int fd, krb5_keyblock p) { store_int32(fd, p.keytype); store_data(fd, p.contents); return 0; } static krb5_error_code ret_keyblock(int fd, krb5_keyblock *p) { ret_int32(fd, (int32_t*)&p->keytype); ret_data(fd, &p->contents); return 0; } static krb5_error_code store_times(int fd, krb5_times times) { store_int32(fd, times.authtime); store_int32(fd, times.starttime); store_int32(fd, times.endtime); store_int32(fd, times.renew_till); return 0; } static krb5_error_code ret_times(int fd, krb5_times *times) { ret_int32(fd, ×->authtime); ret_int32(fd, ×->starttime); ret_int32(fd, ×->endtime); ret_int32(fd, ×->renew_till); return 0; } static krb5_error_code store_address(int fd, krb5_address p) { store_int32(fd, p.type); store_data(fd, p.address); return 0; } static krb5_error_code ret_address(int fd, krb5_address *adr) { ret_int32(fd, (int32_t*)&adr->type); ret_data(fd, &adr->address); return 0; } static krb5_error_code store_addrs(int fd, krb5_addresses p) { int i; store_int32(fd, p.number); for(i = 0; i