static int32 ini_find_var(INI_FILE *fp, int32 modu, int8 * puc_var, int8 *puc_value)
{
	int32 ret;
	int8 auc_tmp[MAX_READ_LINE_NUM + 1] = {0};
    size_t search_var_len;

	/* find the modu of var, such as [HOST_WIFI_NORMAL] of wifi moduler*/
    ret = ini_find_modu(fp, modu, puc_var, puc_value);
	if (INI_FAILED == ret)
	{
		return INI_FAILED;
	}

	/* find the var in modu, such as [HOST_WIFI_NORMAL] of wifi moduler*/
	while(1)
	{
        ret = ini_readline_func(fp, auc_tmp);
        if (INI_FAILED == ret)
        {
            INI_ERROR("have end of .ini file!!!");
            return INI_FAILED;
        }

		if ('[' == auc_tmp[0])
		{
			INI_ERROR("not find %s!!!, check if var in correct mode", puc_var);
			return INI_FAILED;
		}

        search_var_len = strlen(puc_var);
        ret = ini_check_str(fp, auc_tmp, puc_var);
        if (INI_SUCC == ret)
        {
            //INI_DEBUG("have found %s", puc_var);
            /* note coverity check !!!*/
            strcpy(puc_value, &auc_tmp[search_var_len+1]);
            break;
        }
        else
        {
            continue;
        }
	}
	return INI_SUCC;
}
static int32 ini_find_modu(INI_FILE *fp, int32 modu, int8 * puc_var, int8 *puc_value)
{
	int8 auc_tmp[MAX_READ_LINE_NUM];
	int8 auc_modu[INI_STR_MODU_LEN];
	int32 l_mode_value;
	int32 ret;

	/* check the mode of moduler */
	if (INI_FAILED == ini_check_value(puc_value))
	{
		return INI_FAILED;
	}

	/* INI_MODU_PLAT has no mode*/
	if (INI_MODU_PLAT != modu)
	{
		l_mode_value = puc_value[0] - '0';
		if (10 < l_mode_value || 0 > l_mode_value)
		{
			INI_ERROR("not support value %s", puc_value);
			return INI_FAILED;
		}
	}

	switch (modu)
	{
		case INI_MODU_WIFI:
			/*find mode var*/
			if (INI_MODE_NORMAL	== l_mode_value)
			{
				strncpy(auc_modu, INI_STR_WIFI_NORMAL, INI_STR_MODU_LEN);
			}
			else if (INI_MODE_PERFORMANCE == l_mode_value)
			{
				strncpy(auc_modu, INI_STR_WIFI_PERFORMANCE, INI_STR_MODU_LEN);
			}
			else if (INI_MODE_CERTIFY == l_mode_value)
			{
				strncpy(auc_modu, INI_STR_WIFI_CERTIFY, INI_STR_MODU_LEN);
			}
            else if (INI_MODE_CERTIFY_CE == l_mode_value)
			{
				strncpy(auc_modu, INI_STR_WIFI_CERTIFY_CE, INI_STR_MODU_LEN);
			}

			else
			{
				INI_ERROR("not support mode!!!");
				return INI_FAILED;
			}
			break;
		case INI_MODU_GNSS:
			if (INI_MODE_GPSGLONASS	== l_mode_value)
			{
				strncpy(auc_modu, INI_STR_GNSS_GPSGLONASS, INI_STR_MODU_LEN);
			}
			else if (INI_MODE_BDGPS == l_mode_value)
			{
				strncpy(auc_modu, INI_STR_GNSS_BDGPS, INI_STR_MODU_LEN);
			}
			else
			{
				INI_ERROR("not support mode!!!");
				return INI_FAILED;
			}
			break;
		case INI_MODU_BT:
			strncpy(auc_modu, INI_STR_BT_NORMAL, INI_STR_MODU_LEN);
			break;
		case INI_MODU_FM:
			strncpy(auc_modu, INI_STR_FM_NORMAL, INI_STR_MODU_LEN);
			break;
		case INI_MODU_WIFI_PLAT:
			strncpy(auc_modu, INI_STR_WIFI_PLAT_NORMAL, INI_STR_MODU_LEN);
			break;
		case INI_MODU_BFG_PLAT:
			strncpy(auc_modu, INI_STR_BFG_PLAT_NORMAL, INI_STR_MODU_LEN);
			break;
		case INI_MODU_PLAT:
			strncpy(auc_modu, INI_STR_PLAT, INI_STR_MODU_LEN);
			break;
		case INI_MODU_HOST_VERSION:
		    strncpy(auc_modu, INT_STR_HOST_VERSION, INI_STR_MODU_LEN);
			break;
		case INI_MODU_WIFI_MAC:
		    strncpy(auc_modu, INI_STR_WIFI_MAC, INI_STR_MODU_LEN);
			break;
		case INI_MODU_COEXIST:
		    strncpy(auc_modu, INI_STR_COEXIST, INI_STR_MODU_LEN);
			break;
		default :
			INI_ERROR("not suport modu type!!!");
			break;
	}

	/* find the value of mode var, such as ini_wifi_mode 
	 * every mode except PLAT mode has only one mode var */
	while(1)
	{
        ret = ini_readline_func(fp, auc_tmp);
        if (INI_FAILED == ret)
        {
            INI_ERROR("have end of .ini file!!!");
            return INI_FAILED;
        }

		if (NULL != strstr(auc_tmp, INI_STR_DEVICE_BFG_PLAT))
		{
			INI_ERROR("not find %s!!!", auc_modu);
			return INI_FAILED;
		}

        ret = ini_check_str(fp, auc_tmp, auc_modu);
        if (INI_SUCC == ret)
        {
			INI_DEBUG("have found %s", auc_modu);
			break;
        }
        else
        {
			continue;
        }
	}

	return INI_SUCC;
}
static int32 ini_find_mode(INI_FILE *fp, int32 modu, int8 *puc_var, int8 *puc_value, uint32 size)
{
    int32 ret;
	int8 auc_tmp[MAX_READ_LINE_NUM];
	int8 auc_mode_var[INI_STR_MODU_LEN];
	int8 *puc_val = NULL;

	switch (modu)
	{
		case INI_MODU_WIFI:
			strncpy(auc_mode_var, INI_MODE_VAR_WIFI, INI_STR_MODU_LEN);
			break;
		case INI_MODU_GNSS:
			strncpy(auc_mode_var, INI_MODE_VAR_GNSS, INI_STR_MODU_LEN);
			break;
		case INI_MODU_BT:
			strncpy(auc_mode_var, INI_MODE_VAR_BT, INI_STR_MODU_LEN);
			break;
		case INI_MODU_FM:
			strncpy(auc_mode_var, INI_MODE_VAR_FM, INI_STR_MODU_LEN);
			break;
		case INI_MODU_WIFI_PLAT:
			strncpy(auc_mode_var, INI_MODE_VAR_WIFI_PLAT, INI_STR_MODU_LEN);
			break;
		case INI_MODU_BFG_PLAT:
			strncpy(auc_mode_var, INI_MODE_VAR_BFG_PLAT, INI_STR_MODU_LEN);
			break;
		case INI_MODU_PLAT:
		case INI_MODU_HOST_VERSION:
		case INI_MODU_WIFI_MAC:
		case INI_MODU_COEXIST:
			return INI_SUCC;
			break;
		default :
			INI_ERROR("not suport modu type!!!");
			break;
	}

	while(1)
	{
        ret = ini_readline_func(fp, auc_tmp);
        if (INI_FAILED == ret)
        {
            INI_ERROR("have end of .ini file!!!");
            return INI_FAILED;
        }

		if (NULL != strstr(auc_tmp, INI_STR_DEVICE_BFG_PLAT))
		{
			INI_ERROR("not find %s!!!", auc_mode_var);
			return INI_FAILED;
		}

        ret = ini_check_str(fp, auc_tmp, auc_mode_var);
        if (INI_SUCC == ret)
        {
            INI_DEBUG("have found %s", auc_mode_var);
            break;
        }
        else
        {
            continue;
        }
	}

	puc_val = strstr(auc_tmp, "=");
	if (NULL == puc_val)
	{
		INI_ERROR("has not find = in %s", auc_tmp);
		return INI_FAILED;
	}

	strncpy(puc_value, puc_val + 1, size);
	if (0 == strcmp(auc_mode_var, puc_var))
	{
		return INI_SUCC_MODE_VAR;			
	}
	return INI_SUCC;
}
static int32 ini_write_mode_value(INI_FILE *fp, int32 modu, int8 * puc_var, int8 * puc_value)
{
	int32 l_len;
	int32 ret;
	int8 auc_tmp[MAX_READ_LINE_NUM + 1] = {0};
	int8 auc_mode_var[INI_STR_MODU_LEN + 1] = {0};
	int8 *puc_val = NULL;
	int8 auc_change_bin[INI_STR_MODU_LEN * 2 + 1] = {0};
	int8 auc_cmd[INI_STR_MODU_LEN * 4 + 1] = {0};
    int16 search_var_len;

	switch (modu)
	{
		case INI_MODU_WIFI:			 
			strncpy(auc_mode_var, INI_MODE_VAR_WIFI, INI_STR_MODU_LEN);
			if ('0' > puc_value[0] || '2' < puc_value[0])
			{
				INI_ERROR("not support mode!!!");
				return INI_FAILED;
			}
			break;
		case INI_MODU_GNSS:			 
			if ('0' > puc_value[0] || '1' < puc_value[0])
			{
				INI_ERROR("not support mode!!!");
				return INI_FAILED;
			}
			strncpy(auc_mode_var, INI_MODE_VAR_GNSS, INI_STR_MODU_LEN);
			break;
		case INI_MODU_BT:			 
			if ('0' != puc_value[0])
			{
				INI_ERROR("not support mode!!!");
				return INI_FAILED;
			}
			strncpy(auc_mode_var, INI_MODE_VAR_BT, INI_STR_MODU_LEN);
			break;
		case INI_MODU_FM:			 
			if ('0' != puc_value[0])
			{
				INI_ERROR("not support mode!!!");
				return INI_FAILED;
			}
			strncpy(auc_mode_var, INI_MODE_VAR_FM, INI_STR_MODU_LEN);
			break;
		case INI_MODU_WIFI_PLAT:			 
			if ('0' != puc_value[0])
			{
				INI_ERROR("not support mode!!!");
				return INI_FAILED;
			}
			strncpy(auc_mode_var, INI_MODE_VAR_WIFI_PLAT, INI_STR_MODU_LEN);
			break;
		case INI_MODU_BFG_PLAT:			 
			if ('0' != puc_value[0])
			{
				INI_ERROR("not support mode!!!");
				return INI_FAILED;
			}
			strncpy(auc_mode_var, INI_MODE_VAR_BFG_PLAT, INI_STR_MODU_LEN);
			break;
		default :
			INI_ERROR("not suport modu type!!!");
			break;
	}

	while(1)
	{
        ret = ini_readline_func(fp, auc_tmp);
        if (INI_FAILED == ret)
        {
            INI_ERROR("have end of .ini file!!!");
            return INI_FAILED;
        }

		if (NULL != strstr(auc_tmp, INI_STR_WIFI_NORMAL0))
		{
			INI_ERROR("not find %s!!!", auc_mode_var);
			return INI_FAILED;
		}
		
        ret = ini_check_str(fp, auc_tmp, auc_mode_var);
        if (INI_SUCC == ret)
        {
            INI_DEBUG("have found %s", auc_mode_var);
            break;
        }
        else
        {
            continue;
        }
	}

	puc_val = strstr(auc_tmp, "=");
	if (NULL == puc_val)
	{
		INI_ERROR("has not find = in %s", auc_tmp);
		return INI_FAILED;
	}
	if (INI_FAILED == ini_check_value(puc_val + 1))
	{
		INI_ERROR("not support to write :%s:", auc_tmp);
		return INI_FAILED;
	}
	
	l_len = strlen(auc_tmp);
	search_var_len = strlen(puc_var);
    strncpy(&auc_tmp[search_var_len+1], puc_value, 1);

	if (INI_FAILED == fseek(fp, -l_len, SEEK_CUR))
	{
		INI_ERROR("file seek failed!!!");
		return INI_FAILED;
	}
	if (fputs(auc_tmp, fp))
	{
		INI_DEBUG("puc_write_val :%s: ok", auc_tmp);
	}
	
    if (INI_MODU_WIFI == modu)
    {
        if ('0' == puc_value[0])
        {
            strncpy(auc_change_bin, INI_SDIOBIN_NORMAL, INI_STR_MODU_LEN * 2);
        }
        else if ('1' == puc_value[0])
        {
            strncpy(auc_change_bin, INI_SDIOBIN_PERFORMANCE, INI_STR_MODU_LEN * 2);
        }
        else if ('2' == puc_value[0])
        {
            strncpy(auc_change_bin, INI_SDIOBIN_CERTIFY, INI_STR_MODU_LEN * 2);
        }
        else
        {
            INI_ERROR("not support to bin type %s", auc_change_bin);
            return INI_FAILED;
        }
        sprintf(auc_cmd, INI_STR_MODU_LEN * 4,"cp %s %s", auc_change_bin, INI_SDIOBIN_DEFAULT);
        INI_INFO("exct %s", auc_cmd);
        system(auc_cmd);
    }

	return INI_SUCC;
}