#include <stdlib.h>
#include <stdio.h>
#include <CredentialsCache.h>
#include "credentials.h"
#include "msg.h"
#include "msg_headers.h"
cc_int32
cc_int_credentials_new( cc_credentials_t *pcredentials, cc_uint32 version,
cc_handle ctx, cc_handle ccache, cc_handle handle,
char * data, cc_uint32 len )
{
cc_int_credentials_t credentials;
cc_int32 code;
if ( pcredentials == NULL )
return ccErrBadParam;
credentials = (cc_int_credentials_t)malloc(sizeof(cc_int_credentials_d));
if ( credentials == NULL )
return ccErrNoMem;
credentials->data = (cc_credentials_union *)malloc(sizeof(cc_credentials_union));
if ( credentials->data == NULL ) {
free(credentials);
return ccErrNoMem;
}
credentials->functions = (cc_credentials_f *)malloc(sizeof(cc_credentials_f));
if ( credentials->functions == NULL ) {
free(credentials->data);
free(credentials);
return ccErrNoMem;
}
credentials->functions->release = cc_int_credentials_release;
credentials->functions->compare = cc_int_credentials_compare;
credentials->magic = CC_CREDS_MAGIC;
credentials->ctx = ctx;
credentials->ccache = ccache;
credentials->handle = handle;
switch ( version ) {
case cc_credentials_v4:
code = cci_cred_v4_unmarshall(data, len, credentials->data);
break;
case cc_credentials_v5:
code = cci_cred_v5_unmarshall(data, len, credentials->data);
break;
default:
free(credentials);
return ccErrBadCredentialsVersion;
}
*pcredentials = (cc_credentials_t)credentials;
return ccNoError;
}
cc_int32
cc_int_credentials_release( cc_credentials_t creds )
{
cc_int_credentials_t int_creds;
unsigned short i;
if ( creds == NULL )
return ccErrBadParam;
int_creds = (cc_int_credentials_t)creds;
if ( int_creds->magic != CC_CREDS_MAGIC )
return ccErrInvalidCredentials;
switch (int_creds->data->version) {
case cc_credentials_v4:
free(int_creds->data->credentials.credentials_v4);
break;
case cc_credentials_v5:
if ( int_creds->data->credentials.credentials_v5->client )
free(int_creds->data->credentials.credentials_v5->client);
if ( int_creds->data->credentials.credentials_v5->server )
free(int_creds->data->credentials.credentials_v5->server );
if ( int_creds->data->credentials.credentials_v5->keyblock.data )
free(int_creds->data->credentials.credentials_v5->keyblock.data);
if ( int_creds->data->credentials.credentials_v5->ticket.data )
free(int_creds->data->credentials.credentials_v5->ticket.data);
if ( int_creds->data->credentials.credentials_v5->second_ticket.data )
free(int_creds->data->credentials.credentials_v5->second_ticket.data);
if ( int_creds->data->credentials.credentials_v5->addresses ) {
for ( i=0; int_creds->data->credentials.credentials_v5->addresses[i]; i++) {
if (int_creds->data->credentials.credentials_v5->addresses[i]->data)
free(int_creds->data->credentials.credentials_v5->addresses[i]->data);
}
free(int_creds->data->credentials.credentials_v5->addresses);
}
if ( int_creds->data->credentials.credentials_v5->authdata ) {
for ( i=0; int_creds->data->credentials.credentials_v5->authdata[i]; i++) {
if ( int_creds->data->credentials.credentials_v5->authdata[i]->data )
free(int_creds->data->credentials.credentials_v5->authdata[i]->data);
}
free(int_creds->data->credentials.credentials_v5->authdata);
}
break;
default:
return ccErrBadCredentialsVersion;
}
free(int_creds->functions);
free(int_creds->data);
free(int_creds);
return ccNoError;
}
cc_int32
cc_int_credentials_compare( cc_credentials_t credentials,
cc_credentials_t compare_to,
cc_uint32* equal )
{
cc_int_credentials_t int_credentials;
cc_int_credentials_t int_compare_to;
if ( credentials == NULL || compare_to == NULL || equal == NULL )
return ccErrBadParam;
if ( int_credentials->magic != CC_CREDS_MAGIC ||
int_compare_to->magic != CC_CREDS_MAGIC )
return ccErrInvalidCredentials;
int_credentials = (cc_int_credentials_t)credentials;
int_compare_to = (cc_int_credentials_t)compare_to;
*equal = (int_credentials->handle == int_compare_to->handle);
return ccNoError;
}