int handle_mapping_hash_add(hash_table_t *p_hash, uint64_t object_id, unsigned int handle_hash, const void *data, uint32_t datalen) { int rc; struct gsh_buffdesc buffkey; struct gsh_buffdesc buffval; digest_pool_entry_t *digest; handle_pool_entry_t *handle; if (datalen >= sizeof(handle->fh_data)) return HANDLEMAP_INVALID_PARAM; digest = digest_alloc(); if (!digest) return HANDLEMAP_SYSTEM_ERROR; handle = handle_alloc(); if (!handle) { digest_free(digest); return HANDLEMAP_SYSTEM_ERROR; } digest->nfs23_digest.object_id = object_id; digest->nfs23_digest.handle_hash = handle_hash; memset(handle->fh_data, 0, sizeof(handle->fh_data)); memcpy(handle->fh_data, data, datalen); handle->fh_len = datalen; buffkey.addr = (caddr_t) digest; buffkey.len = sizeof(digest_pool_entry_t); buffval.addr = (caddr_t) handle; buffval.len = sizeof(handle_pool_entry_t); rc = hashtable_test_and_set(handle_map_hash, &buffkey, &buffval, HASHTABLE_SET_HOW_SET_NO_OVERWRITE); if (rc != HASHTABLE_SUCCESS) { digest_free(digest); handle_free(handle); if (rc != HASHTABLE_ERROR_KEY_ALREADY_EXISTS) { LogCrit(COMPONENT_FSAL, "ERROR %d inserting entry to handle mapping hash table", rc); return HANDLEMAP_HASHTABLE_ERROR; } else { return HANDLEMAP_EXISTS; } } return HANDLEMAP_SUCCESS; }
static int do_hash(char *algo, int argc, char *argv[]) { struct digest *d; unsigned char *key = NULL; size_t keylen = 0; int opt, ret; while ((opt = getopt(argc, argv, "h:")) > 0) { switch(opt) { case 'h': key = optarg; keylen = strlen(key); break; } } if (key) { char *tmp = asprintf("hmac(%s)", algo); d = digest_alloc(tmp); free(tmp); BUG_ON(!d); ret = digest_set_key(d, key, keylen); if (ret) { perror("set_key"); return ret; } } else { d = digest_alloc(algo); BUG_ON(!d); } argc -= optind; argv += optind; return __do_digest(d, NULL, argc, argv); }