Exemple #1
0
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;
}
Exemple #2
0
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);
}