in AzureEnhancedMonitor/clib/src/azureperf.c [166:285]
int read_pc_from_file(ap_handler* handler, FILE *fp)
{
int ret = MATCH_FAILED;
perf_counter *pc;
if(handler->len == PERF_COUNT_MAX)
{
handler->err = AP_ERR_PC_BUF_OVERFLOW;
goto EXIT;
}
pc = &handler->buf[handler->len];
ret = read_int(fp, &pc->counter_typer);
if(ret == MATCH_EOF)
{
goto EXIT;
}
if(ret != MATCH_SUCCESS)
{
set_handler_err(handler, AP_ERR_INVALID_COUNTER_TYPE);
goto EXIT;
}
ret = read_str(fp, pc->type_name, TYPE_NAME_MAX);
if(ret != MATCH_SUCCESS)
{
set_handler_err(handler, AP_ERR_INVALID_TYPE_NAME);
goto EXIT;
}
ret = read_str(fp, pc->property_name, PROPERTY_NAME_MAX);
if(ret != MATCH_SUCCESS)
{
set_handler_err(handler, AP_ERR_INVALID_PROPERTY_NAME);
goto EXIT;
}
ret = read_str(fp, pc->instance_name, INSTANCE_NAME_MAX);
if(ret != MATCH_SUCCESS)
{
set_handler_err(handler, AP_ERR_INVALID_INSTANCE_NAME);
goto EXIT;
}
ret = read_int(fp, &pc->is_empty);
if(ret != MATCH_SUCCESS)
{
set_handler_err(handler, AP_ERR_INVALID_IS_EMPTY_FLAG);
goto EXIT;
}
if(!pc->is_empty)
{
switch(pc->counter_typer)
{
case PERF_COUNTER_TYPE_INT:
ret = read_int(fp, &pc->val_int);
break;
case PERF_COUNTER_TYPE_LARGE:
ret = read_int64(fp, &pc->val_large);
break;
case PERF_COUNTER_TYPE_DOUBLE:
ret = read_double(fp, &pc->val_double);
break;
case PERF_COUNTER_TYPE_STRING:
ret = read_str(fp, pc->val_str, STRING_VALUE_MAX);
break;
}
if(ret != MATCH_SUCCESS)
{
set_handler_err(handler, AP_ERR_INVALID_VALUE);
goto EXIT;
}
}
else
{
ret = read_sperator(fp, NON_STRICT_MATCH);
if(ret != MATCH_SUCCESS)
{
set_handler_err(handler, AP_ERR_INVALID_VALUE);
goto EXIT;
}
}
ret = read_str(fp, pc->unit_name, UNIT_NAME_MAX);
if(ret != MATCH_SUCCESS)
{
set_handler_err(handler, AP_ERR_INVALID_UNIT_NAME);
goto EXIT;
}
ret = read_int(fp, &pc->refresh_interval);
if(ret != MATCH_SUCCESS)
{
set_handler_err(handler, AP_ERR_INVALID_REFRESH_INTERVAL);
goto EXIT;
}
ret = read_int64(fp, &pc->timestamp);
if(ret != MATCH_SUCCESS)
{
set_handler_err(handler, AP_ERR_INVALID_TIMESTAMP);
goto EXIT;
}
ret = read_str(fp, pc->machine_name, MACHINE_NAME_MAX);
if(ret != MATCH_SUCCESS)
{
set_handler_err(handler, AP_ERR_INVALID_MACHINE_NAME);
goto EXIT;
}
handler->len++;
//Discard line end if exits.
fscanf(fp, "\n");
EXIT:
return ret;
}