void KRB5_CALLCONV profile_abandon(profile_t profile) { prf_file_t p, next; errcode_t err; if (!profile || profile->magic != PROF_MAGIC_PROFILE) return; if (profile->vt) { if (profile->vt->cleanup) profile->vt->cleanup(profile->cbdata); if (profile->lib_handle) { /* Decrement the refcount on the handle and maybe free it. */ err = k5_mutex_lock(&profile->lib_handle->lock); if (!err && --profile->lib_handle->refcount == 0) { krb5int_close_plugin(profile->lib_handle->plugin_handle); k5_mutex_unlock(&profile->lib_handle->lock); k5_mutex_destroy(&profile->lib_handle->lock); free(profile->lib_handle); } else if (!err) k5_mutex_unlock(&profile->lib_handle->lock); } free(profile->vt); } else { for (p = profile->first_file; p; p = next) { next = p->next; profile_free_file(p); } } profile->magic = 0; free(profile); }
long profile_open_file(const char * filespec, prf_file_t *ret_prof) { prf_file_t prf; long retval; char *home_env = 0; unsigned int len; char *expanded_filename; prf = malloc(sizeof(struct _prf_file_t)); if (!prf) return ENOMEM; memset(prf, 0, sizeof(struct _prf_file_t)); prf->magic = PROF_MAGIC_FILE; len = strlen(filespec)+1; if (filespec[0] == '~' && filespec[1] == '/') { home_env = getenv("HOME"); if (home_env) len += strlen(home_env); } expanded_filename = malloc(len); if (expanded_filename == 0) { profile_free_file(prf); return errno; } if (home_env) { strcpy(expanded_filename, home_env); strcat(expanded_filename, filespec+1); } else memcpy(expanded_filename, filespec, len); prf->filespec = expanded_filename; if (strcmp(prf->filespec, default_filename) != 0) { retval = profile_update_file(prf); if (retval) { profile_free_file(prf); return retval; } } *ret_prof = prf; return 0; }
errcode_t profile_close_file(prf_file_t prf) { errcode_t retval; retval = profile_flush_file(prf); if (retval) return retval; profile_free_file(prf); return 0; }
void KRB5_CALLCONV profile_abandon(profile_t profile) { prf_file_t p, next; if (!profile || profile->magic != PROF_MAGIC_PROFILE) return; for (p = profile->first_file; p; p = next) { next = p->next; profile_free_file(p); } profile->magic = 0; free(profile); }
void profile_release(profile_t profile) { prf_file_t p, next; if (!profile || profile->magic != PROF_MAGIC_PROFILE) return; for (p = profile->first_file; p; p = next) { next = p->next; profile_free_file(p); } profile->magic = 0; free(profile); }