/**
 * @brief Read the configuration for the Cache inode layer
 *
 * @param[in]  config Configuration file handle
 * @param[out] param  Read parameters
 *
 * @retval CACHE_INODE_SUCCESS on success.
 * @retval CACHE_INODE_NOT_FOUND if stanza not present
 * @retval CACHE_INODE_INVALID_ARGUMENT otherwise
 */
cache_inode_status_t
cache_inode_read_conf_parameter(config_file_t config,
				cache_inode_parameter_t *param)
{
	int var_max;
	int var_index;
	int err;
	char *key_name;
	char *key_value;
	config_item_t block;

	/* Get the config BLOCK */
	block = config_FindItemByName(config, CONF_LABEL_CACHE_INODE);
	if (block == NULL) {
		LogDebug(COMPONENT_CONFIG,
			 "Cannot read item \"%s\" from configuration file",
			 CONF_LABEL_CACHE_INODE);
		return CACHE_INODE_NOT_FOUND;
	} else if (config_ItemType(block) != CONFIG_ITEM_BLOCK) {
		/* Expected to be a block */
		LogCrit(COMPONENT_CONFIG,
			"Item \"%s\" is expected to be a block",
			CONF_LABEL_CACHE_INODE);
		return CACHE_INODE_INVALID_ARGUMENT;
	}

	var_max = config_GetNbItems(block);

	for (var_index = 0; var_index < var_max; var_index++) {
		config_item_t item;

		item = config_GetItemByIndex(block, var_index);

		/* Get key's name */
		err = config_GetKeyValue(item, &key_name, &key_value);
		if (err != 0) {
			LogCrit(COMPONENT_CONFIG,
				"Error reading key[%d] from section \"%s\" of "
				"configuration file.",
				var_index, CONF_LABEL_CACHE_INODE);
			return CACHE_INODE_INVALID_ARGUMENT;
		}

		else if (!strcasecmp(key_name, "NParts")) {
			param->nparts = atoi(key_value);
		} else if (!strcasecmp(key_name, "Attr_Expiration_Time")) {
			err =
			    parse_cache_expire(&param->expire_type_attr,
					       &param->grace_period_attr,
					       key_value);
			if (err != CACHE_INODE_SUCCESS)
				return err;
		} else
		    if (!strcasecmp
			(key_name, "Use_Getattr_Directory_Invalidation")) {
			param->getattr_dir_invalidation =
			    str_to_bool(key_value);
		} else if (!strcasecmp(key_name, "Entries_HWMark")) {
			param->entries_hwmark = atoi(key_value);
		} else if (!strcasecmp(key_name, "LRU_Run_Interval")) {
			param->lru_run_interval = atoi(key_value);
		} else if (!strcasecmp(key_name, "Cache_FDs")) {
			param->use_fd_cache = str_to_bool(key_value);
		} else if (!strcasecmp(key_name, "FD_Limit_Percent")) {
			param->fd_limit_percent = atoi(key_value);
		} else if (!strcasecmp(key_name, "FD_HWMark_Percent")) {
			param->fd_hwmark_percent = atoi(key_value);
		} else if (!strcasecmp(key_name, "FD_LWMark_Percent")) {
			param->fd_lwmark_percent = atoi(key_value);
		} else if (!strcasecmp(key_name, "Reaper_Work")) {
			param->reaper_work = atoi(key_value);
		} else if (!strcasecmp(key_name, "Biggest_Window")) {
			param->biggest_window = atoi(key_value);
		} else if (!strcasecmp(key_name, "Required_Progress")) {
			param->required_progress = atoi(key_value);
		} else if (!strcasecmp(key_name, "Futility_Count")) {
			param->futility_count = atoi(key_value);
		} else if (!strcasecmp(key_name, "DebugLevel")
			   || !strcasecmp(key_name, "LogFile")) {
			LogWarn(COMPONENT_CONFIG,
				"Deprecated %s option %s=\'%s\'",
				CONF_LABEL_CACHE_INODE, key_name, key_value);
		} else {
			LogCrit(COMPONENT_CONFIG,
				"Unknown or unsettable key: %s (item %s)",
				key_name, CONF_LABEL_CACHE_INODE);
			return CACHE_INODE_INVALID_ARGUMENT;
		}
	}

	return CACHE_INODE_SUCCESS;
}
/**
 * @brief Read the configuration for the Cache inode layer
 *
 * @param[in]  config Configuration file handle
 * @param[out] param  Read parameters
 *
 * @retval CACHE_INODE_SUCCESS on success.
 * @retval CACHE_INODE_NOT_FOUND if stanza not present
 * @retval CACHE_INODE_INVALID_ARGUMENT otherwise
 */
cache_inode_status_t
cache_inode_read_conf_parameter(config_file_t config,
                                cache_inode_parameter_t *param)
{
  int var_max;
  int var_index;
  int err;
  char *key_name;
  char *key_value;
  config_item_t block;

  int DebugLevel = -1;
  char *LogFile = NULL;

  /* Is the config tree initialized ? */
  if(config == NULL || param == NULL)
    return CACHE_INODE_INVALID_ARGUMENT;

  /* Get the config BLOCK */
  if((block = config_FindItemByName(config,
                                    CONF_LABEL_CACHE_INODE)) == NULL)
    {
      LogDebug(COMPONENT_CONFIG,
               "Cannot read item \"%s\" from configuration file",
               CONF_LABEL_CACHE_INODE);
      return CACHE_INODE_NOT_FOUND;
    }
  else if(config_ItemType(block) != CONFIG_ITEM_BLOCK)
    {
      /* Expected to be a block */
      LogCrit(COMPONENT_CONFIG,
              "Item \"%s\" is expected to be a block",
              CONF_LABEL_CACHE_INODE);
      return CACHE_INODE_INVALID_ARGUMENT;
    }

  var_max = config_GetNbItems(block);

  for(var_index = 0; var_index < var_max; var_index++)
    {
      config_item_t item;

      item = config_GetItemByIndex(block, var_index);

      /* Get key's name */
      if((err = config_GetKeyValue(item, &key_name, &key_value)) != 0)
        {
          LogCrit(COMPONENT_CONFIG,
                  "Error reading key[%d] from section \"%s\" of configuration file.",
                  var_index, CONF_LABEL_CACHE_INODE);
          return CACHE_INODE_INVALID_ARGUMENT;
        }

      else if(!strcasecmp(key_name, "Attr_Expiration_Time"))
        {
          err = parse_cache_expire(&param->expire_type_attr,
                                   &param->grace_period_attr,
                                   key_value);
          if(err != CACHE_INODE_SUCCESS)
            return err;
        }
      else if(!strcasecmp(key_name, "Symlink_Expiration_Time"))
        {
          err = parse_cache_expire(&param->expire_type_link,
                                   &param->grace_period_link,
                                   key_value);
          if(err != CACHE_INODE_SUCCESS)
            return err;
        }
      else if(!strcasecmp(key_name, "Directory_Expiration_Time"))
        {
          err = parse_cache_expire(&param->expire_type_dirent,
                                   &param->grace_period_dirent,
                                   key_value);
          if(err != CACHE_INODE_SUCCESS)
            return err;
        }
      else if(!strcasecmp(key_name, "Use_Getattr_Directory_Invalidation"))
        {
          param->getattr_dir_invalidation = StrToBoolean(key_value);
        }
      else if(!strcasecmp(key_name, "Use_Test_Access"))
        {
          param->use_test_access = atoi(key_value);
        }
      else if(!strcasecmp( key_name, "Use_FSAL_Hash" ) )
        {
          param->use_fsal_hash = StrToBoolean(key_value);
        }
      else if(!strcasecmp(key_name, "DebugLevel"))
        {
          DebugLevel = ReturnLevelAscii(key_value);

          if(DebugLevel == -1)
            {
              LogDebug(COMPONENT_CACHE_INODE,
                       "cache_inode_read_conf: ERROR: Invalid debug level name: \"%s\".",
                       key_value);
              return CACHE_INODE_INVALID_ARGUMENT;
            }
        }
      else if(!strcasecmp(key_name, "LogFile"))
        {

          LogFile = key_value;

        }
      else
        {
          LogCrit(COMPONENT_CONFIG,
                  "Unknown or unsettable key: %s (item %s)",
                  key_name, CONF_LABEL_CACHE_INODE);
          return CACHE_INODE_INVALID_ARGUMENT;
        }
    }

  /* init logging */
  if(LogFile)
    SetComponentLogFile(COMPONENT_CACHE_INODE, LogFile);

  if(DebugLevel > -1)
    SetComponentLogLevel(COMPONENT_CACHE_INODE, DebugLevel);

  return CACHE_INODE_SUCCESS;
} /* cache_inode_read_conf_parameter */